一起重新开始学大数据,走到Linux篇的Day30,说明已经过了最难熬的“从零到一”阶段。前面我们把基础命令、用户权限、文件系统都过了一遍,现在开始真正进入“集群搭建”的实战环节。今天这一篇,我打算把克隆虚拟机之后的四件套一次性讲透:修改IP地址、配置主机名映射关系、打通SSH免密登录、以及把系统启动模式调到最适合跑集群的状态。这几件事在单机环境下你可能觉得无所谓,但一旦涉及三台、五台甚至更多节点,任何一步没做好,后面配Hadoop、配Zookeeper时都会连环踩坑。这篇内容我不讲虚的,全部按我实际搭建集群时的操作顺序来,照着做就能把环境基础打好。1. 克隆后的第一件事:先弄明白为什么要改IP很多初学者拿到克隆好的虚拟机,第一反应是开机,结果发现两台机器IP完全一样,或者网络根本起不来。这种情况几乎每个人都遇到过。先说原理:克隆操作本质上会把源虚拟机的“系统镜像”完整复制一份,包括网卡配置、MAC地址、UUID这些硬件相关的信息。如果两台机器用同一个IP,在同一个局域网里就会冲突,通信直接乱套。我在刚学集群搭建的时候,就是直接克隆完就开机,结果三台机器互相ping不通,排查了半天才发现是三台都占着同一个IP。所以修改IP不是“习惯性操作”,而是克隆后必须做的第一件事。在规划IP之前,先明确一个问题:你打算搭几台节点的集群?我自己的习惯是准备三台,这是搭建分布式环境的最低配置,既能完整演示主节点和从节点的角色分工,又不至于让机器资源吃紧。三台机器的主机名和IP我会按下面的方式规划:节点角色主机名IP地址说明主节点bigdata01192.168.10.101运行主控服务,比如NameNode、ResourceManager从节点1bigdata02192.168.10.102运行DataNode、NodeManager从节点2bigdata03192.168.10.103运行DataNode、NodeManagerIP网段要和你虚拟机的网络模式对应。用VMware或者VirtualBox的话,我建议统一用NAT模式,这个模式下虚拟机能上网,宿主机能访问虚拟机,虚拟机之间也能互通,对学习和开发是最省心的。如果你用的是桥接模式,那IP就得和宿主机处于同一个网段,这个规则稍有不同,但修改IP的思路完全一致。先把规划做好,再动手改,后面配置各种服务时就不会因为IP混乱而白折腾。2. 修改IP地址的完整操作,含UUID这个隐藏大坑2.1 定位网卡配置文件在CentOS 7及以后的主流发行版里,网络配置管理的工具已经换成了NetworkManager,网卡配置文件统一放在/etc/sysconfig/network-scripts/目录下。文件名通常以ifcfg-开头,后面的名字对应网卡名称,比如ifcfg-ens33、ifcfg-eth0。在克隆出来的机器上,先用命令看清楚当前有几块网卡、网卡名称是什么:ip addr这个命令会列出所有网络接口,看输出中带state UP或state DOWN的那个接口,一般就是你实际使用的网卡。然后进目录确认配置文件:ls /etc/sysconfig/network-scripts/你会看到类似ifcfg-ens33这样的文件。用vim打开它,接下来要改的东西都在这里。2.2 必须修改的关键项打开网卡配置文件后,重点关注以下几项配置。每一行都有它的作用,改的时候千万别只动IP地址那一行:TYPE="Ethernet" BOOTPROTO="static" NAME="ens33" DEVICE="ens33" ONBOOT="yes" IPADDR="192.168.10.101" NETMASK="255.255.255.0" GATEWAY="192.168.10.2" DNS1="192.168.10.2"逐项解释一下:BOOTPROTO:改为static表示使用静态IP,克隆出来的机器如果默认是dhcp,一定要改掉,否则每次重启IP都可能变,集群配置就全乱了。ONBOOT:改成yes,确保网卡开机自动启用。我见过很多初学者只改了IP,没改这一项,重启后网络依旧起不来。IPADDR:填你规划好的IP,不同节点填不同的地址。NETMASK:基本都是255.255.255.0,这个不用多说。GATEWAY:网关地址要和虚拟网络编辑器里的NAT网段一致。如果你不确定,去虚拟机的网络设置里看,或者直接查一下当前的网关:ip route | grep default,把输出的地址抄下来填进去就行。DNS1:这里填网关地址通常就能上网,也可以填通用的DNS服务器地址,比如8.8.8.8或者114.114.114.114。2.3 千万注意UUID问题这是克隆后改IP最隐蔽的坑。网卡配置文件里带有一行UUID,这串唯一标识符在克隆时是直接从源机器复制过来的。如果两台机器使用了相同的UUID,即使IP不同,NetworkManager也可能识别错乱,导致网络服务启动失败或者网卡起不来。我自己的处理习惯是:直接注释掉或者删除UUID那一行。# UUID="..."删掉后,系统会在网络服务启动时自动生成一个新的UUID,完全不影响使用。这个操作在真机上不建议随意做,但在克隆机的场景下非常实用,因为克隆机就是靠“消除重复标识”才能保持独立性的。2.4 重启网络并验证配置改完后,重启网络服务让配置生效:systemctl restart network这里有一个小细节:network服务重启之后,用ip addr确认新IP是否生效。如果IP变成了你设置的地址,说明网卡配置没大问题。接着验证网络连通性:ping www.baidu.com能够ping通的话,说明外网正常。再ping一下另外规划好的节点IP(如果那台还没改好IP就先跳过),确认内网也通。这里我特别想提醒一句:改完IP后,当前终端可能会因为IP变化而断开SSH连接,这是正常现象,重新用新IP连上就行。我自己第一次操作时还以为是配置出了问题,吓出一身冷汗,其实只是因为终端还在用旧IP维持连接。3. 添加主机名映射关系,告别死记IP3.1 为什么集群里必须配置映射在Hadoop集群环境里,节点之间通信都是通过主机名互相访问的。比如主节点要向从节点发送任务,如果配置里写的是IP,那每台机器上的配置都要改,IP一变全盘皆输。配置了映射关系之后,所有配置里只需写主机名,系统会自动通过/etc/hosts文件解析成对应的IP地址。这就好比手机联系人,你打电话不需要记号码,直接点名字就行。集群规模越大,这个映射关系带来的便利越明显。3.2 配置hosts文件用vim编辑/etc/hosts文件,把三台机器的映射关系都写进去:vim /etc/hosts在文件末尾追加:192.168.10.101 bigdata01 192.168.10.102 bigdata02 192.168.10.103 bigdata03需要注意的是:这三行要写全。很多人在配置的时候只写其他节点,忘了写本机,虽然不影响大部分场景,但有些服务在解析本机主机名时就会出现异常。我在实际搭Hadoop的时候,曾经就因为hosts里没写本机映射,导致NameNode启动时报主机名解析错误,排查了半天才恍然大悟。配置完成后,验证方法很简单:ping bigdata02如果返回的是192.168.10.102的响应包,说明映射已经生效。不只是当前这台机器,集群里的每一台节点都需要做同样的操作。这时候可以感受到模块化操作的好处:写好一份,批量复制,改个主机名,就完成了三台机器的映射配置。3.3 修改主机名配置映射关系之前,最好先把主机名改好。CentOS 7里修改主机名有几种方法:hostnamectl set-hostname bigdata01这个命令会立即修改系统的主机名,同时持久化到配置文件中,不用再手动改/etc/hostname。改完后执行bash刷新当前终端,你会看到提示符立刻变成了新的主机名。这一步要趁早做,因为后面配置SSH免密、配置Hadoop的时候都会依赖主机名。如果先配好了映射再去改主机名,容易造成配置文件和实际主机名不一致的混乱状态。4. 配置SSH免密登录,原理和实操一次说清4.1 SSH免密的原理,用一句话讲明白SSH免密登录的原理其实就是非对称加密。每台机器生成一对密钥:一个私钥,一个公钥。私钥留在本机,相当于你的身份证;公钥分发到你想免密登录的目标机器上。当你从主机A登录主机B时,B会用存储的公钥来验证A的身份,验证通过就直接放行。这个过程中不需要输入密码,但安全性依然有保障,因为私钥从未离开过本机。在实际集群操作中,最常用的方式是单向信任:从主节点发起的操作最多,所以一般要求主节点能免密登录所有从节点。如果两台从节点之间也需要直接通信,那就把从节点的公钥也互相分发。我的习惯是把三台机器之间都配置成互信,这样后续操作无论从哪个节点发起都不用切换登录方式,省心。4.2 生成密钥对在主节点上执行:ssh-keygen -t rsa执行过程中会提示你设置保存路径和密码,全部直接回车就行,不需要额外设置密码。有的人会纠结要不要设置私钥密码,我明确建议不设。因为如果设了密码,每次使用私钥时系统都会要求输入密码,那免密登录的意义就没了。这个场景是内网开发环境,不涉及公网暴露,私钥本身的安全性靠文件权限和物理隔离来保证就足够了。生成完成后,在~/.ssh/目录下会出现两个文件:id_rsa是私钥,id_rsa.pub是公钥。4.3 分发公钥把公钥分发到目标机器上,用ssh-copy-id命令是最省事的:ssh-copy-id bigdata02 ssh-copy-id bigdata03执行过程中会提示输入目标机器root用户的密码,输入一次后,公钥就会自动添加到目标机器的~/.ssh/authorized_keys文件中。这个命令之所以好用,是因为它把“创建目录、写入公钥、设置权限”这些琐碎步骤全部封装了,减少了手动操作的出错概率。如果没有ssh-copy-id命令,也可以用传统方式手动完成:cat ~/.ssh/id_rsa.pub | ssh bigdata02 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"这条命令的原理是:通过SSH连接到目标机器,创建.ssh目录(如果不存在),然后追加公钥内容到authorized_keys文件中,最后设置正确的权限。权限这一步是关键,下面的常见问题里会专门讲。4.4 验证免密登录分发完成后,在主节点上执行测试:ssh bigdata02如果直接进入bigdata02的终端且没有要求输入密码,说明免密配置成功。执行exit退回主节点,再测试bigdata03。如果所有节点都测试通过,集群节点间的“信任网络”就建立起来了。后面运行start-dfs.sh、start-yarn.sh这些集群命令时,主节点就能自动远程启动从节点上的守护进程,不会再中途卡在“输入密码”这一步。我在第一次成功配置完免密时,那种顺滑感可以说直接决定了后面学习Hadoop的效率——因为操作的摩擦成本消失了。4.5 从节点之间的互信(可选但推荐)如果后续想在从节点上执行涉及其他节点的操作,就需要把从节点的公钥也分发到其他节点。操作逻辑和上面完全一样,在bigdata02上生成密钥、分发到bigdata01和bigdata03,再在bigdata03上执行同样的操作。这件事说起来简单,但很多人会漏掉,导致后来在某个从节点上执行scp传文件到其他节点时才发现还要输密码,补配置又得中断当前操作。我的建议是一步到位,三台机器之间全部互信,省得日后麻烦。5. 启动模式:到底是图形界面还是命令行,以及开机自启保障5.1 systemd的运行目标是什么这里说的“启动模式”,在CentOS 7及之后的系统中对应的是systemd的运行目标(target)。简单理解,运行目标就是系统启动后进入的状态。最常见的有两个:graphical.target代表图形界面模式,multi-user.target代表纯命令行模式。克隆出来的虚拟机如果带了桌面环境,默认可能就是graphical.target。对跑大数据的服务器来说,图形界面完全没有必要,它白白消耗内存和CPU资源。服务器追求的是稳定和高效,命令行模式才是正确的选择。5.2 查看并设置默认启动模式查看当前默认启动模式:systemctl get-default如果输出的是graphical.target,就把它改成命令行模式:systemctl set-default multi-user.target命令会提示你创建了一个符号链接,指向/usr/lib/systemd/system/multi-user.target,说明设置成功。这个操作不会立刻生效,需要重启系统后才会进入命令行模式。如果你是刚通过图形界面做完基础配置,可以等所有配置都完成后,最后统一重启一次。5.3 确保关键服务开机自启动集群环境中,几个关键服务必须保证开机就自动运行,否则每次机器重启后还得手动去启动,极其影响效率。最重要的是sshd服务,网络通了之后第一件事就是保证它能自启:systemctl enable sshdenable会在系统启动时创建服务的启动链接,实现开机自启。检查一个服务是否已设置开机自启,可以用:systemctl is-enabled sshd如果输出enabled,说明自启已经生效。另外建议把network.service也检查一下,确保它在开机时能正常启动网络,否则一切远程操作都无从谈起:systemctl enable network有经验的同学可能还会主动关闭防火墙,并且设置防火墙开机不自启,避免后续端口访问被拦截:systemctl stop firewalld systemctl disable firewalld这里需要说明一个容易混淆的概念:stop是立即停止,disable是让它在开机时不启动。两个命令最好一起执行,缺一不可。关闭防火墙是学习阶段的常见操作,放到生产环境时就要谨慎对待了,但在自己搭的虚拟机上,先关掉可以少很多排查麻烦。5.4 SELinux的注意事项和防火墙一样,SELinux也是初学集群时容易吃暗亏的地方。建议在配置阶段临时关闭它,方法是修改/etc/selinux/config文件:vim /etc/selinux/config把SELINUX=enforcing改成SELINUX=disabled,然后重启生效。我遇到过的情况是:SSH免密的公钥配置完全正确,但免密登录就是不生效,最后排查发现是SELinux的布尔值设置把sshd访问用户家目录的操作拦了。所以如果你在配置完免密后发现不生效,优先检查SELinux状态。6. 常见问题与排查技巧实录6.1 克隆后网卡起不来,报错“Device not managed”这个问题的典型场景是:开机后ip addr看不到网卡,或者网络服务启动时报错。绝大部分原因是克隆导致的MAC地址和配置文件中的HWADDR不一致,或者NetworkManager对这个网卡的管理状态异常。处理方法是在NetWorkManager层面把网卡设为“由NetworkManager管理”:nmcli device status nmcli device set ens33 managed yes systemctl restart network如果这样还不行,就直接删除网卡配置文件,让NetworkManager自动生成一个新的:rm -rf /etc/sysconfig/network-scripts/ifcfg-ens33 systemctl restart NetworkManager这是最干脆的解决办法,重新配置IP花不了两分钟,但能根治克隆导致的配置脏数据问题。6.2 SSH免密登录还是提示输密码这种问题99%的出在权限上。~/.ssh目录的权限必须是700,authorized_keys文件的权限必须是600,如果权限过于开放,sshd出于安全策略会直接忽略这个公钥文件。修复方法:chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys还有一种情况是公钥配置到了错误的用户目录下。比如你当前是用root登录的,但ssh-copy-id时指定了其他用户,公钥就会被写到那个用户的家目录,再用root登录时自然完全不生效。逐一排查这两点,基本都能解决。6.3 修改IP后无法上网先检查网关是否配置正确,再检查DNS。用ping 114.114.114.114这种纯IP地址的方式可以判断是DNS问题还是网络不通。如果IP能ping通但域名ping不通,那就是DNS配置有误。另外,NAT模式的虚拟机需要确保虚拟网络编辑器中NAT网段的网关地址和配置文件中GATEWAY一致,这个地址通常是一个小IP,比如.2或者.1,别和虚拟机自己的IP混淆。6.4 主机名映射不生效映射不生效优先确认/etc/hosts文件的格式,IP后面至少要有一个空格或Tab,然后跟上主机名,不要有多余字符。其次确认当前会话是否还在使用旧的主机名缓存,执行hostname命令查看当前值,必要时重新登录终端。还有一种隐蔽情况:某些服务默认优先使用DNS解析而不是hosts文件,在/etc/nsswitch.conf中确认hosts字段包含files选项,例如hosts: files dns,这样就会优先读取本地hosts文件。7. 验证集群基础环境的最终步骤到这里,基础的网络配置、映射关系、SSH免密、启动模式就都配置完了。最后按我的习惯,把一套完整的验证流程走一遍,确认整个环境是健康的:# 在bigdata01上(主节点),依次执行以下命令 # 1. 验证主机名 hostname # 2. 验证IP和网卡状态 ip addr show # 3. 验证hosts映射 ping -c 1 bigdata02 ping -c 1 bigdata03 # 4. 验证SSH免密 ssh bigdata02 "hostname" ssh bigdata03 "hostname" # 5. 验证网络外网连通 ping -c 1 www.baidu.com # 6. 查看当前启动目标 systemctl get-default如果每一条命令的输出都符合预期,那说明克隆虚拟机后的基础配置已经完全到位,可以放心进入下一步的大数据组件安装与配置环节。我个人在实际操作中的体会是,这一天的内容虽然看起来都是“小操作”,但它们是整个集群环境的“地基工程”。很多人在后面配置Hadoop时遇到的各种奇怪问题,溯源到根子上,往往就是hosts映射少写了一行,或者SSH权限不对导致主节点无法管理从节点。这些坑我基本都踩过一遍,所以特别把排查思路也整理了出来。建议你在一台机器上完整操作一遍后,把剩余节点按同样流程搞定,然后花几分钟跑一遍上面的验证命令,确认无误再往下走。这个习惯能帮你在大数据学习的路上省掉大量的排错时间。
一起重新开始学大数据,走到Linux篇的Day30,说明已经过了最难熬的“从零到一”阶段。前面我们把基础命令、用户权限、文件系统都过了一遍,现在开始真正进入“集群搭建”的实战环节。今天这一篇,我打算把克隆虚拟机之后的四件套一次性讲透:修改IP地址、配置主机名映射关系、打通SSH免密登录、以及把系统启动模式调到最适合跑集群的状态。这几件事在单机环境下你可能觉得无所谓,但一旦涉及三台、五台甚至更多节点,任何一步没做好,后面配Hadoop、配Zookeeper时都会连环踩坑。这篇内容我不讲虚的,全部按我实际搭建集群时的操作顺序来,照着做就能把环境基础打好。1. 克隆后的第一件事:先弄明白为什么要改IP很多初学者拿到克隆好的虚拟机,第一反应是开机,结果发现两台机器IP完全一样,或者网络根本起不来。这种情况几乎每个人都遇到过。先说原理:克隆操作本质上会把源虚拟机的“系统镜像”完整复制一份,包括网卡配置、MAC地址、UUID这些硬件相关的信息。如果两台机器用同一个IP,在同一个局域网里就会冲突,通信直接乱套。我在刚学集群搭建的时候,就是直接克隆完就开机,结果三台机器互相ping不通,排查了半天才发现是三台都占着同一个IP。所以修改IP不是“习惯性操作”,而是克隆后必须做的第一件事。在规划IP之前,先明确一个问题:你打算搭几台节点的集群?我自己的习惯是准备三台,这是搭建分布式环境的最低配置,既能完整演示主节点和从节点的角色分工,又不至于让机器资源吃紧。三台机器的主机名和IP我会按下面的方式规划:节点角色主机名IP地址说明主节点bigdata01192.168.10.101运行主控服务,比如NameNode、ResourceManager从节点1bigdata02192.168.10.102运行DataNode、NodeManager从节点2bigdata03192.168.10.103运行DataNode、NodeManagerIP网段要和你虚拟机的网络模式对应。用VMware或者VirtualBox的话,我建议统一用NAT模式,这个模式下虚拟机能上网,宿主机能访问虚拟机,虚拟机之间也能互通,对学习和开发是最省心的。如果你用的是桥接模式,那IP就得和宿主机处于同一个网段,这个规则稍有不同,但修改IP的思路完全一致。先把规划做好,再动手改,后面配置各种服务时就不会因为IP混乱而白折腾。2. 修改IP地址的完整操作,含UUID这个隐藏大坑2.1 定位网卡配置文件在CentOS 7及以后的主流发行版里,网络配置管理的工具已经换成了NetworkManager,网卡配置文件统一放在/etc/sysconfig/network-scripts/目录下。文件名通常以ifcfg-开头,后面的名字对应网卡名称,比如ifcfg-ens33、ifcfg-eth0。在克隆出来的机器上,先用命令看清楚当前有几块网卡、网卡名称是什么:ip addr这个命令会列出所有网络接口,看输出中带state UP或state DOWN的那个接口,一般就是你实际使用的网卡。然后进目录确认配置文件:ls /etc/sysconfig/network-scripts/你会看到类似ifcfg-ens33这样的文件。用vim打开它,接下来要改的东西都在这里。2.2 必须修改的关键项打开网卡配置文件后,重点关注以下几项配置。每一行都有它的作用,改的时候千万别只动IP地址那一行:TYPE="Ethernet" BOOTPROTO="static" NAME="ens33" DEVICE="ens33" ONBOOT="yes" IPADDR="192.168.10.101" NETMASK="255.255.255.0" GATEWAY="192.168.10.2" DNS1="192.168.10.2"逐项解释一下:BOOTPROTO:改为static表示使用静态IP,克隆出来的机器如果默认是dhcp,一定要改掉,否则每次重启IP都可能变,集群配置就全乱了。ONBOOT:改成yes,确保网卡开机自动启用。我见过很多初学者只改了IP,没改这一项,重启后网络依旧起不来。IPADDR:填你规划好的IP,不同节点填不同的地址。NETMASK:基本都是255.255.255.0,这个不用多说。GATEWAY:网关地址要和虚拟网络编辑器里的NAT网段一致。如果你不确定,去虚拟机的网络设置里看,或者直接查一下当前的网关:ip route | grep default,把输出的地址抄下来填进去就行。DNS1:这里填网关地址通常就能上网,也可以填通用的DNS服务器地址,比如8.8.8.8或者114.114.114.114。2.3 千万注意UUID问题这是克隆后改IP最隐蔽的坑。网卡配置文件里带有一行UUID,这串唯一标识符在克隆时是直接从源机器复制过来的。如果两台机器使用了相同的UUID,即使IP不同,NetworkManager也可能识别错乱,导致网络服务启动失败或者网卡起不来。我自己的处理习惯是:直接注释掉或者删除UUID那一行。# UUID="..."删掉后,系统会在网络服务启动时自动生成一个新的UUID,完全不影响使用。这个操作在真机上不建议随意做,但在克隆机的场景下非常实用,因为克隆机就是靠“消除重复标识”才能保持独立性的。2.4 重启网络并验证配置改完后,重启网络服务让配置生效:systemctl restart network这里有一个小细节:network服务重启之后,用ip addr确认新IP是否生效。如果IP变成了你设置的地址,说明网卡配置没大问题。接着验证网络连通性:ping www.baidu.com能够ping通的话,说明外网正常。再ping一下另外规划好的节点IP(如果那台还没改好IP就先跳过),确认内网也通。这里我特别想提醒一句:改完IP后,当前终端可能会因为IP变化而断开SSH连接,这是正常现象,重新用新IP连上就行。我自己第一次操作时还以为是配置出了问题,吓出一身冷汗,其实只是因为终端还在用旧IP维持连接。3. 添加主机名映射关系,告别死记IP3.1 为什么集群里必须配置映射在Hadoop集群环境里,节点之间通信都是通过主机名互相访问的。比如主节点要向从节点发送任务,如果配置里写的是IP,那每台机器上的配置都要改,IP一变全盘皆输。配置了映射关系之后,所有配置里只需写主机名,系统会自动通过/etc/hosts文件解析成对应的IP地址。这就好比手机联系人,你打电话不需要记号码,直接点名字就行。集群规模越大,这个映射关系带来的便利越明显。3.2 配置hosts文件用vim编辑/etc/hosts文件,把三台机器的映射关系都写进去:vim /etc/hosts在文件末尾追加:192.168.10.101 bigdata01 192.168.10.102 bigdata02 192.168.10.103 bigdata03需要注意的是:这三行要写全。很多人在配置的时候只写其他节点,忘了写本机,虽然不影响大部分场景,但有些服务在解析本机主机名时就会出现异常。我在实际搭Hadoop的时候,曾经就因为hosts里没写本机映射,导致NameNode启动时报主机名解析错误,排查了半天才恍然大悟。配置完成后,验证方法很简单:ping bigdata02如果返回的是192.168.10.102的响应包,说明映射已经生效。不只是当前这台机器,集群里的每一台节点都需要做同样的操作。这时候可以感受到模块化操作的好处:写好一份,批量复制,改个主机名,就完成了三台机器的映射配置。3.3 修改主机名配置映射关系之前,最好先把主机名改好。CentOS 7里修改主机名有几种方法:hostnamectl set-hostname bigdata01这个命令会立即修改系统的主机名,同时持久化到配置文件中,不用再手动改/etc/hostname。改完后执行bash刷新当前终端,你会看到提示符立刻变成了新的主机名。这一步要趁早做,因为后面配置SSH免密、配置Hadoop的时候都会依赖主机名。如果先配好了映射再去改主机名,容易造成配置文件和实际主机名不一致的混乱状态。4. 配置SSH免密登录,原理和实操一次说清4.1 SSH免密的原理,用一句话讲明白SSH免密登录的原理其实就是非对称加密。每台机器生成一对密钥:一个私钥,一个公钥。私钥留在本机,相当于你的身份证;公钥分发到你想免密登录的目标机器上。当你从主机A登录主机B时,B会用存储的公钥来验证A的身份,验证通过就直接放行。这个过程中不需要输入密码,但安全性依然有保障,因为私钥从未离开过本机。在实际集群操作中,最常用的方式是单向信任:从主节点发起的操作最多,所以一般要求主节点能免密登录所有从节点。如果两台从节点之间也需要直接通信,那就把从节点的公钥也互相分发。我的习惯是把三台机器之间都配置成互信,这样后续操作无论从哪个节点发起都不用切换登录方式,省心。4.2 生成密钥对在主节点上执行:ssh-keygen -t rsa执行过程中会提示你设置保存路径和密码,全部直接回车就行,不需要额外设置密码。有的人会纠结要不要设置私钥密码,我明确建议不设。因为如果设了密码,每次使用私钥时系统都会要求输入密码,那免密登录的意义就没了。这个场景是内网开发环境,不涉及公网暴露,私钥本身的安全性靠文件权限和物理隔离来保证就足够了。生成完成后,在~/.ssh/目录下会出现两个文件:id_rsa是私钥,id_rsa.pub是公钥。4.3 分发公钥把公钥分发到目标机器上,用ssh-copy-id命令是最省事的:ssh-copy-id bigdata02 ssh-copy-id bigdata03执行过程中会提示输入目标机器root用户的密码,输入一次后,公钥就会自动添加到目标机器的~/.ssh/authorized_keys文件中。这个命令之所以好用,是因为它把“创建目录、写入公钥、设置权限”这些琐碎步骤全部封装了,减少了手动操作的出错概率。如果没有ssh-copy-id命令,也可以用传统方式手动完成:cat ~/.ssh/id_rsa.pub | ssh bigdata02 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"这条命令的原理是:通过SSH连接到目标机器,创建.ssh目录(如果不存在),然后追加公钥内容到authorized_keys文件中,最后设置正确的权限。权限这一步是关键,下面的常见问题里会专门讲。4.4 验证免密登录分发完成后,在主节点上执行测试:ssh bigdata02如果直接进入bigdata02的终端且没有要求输入密码,说明免密配置成功。执行exit退回主节点,再测试bigdata03。如果所有节点都测试通过,集群节点间的“信任网络”就建立起来了。后面运行start-dfs.sh、start-yarn.sh这些集群命令时,主节点就能自动远程启动从节点上的守护进程,不会再中途卡在“输入密码”这一步。我在第一次成功配置完免密时,那种顺滑感可以说直接决定了后面学习Hadoop的效率——因为操作的摩擦成本消失了。4.5 从节点之间的互信(可选但推荐)如果后续想在从节点上执行涉及其他节点的操作,就需要把从节点的公钥也分发到其他节点。操作逻辑和上面完全一样,在bigdata02上生成密钥、分发到bigdata01和bigdata03,再在bigdata03上执行同样的操作。这件事说起来简单,但很多人会漏掉,导致后来在某个从节点上执行scp传文件到其他节点时才发现还要输密码,补配置又得中断当前操作。我的建议是一步到位,三台机器之间全部互信,省得日后麻烦。5. 启动模式:到底是图形界面还是命令行,以及开机自启保障5.1 systemd的运行目标是什么这里说的“启动模式”,在CentOS 7及之后的系统中对应的是systemd的运行目标(target)。简单理解,运行目标就是系统启动后进入的状态。最常见的有两个:graphical.target代表图形界面模式,multi-user.target代表纯命令行模式。克隆出来的虚拟机如果带了桌面环境,默认可能就是graphical.target。对跑大数据的服务器来说,图形界面完全没有必要,它白白消耗内存和CPU资源。服务器追求的是稳定和高效,命令行模式才是正确的选择。5.2 查看并设置默认启动模式查看当前默认启动模式:systemctl get-default如果输出的是graphical.target,就把它改成命令行模式:systemctl set-default multi-user.target命令会提示你创建了一个符号链接,指向/usr/lib/systemd/system/multi-user.target,说明设置成功。这个操作不会立刻生效,需要重启系统后才会进入命令行模式。如果你是刚通过图形界面做完基础配置,可以等所有配置都完成后,最后统一重启一次。5.3 确保关键服务开机自启动集群环境中,几个关键服务必须保证开机就自动运行,否则每次机器重启后还得手动去启动,极其影响效率。最重要的是sshd服务,网络通了之后第一件事就是保证它能自启:systemctl enable sshdenable会在系统启动时创建服务的启动链接,实现开机自启。检查一个服务是否已设置开机自启,可以用:systemctl is-enabled sshd如果输出enabled,说明自启已经生效。另外建议把network.service也检查一下,确保它在开机时能正常启动网络,否则一切远程操作都无从谈起:systemctl enable network有经验的同学可能还会主动关闭防火墙,并且设置防火墙开机不自启,避免后续端口访问被拦截:systemctl stop firewalld systemctl disable firewalld这里需要说明一个容易混淆的概念:stop是立即停止,disable是让它在开机时不启动。两个命令最好一起执行,缺一不可。关闭防火墙是学习阶段的常见操作,放到生产环境时就要谨慎对待了,但在自己搭的虚拟机上,先关掉可以少很多排查麻烦。5.4 SELinux的注意事项和防火墙一样,SELinux也是初学集群时容易吃暗亏的地方。建议在配置阶段临时关闭它,方法是修改/etc/selinux/config文件:vim /etc/selinux/config把SELINUX=enforcing改成SELINUX=disabled,然后重启生效。我遇到过的情况是:SSH免密的公钥配置完全正确,但免密登录就是不生效,最后排查发现是SELinux的布尔值设置把sshd访问用户家目录的操作拦了。所以如果你在配置完免密后发现不生效,优先检查SELinux状态。6. 常见问题与排查技巧实录6.1 克隆后网卡起不来,报错“Device not managed”这个问题的典型场景是:开机后ip addr看不到网卡,或者网络服务启动时报错。绝大部分原因是克隆导致的MAC地址和配置文件中的HWADDR不一致,或者NetworkManager对这个网卡的管理状态异常。处理方法是在NetWorkManager层面把网卡设为“由NetworkManager管理”:nmcli device status nmcli device set ens33 managed yes systemctl restart network如果这样还不行,就直接删除网卡配置文件,让NetworkManager自动生成一个新的:rm -rf /etc/sysconfig/network-scripts/ifcfg-ens33 systemctl restart NetworkManager这是最干脆的解决办法,重新配置IP花不了两分钟,但能根治克隆导致的配置脏数据问题。6.2 SSH免密登录还是提示输密码这种问题99%的出在权限上。~/.ssh目录的权限必须是700,authorized_keys文件的权限必须是600,如果权限过于开放,sshd出于安全策略会直接忽略这个公钥文件。修复方法:chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys还有一种情况是公钥配置到了错误的用户目录下。比如你当前是用root登录的,但ssh-copy-id时指定了其他用户,公钥就会被写到那个用户的家目录,再用root登录时自然完全不生效。逐一排查这两点,基本都能解决。6.3 修改IP后无法上网先检查网关是否配置正确,再检查DNS。用ping 114.114.114.114这种纯IP地址的方式可以判断是DNS问题还是网络不通。如果IP能ping通但域名ping不通,那就是DNS配置有误。另外,NAT模式的虚拟机需要确保虚拟网络编辑器中NAT网段的网关地址和配置文件中GATEWAY一致,这个地址通常是一个小IP,比如.2或者.1,别和虚拟机自己的IP混淆。6.4 主机名映射不生效映射不生效优先确认/etc/hosts文件的格式,IP后面至少要有一个空格或Tab,然后跟上主机名,不要有多余字符。其次确认当前会话是否还在使用旧的主机名缓存,执行hostname命令查看当前值,必要时重新登录终端。还有一种隐蔽情况:某些服务默认优先使用DNS解析而不是hosts文件,在/etc/nsswitch.conf中确认hosts字段包含files选项,例如hosts: files dns,这样就会优先读取本地hosts文件。7. 验证集群基础环境的最终步骤到这里,基础的网络配置、映射关系、SSH免密、启动模式就都配置完了。最后按我的习惯,把一套完整的验证流程走一遍,确认整个环境是健康的:# 在bigdata01上(主节点),依次执行以下命令 # 1. 验证主机名 hostname # 2. 验证IP和网卡状态 ip addr show # 3. 验证hosts映射 ping -c 1 bigdata02 ping -c 1 bigdata03 # 4. 验证SSH免密 ssh bigdata02 "hostname" ssh bigdata03 "hostname" # 5. 验证网络外网连通 ping -c 1 www.baidu.com # 6. 查看当前启动目标 systemctl get-default如果每一条命令的输出都符合预期,那说明克隆虚拟机后的基础配置已经完全到位,可以放心进入下一步的大数据组件安装与配置环节。我个人在实际操作中的体会是,这一天的内容虽然看起来都是“小操作”,但它们是整个集群环境的“地基工程”。很多人在后面配置Hadoop时遇到的各种奇怪问题,溯源到根子上,往往就是hosts映射少写了一行,或者SSH权限不对导致主节点无法管理从节点。这些坑我基本都踩过一遍,所以特别把排查思路也整理了出来。建议你在一台机器上完整操作一遍后,把剩余节点按同样流程搞定,然后花几分钟跑一遍上面的验证命令,确认无误再往下走。这个习惯能帮你在大数据学习的路上省掉大量的排错时间。