Hadoop集群搭建实战:从单机到多节点部署与避坑指南

发布时间:2026/10/15 9:08:35
Hadoop集群搭建实战:从单机到多节点部署与避坑指南 1. 为什么单机跑得好好的一上集群就各种报错很多人第一次接触Hadoop都是在单台机器上装个伪分布式跑个WordCount看到结果输出就觉得自己会了。然后领导说咱们搭个真集群吧三台机器一摆配置文件一改启动脚本一敲接下来就是无尽的报错——NameNode起不来、DataNode连不上、ResourceManager拒绝连接、节点列表里少了一台……折腾两天集群还是半死不活。这个场景我见过太多次了。问题不在于Hadoop本身有多难而在于单机模式和集群模式之间存在一道隐形的鸿沟网络通信、主机名解析、SSH互信、目录权限、配置文件的一致性这些东西在单机上要么不存在要么被自动处理了一到集群环境全部暴露出来。而大多数教程只告诉你改这个文件、填那个IP却不告诉你为什么要这么做一旦环境稍有不同你就不知道该怎么排查。这篇内容面向的是有一定Linux基础、准备在真实多节点环境上搭建Hadoop集群的开发者或运维人员。我会从集群规划开始把每一步的操作意图、参数含义、容易踩的坑都讲清楚。你跟着走一遍应该能搭出一个稳定可用的Hadoop集群更重要的是下次遇到类似问题你知道该往哪个方向查。提示本文基于Hadoop 3.x版本编写具体操作在主流Linux发行版上均可复现。不同发行版的包管理命令略有差异我会在涉及的地方标注出来。2. 集群规划三台机器怎么分配角色才合理2.1 节点角色划分的基本逻辑Hadoop集群的核心角色分为两类主节点Master和从节点Slave。主节点上跑的是NameNode管理HDFS元数据和ResourceManager管理YARN资源调度从节点上跑的是DataNode存实际数据和NodeManager执行计算任务。最小的可用集群需要几台机器理论上两台就够——一台主一台从。但实际生产中三台是最低推荐配置原因有两个一是主节点上的NameNode和ResourceManager对内存消耗较大分开部署会更稳二是三副本存储策略下三台机器刚好能保证每个数据块有三个副本分布在不同节点上。我建议的规划方案是这样的主机名IP示例角色分配建议内存master192.168.1.100NameNode, ResourceManager, SecondaryNameNode4GBslave1192.168.1.101DataNode, NodeManager2GBslave2192.168.1.102DataNode, NodeManager2GBSecondaryNameNode放在master上是因为它本身不承担太多计算压力主要工作是定期合并fsimage和edits文件对内存要求不高。如果机器充裕把它单独放一台更好但三台机器的场景下没必要。2.2 主机名和IP映射别小看这一步Hadoop节点之间通信大量依赖主机名而不是IP。如果你在配置文件里写IP短期能跑但后期扩容或迁移时会非常痛苦。所以第一步就是把主机名规划好并且在每台机器的/etc/hosts文件里做好映射。三台机器分别执行# 设置主机名以master为例 hostnamectl set-hostname master # 编辑hosts文件 vim /etc/hosts在每台机器的/etc/hosts中加入以下内容三台机器保持一致192.168.1.100 master 192.168.1.101 slave1 192.168.1.102 slave2改完之后用ping master、ping slave1验证一下确保三台机器之间都能通过主机名互相ping通。这一步看起来简单但我踩过的坑是改了主机名但没重启网络服务导致hostname命令显示新名字但系统实际解析还是旧名字。稳妥的做法是改完后执行systemctl restart networkCentOS系或systemctl restart systemd-networkdUbuntu系然后重新登录终端确认。2.3 时间同步一个容易被忽略的隐形杀手Hadoop集群对时间敏感度很高。如果节点之间时间差超过默认的30秒DataNode会被NameNode拒绝连接日志里报Clock skew相关的错误。虚拟机环境尤其容易出这个问题——挂起再恢复后时间就偏了。最省事的方案是配置NTP同步。以master作为时间服务器slave节点从master同步# 在master上安装并启动NTP服务 yum install -y ntp # CentOS # 或 apt install -y ntp # Ubuntu systemctl start ntpd systemctl enable ntpd # 在slave节点上同步master的时间 ntpdate master如果环境不允许搭NTP服务至少写个定时任务每隔几分钟同步一次。别等到集群跑了一周突然挂掉才想起来查时间。3. 环境准备JDK、SSH互信和防火墙处理3.1 JDK安装版本选择有讲究Hadoop 3.x要求JDK 8或JDK 11。我建议用JDK 8兼容性最好社区里绝大多数问题都是基于JDK 8解决的。JDK 11虽然也支持但某些Hadoop组件在JDK 11下会有模块化相关的警告新手容易被吓到。三台机器都要装JDK步骤一致# 下载JDK 8以某开源发行版为例 tar -zxvf jdk-8uXXX-linux-x64.tar.gz -C /usr/local/ mv /usr/local/jdk1.8.0_XXX /usr/local/java # 配置环境变量 vim /etc/profile在/etc/profile末尾添加export JAVA_HOME/usr/local/java export PATH$JAVA_HOME/bin:$PATH export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar执行source /etc/profile生效然后用java -version验证。三台机器都要做别偷懒只做一台。注意JAVA_HOME的路径一定要记清楚后面配置Hadoop的时候要反复用到。如果路径写错Hadoop启动时会报JAVA_HOME is not set或者更隐蔽的类加载错误。3.2 SSH免密登录Hadoop启动脚本的硬性依赖Hadoop的启动脚本start-dfs.sh、start-yarn.sh需要在master上通过SSH免密登录到所有节点去启动对应的守护进程。如果没配免密每启动一次集群就要输好几次密码自动化脚本根本没法跑。配置步骤# 在master上生成密钥对 ssh-keygen -t rsa # 一路回车不设密码 # 把公钥复制到本机和所有slave节点 ssh-copy-id master ssh-copy-id slave1 ssh-copy-id slave2完成后用ssh slave1测试如果能不输密码直接登录就说明配置成功。这里有个细节第一次SSH连接会提示确认主机指纹需要输入yes。如果你在脚本里自动执行这个交互会卡住。解决办法是提前在~/.ssh/config里加上StrictHostKeyChecking no或者手动先连一遍把指纹存下来。另外slave节点之间也需要互相免密吗严格来说如果你只在master上启动集群slave之间不需要。但实际运维中经常需要从任意节点跳转到其他节点排查问题所以我建议所有节点之间都配好双向免密省得后面麻烦。3.3 防火墙和SELinux该关就关别犹豫Hadoop集群内部通信会用到大量端口——NameNode的8020、9870DataNode的9866ResourceManager的8032、8088等等。如果防火墙开着这些端口默认都是被封的节点之间根本连不上。测试环境最省事的做法是直接关掉防火墙和SELinux# 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 关闭SELinux临时 setenforce 0 # 永久关闭SELinux vim /etc/selinux/config # 把 SELINUXenforcing 改为 SELINUXdisabled生产环境当然不能这么粗暴需要按端口逐个放行。但如果你是在自己的实验环境里搭集群先把防火墙关了能排除掉一大类连不上的问题。等集群跑通了再回头研究需要开放哪些端口。4. Hadoop安装与核心配置文件的逐项拆解4.1 安装包解压与目录规划把Hadoop安装包解压到/usr/local/下重命名为hadooptar -zxvf hadoop-3.x.x.tar.gz -C /usr/local/ mv /usr/local/hadoop-3.x.x /usr/local/hadoop接下来配置Hadoop的环境变量在/etc/profile中追加export HADOOP_HOME/usr/local/hadoop export PATH$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export HADOOP_CONF_DIR$HADOOP_HOME/etc/hadoopHADOOP_CONF_DIR这个变量很多人不配但某些工具和脚本会依赖它来定位配置文件配上没坏处。4.2 需要改动的配置文件清单Hadoop的配置文件都在$HADOOP_HOME/etc/hadoop/目录下。需要修改的有以下几个hadoop-env.sh指定JAVA_HOMEcore-site.xml核心配置指定HDFS的默认文件系统和临时目录hdfs-site.xmlHDFS相关配置副本数、NameNode和DataNode的数据目录mapred-site.xmlMapReduce运行框架指定yarn-site.xmlYARN相关配置workers指定所有从节点的主机名下面逐个拆解。4.3 core-site.xml集群的身份证configuration property namefs.defaultFS/name valuehdfs://master:8020/value /property property namehadoop.tmp.dir/name value/usr/local/hadoop/tmp/value /property /configurationfs.defaultFS告诉客户端默认的HDFS入口在哪写的是master的主机名和NameNode的RPC端口。8020是Hadoop 3.x的默认端口Hadoop 2.x用的是9000别搞混了。hadoop.tmp.dir是Hadoop的临时目录很多运行时产生的文件都放这里。这个目录一定要手动创建Hadoop不会自动帮你建。而且不要用/tmp因为系统重启时/tmp可能被清空导致集群数据丢失。4.4 hdfs-site.xml副本数和数据目录configuration property namedfs.replication/name value3/value /property property namedfs.namenode.name.dir/name value/usr/local/hadoop/data/namenode/value /property property namedfs.datanode.data.dir/name value/usr/local/hadoop/data/datanode/value /property property namedfs.namenode.secondary.http-address/name valuemaster:9868/value /property /configurationdfs.replication设为3表示每个数据块存三份。如果你只有两台DataNode设3会导致部分块无法达到副本数NameNode会一直报under-replicated blocks的警告。所以副本数不要超过DataNode的数量。dfs.namenode.name.dir和dfs.datanode.data.dir分别指定NameNode和DataNode的数据存储路径。这些目录也要手动创建并且确保运行Hadoop的用户有写权限。4.5 mapred-site.xml和yarn-site.xml计算框架的配置mapred-site.xmlconfiguration property namemapreduce.framework.name/name valueyarn/value /property property namemapreduce.application.classpath/name value$HADOOP_HOME/share/hadoop/mapreduce/*:$HADOOP_HOME/share/hadoop/mapreduce/lib/*/value /property /configurationmapreduce.framework.name设为yarn表示MapReduce任务跑在YARN上。第二个属性是Hadoop 3.x新增的不配的话跑MapReduce任务时会报ClassNotFoundException。yarn-site.xmlconfiguration property nameyarn.resourcemanager.hostname/name valuemaster/value /property property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property property nameyarn.nodemanager.env-whitelist/name valueJAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME/value /property /configurationyarn.nodemanager.aux-services必须设为mapreduce_shuffle这是MapReduce任务在YARN上运行的必要配置。env-whitelist是Hadoop 3.x的要求不配的话NodeManager可能找不到JAVA_HOME。4.6 workers文件从节点清单workers文件Hadoop 2.x叫slaves里列出所有DataNode和NodeManager所在的主机名slave1 slave2每行一个主机名不要有多余的空格或空行。master本身要不要加进去如果你想让master也作为DataNode参与存储可以加。但一般建议master专注做管理不存数据。4.7 配置文件的分发一致性是关键以上配置文件在master上改好后需要同步到所有slave节点。用scp批量复制scp -r /usr/local/hadoop/etc/hadoop/ slave1:/usr/local/hadoop/etc/hadoop/ scp -r /usr/local/hadoop/etc/hadoop/ slave2:/usr/local/hadoop/etc/hadoop/所有节点的配置文件必须完全一致除了hadoop-env.sh里的JAVA_HOME路径可能因安装位置不同而有差异。配置文件不一致是集群启动失败的最常见原因之一排查起来还很费劲因为日志里的报错往往指向别的地方。5. 格式化与启动顺序错了就白干5.1 NameNode格式化只能做一次在master上执行hdfs namenode -format这个命令会初始化NameNode的元数据目录。看到Storage directory ... has been successfully formatted就说明成功了。注意格式化只能执行一次。如果你格式化了多次会导致NameNode的clusterID和DataNode的clusterID不一致DataNode会拒绝启动。如果确实需要重新格式化必须先把所有节点上的data目录清空再重新格式化。5.2 启动HDFS和YARN# 启动HDFS start-dfs.sh # 启动YARN start-yarn.sh启动脚本会通过SSH到workers文件中列出的节点上启动对应进程。执行完后用jps命令检查各节点的进程master上应该有NameNode、SecondaryNameNode、ResourceManagerslave上应该有DataNode、NodeManager如果某个进程没起来去对应节点的$HADOOP_HOME/logs/目录下看日志日志文件名一般包含进程名和用户名。5.3 Web UI验证最直观的检查方式Hadoop 3.x的Web UI端口和2.x不同别记错了服务端口访问地址HDFS NameNode9870http://master:9870YARN ResourceManager8088http://master:8088SecondaryNameNode9868http://master:9868打开NameNode的页面在DataNodes一栏应该能看到所有slave节点都是In Service状态。如果少了某个节点检查该节点的DataNode日志常见原因是网络不通、防火墙没关、或者clusterID不匹配。6. 踩坑实录那些让我熬夜的报错和排查过程6.1 DataNode启动后立刻退出现象jps看到DataNode进程一闪而过日志里报java.net.BindException: Problem binding to ... 9866或者Directory is not writable。排查思路先看日志里的具体报错。如果是端口被占用用netstat -tlnp | grep 9866查一下谁占用了。如果是目录权限问题检查dfs.datanode.data.dir指定的目录是否存在、当前用户是否有写权限。我遇到过一次是因为之前用root格式化过后来用普通用户启动目录归属不对chown -R改一下就好了。6.2 NameNode和DataNode的clusterID不一致现象DataNode日志报java.io.IOException: Incompatible clusterIDs。原因NameNode格式化多次或者DataNode的data目录是从别的集群拷贝过来的。解决找到NameNode的dfs.namenode.name.dir/current/VERSION文件里面的clusterID值复制出来替换到每个DataNode的dfs.datanode.data.dir/current/VERSION文件中。改完后重启DataNode。6.3 ResourceManager启动后NodeManager连不上现象ResourceManager的Web UI里Active Nodes显示为0。排查先确认NodeManager进程是否在slave上运行。如果进程在但连不上检查yarn-site.xml里yarn.resourcemanager.hostname配置是否正确以及slave节点能否ping通master。还有一个隐蔽的原因master的hostname解析问题。如果master的/etc/hosts里把自己的主机名映射到了127.0.0.1而不是实际IPResourceManager会绑定到回环地址外部节点自然连不上。6.4 启动脚本报Permission denied现象执行start-dfs.sh时提示某节点的SSH连接被拒绝。排查确认免密登录是否配置成功。手动ssh slave1试一下如果需要输密码说明公钥没复制过去。另外检查~/.ssh目录和authorized_keys文件的权限——SSH对权限要求很严格~/.ssh必须是700authorized_keys必须是600权限不对SSH会直接拒绝。7. 集群跑通之后这几件事值得再做一遍集群能启动、Web UI能看到所有节点这只是第一步。要让它稳定运行还有几件事值得花时间做第一配置日志聚合。默认情况下YARN的容器日志散落在各个NodeManager的本地目录里任务失败后想查日志得挨个节点去找。开启日志聚合后日志会统一上传到HDFS上通过ResourceManager的Web UI就能直接查看。在yarn-site.xml中加上yarn.log-aggregation-enable设为true即可。第二设置合理的内存参数。YARN默认给每个NodeManager分配8GB内存和8个vCPU如果你的机器没这么大NodeManager启动时会报Invalid resource request之类的错误。在yarn-site.xml中根据实际硬件配置yarn.nodemanager.resource.memory-mb和yarn.nodemanager.resource.cpu-vcores。第三写一个集群启停脚本。每次手动敲start-dfs.sh和start-yarn.sh太麻烦而且有时候需要按特定顺序启动。写个简单的shell脚本把启动、停止、状态检查都封装进去日常运维会轻松很多。第四定期检查磁盘空间。HDFS的数据目录会随着使用不断增长如果磁盘满了DataNode会进入不健康状态。配个监控或者定时任务在磁盘使用率超过阈值时发告警。我在实际使用中体会最深的一点是Hadoop集群的绝大多数问题都能在日志里找到答案关键是要知道去哪个节点、哪个目录、看哪个日志文件。把日志路径和常见报错的关键词记熟排查效率会高很多。另外配置文件改完后一定要同步到所有节点我因为忘了同步导致集群行为诡异的情况不止一次两次了。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询