一起重新开始学大数据走到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地址那一行TYPEEthernet BOOTPROTOstatic NAMEens33 DEVICEens33 ONBOOTyes IPADDR192.168.10.101 NETMASK255.255.255.0 GATEWAY192.168.10.2 DNS1192.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把SELINUXenforcing改成SELINUXdisabled然后重启生效。我遇到过的情况是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目录的权限必须是700authorized_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权限不对导致主节点无法管理从节点。这些坑我基本都踩过一遍所以特别把排查思路也整理了出来。建议你在一台机器上完整操作一遍后把剩余节点按同样流程搞定然后花几分钟跑一遍上面的验证命令确认无误再往下走。这个习惯能帮你在大数据学习的路上省掉大量的排错时间。
阅读完成 · 觉得有帮助?