Hadoop完全分布式集群部署实战:HDFS与YARN三节点搭建指南

发布时间:2026/10/16 3:29:50
Hadoop完全分布式集群部署实战:HDFS与YARN三节点搭建指南
做了一个多学期物联网架构课程的实验支撑我发现最难带的部分反而不是传感器接入和网关配置而是拿到一批采集数据之后怎么把它们真正存下来、算起来。几乎每个初学者都会卡在同一道坎上Hadoop完全分布式集群到底怎么部署一台机器装个单机版不算数伪分布式也替代不了真实环境只有完全分布式才是生产环境真正在用的形态。这份指导书就是按我自己反复验证过的流程写的照着做就能搭出一套三节点集群跑通HDFS和YARN。这个实验不只是练“烧命令”这么简单。完全分布式集群的部署过程实际上把物联网架构里“海量数据从哪里来、到哪里去、怎么被计算”这条链路彻底串了一遍杂物袋般的传感器数据落到接入层清洗后进HDFS再由YARN调度计算任务。适合谁看我建议两类人重点参考一类是正在上物联网架构课的本科生需要完成课程实验或课设另一类是刚接触大数据、想自己动手搭建集群的自学者。下面内容用到的软件版本较新但配置思路在各发行版之间是通用的步骤可以直接照搬。1. 实验背景与整体思路拆分物联网项目最不缺的就是数据。一个中等规模的环境监测系统每分钟就可能上报几百上千条温湿度、PM2.5、设备状态记录一天下来的数据量是GB级别。数据量小的时候在单机上用数据库处理还行一旦换到几十个GB、几个TB单机存储和计算就成了瓶颈。Hadoop存在的意义就是用一个分布式文件系统和一套分布式计算框架把多台机器变成一台“逻辑大机器”。有了这个前提实验思路就很好定下来了用三台独立的机器虚拟机也行其中一台作为主节点另外两台作为数据节点构成一个真正意义上的完全分布式集群。主节点负责管理文件系统的命名空间、分配计算任务数据节点负责真正存数据、执行计算。这样任何一个数据块都会按配置的副本数复制到不同机器上单台机器出故障不至于全盘皆输。完全分布式和另外两种部署模式的区别不少同学第一次做实验时容易混淆这里简单列一下部署模式进程部署位置看清单机模式所有进程跑在一个JVM里只在做API练习时用不涉及网络伪分布式所有角色进程在一台机器上各自独立JVM数据存储和计算在一台机无法体现真实容错完全分布式主节点和数据节点分散到多台机器生产环境标准形态本次实验目标实验目标拆开看有三层第一层是让机器之间能互通互信也就是网络、主机名解析、SSH免密要通第二层是把Hadoop各个角色正确分布到节点上配置文件的含义要清楚第三层是让集群真正跑起来能看到进程、能访问Web页面、能提交一个MapReduce作业。每一步都踩稳了后面做物联网项目的离线分析和异常检测才有基础。2. 集群规划与实验环境准备这个环节我吃了不少亏。早期带实验时我直接让大家开始装软件结果各种莫名其妙的问题全冒出来有的机器IP变了有的主机名不统一有的虚拟机是从同一个模板克隆出来导致网卡配置冲突。现在我把“先规划、后动手”当成铁律任何一组搭集群必须先提交集群规划表。2.1 节点角色与资源分配按照课程机房的常见配置三节点是最省资源且能讲清楚原理的方案。主节点可以起名master数据节点叫worker1、worker2。角色分配如下节点名运行角色最低参考配置用途建议masterNameNode、ResourceManager、SecondaryNameNode2核CPU、4GB内存、50GB磁盘管理元数据、接收计算任务worker1DataNode、NodeManager2核CPU、2GB内存、40GB磁盘存储数据块、执行计算任务worker2DataNode、NodeManager2核CPU、2GB内存、40GB磁盘存储数据块、执行计算任务如果机器性能充足建议master内存给到8GB因为NameNode的元数据管理比较吃内存。数据节点内存不够时YARN的NodeManager会给自己设置内存上限跑MapReduce作业时可能会有任务队列堆积这点后面排障部分会单独提。2.2 网络拓扑与主机名规划集群内节点之间必须能通过内网IP互通不能用DHCP自动分配的IP因为重启后IP可能漂移。我习惯固定使用192.168.10.x网段规划如下master192.168.10.10worker1192.168.10.11worker2192.168.10.12拿到机器后第一步是修改主机名。Linux发行版不同修改方式略有差异但思路一致。以常见的systemd管理机器为例hostnamectl set-hostname master hostnamectl set-hostname worker1 hostnamectl set-hostname worker2随后在每一台机器的/etc/hosts里写入相同的内容把IP和主机名绑定192.168.10.10 master 192.168.10.11 worker1 192.168.10.12 worker2这一步的目标是让任意节点都能直接按主机名找到对方不需要每次依赖外部DNS服务。集群里的DNS一旦解析不到启动脚本会频繁报出各种“无法解析主机”的错误所以hosts文件是整个实验的第一根支柱。2.3 防火墙处理与时钟同步实验环境下我一般直接把所有节点的防火墙策略调整为放行内网流量或者干脆关闭防火墙并关闭SELinux。并不是说生产环境也这样干而是课程实验的排障时间有限不应该把精力耗在端口放行上。如果在课堂上反复出现“节点连不上”却找不到原因先检查防火墙和SELinux八成是它们挡了路。# 关闭防火墙以systemd常见发行版为例 systemctl stop firewalld systemctl disable firewalld另外还有一个容易被忽略的点所有节点的系统时间必须基本一致。Hadoop在判定心跳和租约时会依赖时间戳时间偏差太大DataNode会时不时的被判定为超时。我的做法是让所有节点指向同一个时间同步服务器或在搭建前手动校准一遍。3. 基础环境配置实操要点集群规划完接下来就是把基础环境铺好。这里的环境包括操作系统设置、Java运行时环境、SSH免密登录。基础环境一旦有一处不干净后面所有配置都会连锁出错。3.1 操作系统准备与必要设置当前主流Hadoop版本对Linux发行版的选择比较宽泛CentOS系、Ubuntu Server都可以。我的建议是选自己最熟悉的发行版不要为了赶新潮去搞太冷门的系统网络排障资料多反而更重要。系统安装完成后先装基础工具比如net-tools、rsync、vim等。很多最小化安装的系统连tar命令都没有或者缺少一些动态链接库装完后先把工具补齐。yum install -y vim net-tools rsync然后检查网络是否通ping -c 2 master ping -c 2 worker1每台机器都要能ping通其他所有节点的主机名才算过了基础网络关。3.2 JDK安装与环境变量配置Hadoop基于Java实现所有节点都需要有JDK。我建议选择JDK8也就是Java 8版本这是目前兼容性最成熟的组合。新版本Hadoop虽然逐步支持更高版本的JDK但实验课追求的是稳不追求尝鲜。安装动作分两步先解压再配环境变量。mkdir -p /opt/software tar -zxvf jdk-8u*-linux-x64.tar.gz -C /opt/software解压完成后编辑/etc/profile文件在末尾追加下面内容注意JAVA_HOME路径要换成自己机器上真实的解压路径。export JAVA_HOME/opt/software/jdk1.8.0_xxx export PATH$JAVA_HOME/bin:$PATH配置完执行source命令生效再用java -version验证。如果三台机器配置路径不一致后面运行start-dfs.sh时会出现主节点能启动但从节点因为找不到Java而静默失败的情况所以要把三个节点的路径统一或者用相对稳定的规范路径来安装比如统一放到/opt/software/jdk8这个目录下。3.3 SSH免密登录配置Hadoop启动脚本会在主节点上通过SSH连接到所有节点远程执行启动进程的命令。如果每次连接都要输密码不但体验差一旦遇到脚本内部的非交互环境任务就直接卡死。所以SSH免密必须提前搞定。在主节点上生成密钥对ssh-keygen -t rsa -P -f ~/.ssh/id_rsa然后把公钥内容追加到所有节点包括master自己的authorized_keys里cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys批量分发的常见做法是用ssh-copy-id我第一次给集群配置时用的是手动scp现在更推荐直接执行ssh-copy-id -i ~/.ssh/id_rsa.pub master ssh-copy-id -i ~/.ssh/id_rsa.pub worker1 ssh-copy-id -i ~/.ssh/id_rsa.pub worker2做完之后从master分别执行ssh master、ssh worker1、ssh worker2应该在完全不需要输密码的情况下登录成功而且能立刻看到命令提示符变成对应主机名。要比这个还多检查一步在master上ssh master也要免密否则执行某些脚本时会因为本机回环验证失败而中断。4. Hadoop核心配置文件逐项解析与同步基础环境干净了接下来就是实验里最需要耐心的一步——配置Hadoop。这一部分最容易出问题的点不是文件写错而是不知道每个配置项到底是干嘛的。这里我把最关键的配置文件逐项拆开讲一遍大家拿着直接抄没问题但建议抄之前花五分钟理解一下。4.1 下载解压与目录规划下载Hadoop稳定版安装包解压到统一目录例如/opt/hadoop/hadoop-3.3.x。我做实验时习惯把数据目录单独规划出来不放在Hadoop解压目录里这样后续清理、升级、备份都比较方便。tar -zxvf hadoop-3.3.x.tar.gz -C /opt/hadoop cd /opt/hadoop/hadoop-3.3.x在规划目录的时候注意有一条铁律默认的临时目录是/tmp系统重启后会被清空NameNode的元数据如果写在/tmp下一场断电就全没了。所以配置里必须把存储目录指到自定义路径比如/data/hadoop/tmp、/data/hadoop/name、/data/hadoop/data。先创建好这些目录并确保Hadoop运行账号有完整的读写权限。4.2 Hadoop环境变量配置把下面内容写入/etc/profile或者写入当前用户的.bashrc文件里。我习惯写到/etc/profile保持一致性和通用性。export HADOOP_HOME/opt/hadoop/hadoop-3.3.x export PATH$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH export HADOOP_CONF_DIR$HADOOP_HOME/etc/hadoop特别提醒一件事除了系统的环境变量还需要修改hadoop-env.sh把JAVA_HOME固定写死。这是因为Hadoop的一些守护进程脚本并不会完整继承用户登录环境直接打开etc/hadoop/hadoop-env.sh找到JAVA_HOME所在行export JAVA_HOME/opt/software/jdk8很多从节点起不来的案例问题就出在这一行没改。4.3 五个核心配置文件逐一展开第一个是core-site.xml它定义集群的入口地址HDFS NameNode位置以及临时文件目录。端口可以按默认的8020也可以用9000关键是所有节点必须一致。configuration property namefs.defaultFS/name valuehdfs://master:8020/value /property property namehadoop.tmp.dir/name value/data/hadoop/tmp/value /property /configuration第二个是hdfs-site.xml它决定NameNode和DataNode的存储路径、副本数量。如果实验只有三节点副本数建议设为2优先保证写入效率和容错留着两个副本不浪费太多磁盘。configuration property namedfs.namenode.name.dir/name value/data/hadoop/name/value /property property namedfs.datanode.data.dir/name value/data/hadoop/data/value /property property namedfs.replication/name value2/value /property property namedfs.namenode.http-address/name valuemaster:9870/value /property /configuration第三个是yarn-site.xml负责计算资源调度。关键配置是ResourceManager跑在哪台机器以及NodeManager的辅助服务需要开成shuffle否则MapReduce作业在shuffle阶段会直接失败。configuration property nameyarn.resourcemanager.hostname/name valuemaster/value /property property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property /configuration第四个是mapred-site.xml指明MapReduce计算框架跑在YARN之上。这个文件在部分新版压缩包中默认不存在需要从模板复制一份再编辑。cp $HADOOP_HOME/etc/hadoop/mapred-site.xml.template $HADOOP_HOME/etc/hadoop/mapred-site.xmlconfiguration property namemapreduce.framework.name/name valueyarn/value /property /configuration第五个是workers文件这个文件在Hadoop 2.x时代叫slavesHadoop 3.x更名为workers。写入所有负责存储和计算的DataNode主机名每行一个worker1 worker2这里有同学会问master不参与数据存储吗生产上可以参与但为了把“主节点管元数据、数据节点管数据”这个角色区分讲清楚实验里我让master只做NameNode和ResourceManager不承担DataNode和NodeManager角色这样代码逻辑更清晰故障面也更小。4.4 配置同步与会前检查所有配置内容以master为准写完然后把下面这几个文件同步到worker1和worker2的相同路径cd $HADOOP_HOME/etc/hadoop scp core-site.xml hdfs-site.xml yarn-site.xml mapred-site.xml workers hadoop-env.sh worker1:$PWD scp core-site.xml hdfs-site.xml yarn-site.xml mapred-site.xml workers hadoop-env.sh worker2:$PWD同步完不要急着启动先在各节点上执行一遍hadoop version确认版本一致再执行hdfs dfsadmin -version看能否连通虽然集群没启动时这步会报连接异常至少能帮我们提前暴露端口是否可用。5. 格式化、启动与结果验证环境配置完成后最激动人心也最容易翻车的一步就是格式化NameNode然后启动集群。这里有一个很多同学会踩的致命坑格式化操作不能重复执行或者说不能在集群已存数据的情况下随便重复执行。5.1 格式化NameNode的正确姿势格式化过程本质上是给NameNode创建一份空白的元数据包括集群ID。执行命令hdfs namenode -format看到输出结束且没有报错格式化就成功了。但下一步启动时如果发现DataNode没有注册上来原因往往是重复格式化导致NameNode的clusterID变了而DataNode的存储目录里还留着旧clusterID两边对不上。解决办法是把所有节点上/data/hadoop/name、/data/hadoop/data目录清空重新格式化一次。这里强调一句格式化是“一次性手术刀”只能在新建集群时做数据要保留的集群绝对不能手痒再格式化一遍。5.2 按顺序启动HDFS与YARN启动分成两步走一步是文件系统一步是计算调度。$HADOOP_HOME/sbin/start-dfs.sh $HADOOP_HOME/sbin/start-yarn.sh推荐的检查顺序是先看日志再看进程最后看Web页面。日志位置默认在$HADOOP_HOME/logs如果NameNode或DataNode没起来先查这里不要瞎猜。然后分别在每台机器上执行jpsmaster上应看到NameNode、SecondaryNameNode、ResourceManagerworker1和worker2上应看到DataNode、NodeManager如果进程数量对不上对照下面第7节的排障表处理。5.3 Web界面验证集群健康Hadoop自带两个常见的Web管理界面直接在内网访问即可HDFS界面http://master:9870YARN界面http://master:8088在HDFS界面可以看到活跃节点数应该是2个DataNode在线Storage容量总和就是集群的存储能力。YARN界面则能看到节点资源总量。如果页面显示0个活跃节点绝大多数情况是DataNode进程没有正确注册需要去查DataNode日志。6. 用MapReduce作业验证集群计算能力集群启动只是万里长征第一步真正证明它能干活的是提交一个分布式计算任务。实验课里最经典的上手任务就是WordCount虽然简单但能把数据上传、分布式调度、结果回读这个闭环打通。6.1 准备测试数据并上传HDFS随便找几条物联网场景的日志文本做测试数据例如设备ID、采集时间、状态字段然后上传到HDFS。先建目录hdfs dfs -mkdir -p /user/exp/input hdfs dfs -mkdir -p /user/exp/output hdfs dfs -put /opt/testdata/iot.log /user/exp/input验证上传hdfs dfs -ls /user/exp/input如果上传报错先检查当前用户对HDFS的写权限。教学环境经常用root操作HDFS的权限体系默认由操作系统用户决定如果是root跑命令需要在HDFS里给/加写权限或创建对应用户这里建议直接用hdfs用户或允许root操作的设置避免权限磨人。6.2 提交WordCount任务并查看结果Hadoop安装包自带示例程序路径在$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar提交命令hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar wordcount /user/exp/input /user/exp/output注意output目录不能存在如果上次跑过要先删掉再重新提交hdfs dfs -rm -r /user/exp/output任务提交后可以看到YARN界面出现一个application状态从RUNNING变为FINISHED。如果卡在ACCEPTED状态不动多半是资源不够比如NodeManager的内存配置过小分配不出容器。查看结果hdfs dfs -cat /user/exp/output/part-r-00000看到统计结果正常输出说明整个完全分布式集群已经具备存储和计算能力。这个时候实验的基础目标就全部完成了。7. 常见问题排查与避坑速查表下面这些坑是我在课堂里被学生们反复问过的每一个都有实际案例。把它们整理成速查表遇到问题不用急着一行行想先对着表看。现象常见原因处理思路jps看不到NameNode格式化失败或name目录被占用清空name目录数据后重新格式化再启动DataNode起不来clusterID不匹配清空所有name和data目录重新格式化重启启动时SSH提示要输密码免密配置没做完整重新执行ssh-copy-id到所有节点能ping通但不能用主机名访问/etc/hosts没写全三台机器的hosts内容必须完全一致作业提交后一直ACCEPTEDNodeManager内存不足调大yarn.nodemanager.resource.memory-mbWeb界面打不开防火墙拦截或端口未监听检查防火墙确认对应端口在监听从节点找不JAVAhadoop-env.sh里没配置JAVA_HOME每台机器的hadoop-env.sh都写死JDK路径重复格式化导致数据节点注册不上集群ID不一致参考DataNode问题的清理流程磁盘空间不足上传数据太多或副本数设置过大清理HDFS文件检查dfs.replication大小除了这个表再说几个教学场景里特别容易忽视的操作习惯。第一个是克隆虚拟机问题如果多个节点是从同一模板克隆出来的一定要检查网卡MAC地址和主机名否则IP会冲突。第二个是目录权限问题如果碰到“Permission denied”但确认网络没问题看看到底是用哪个用户启动的进程HDFS数据目录的属主是不是这个用户。第三个是启动顺序问题先启动HDFS再启动YARN或者干脆用start-all.sh一把梭但出问题时分不清是哪个组件挂掉所以实验课我还是推荐分步启动。还有一点个人体会调试集群最忌讳的是“玄学重启”也就是看到不对就重启所有组件、重新格式化。正确的做法是先看日志日志里写明了绝大部分问题的根因。Hadoop的日志文件都在$HADOOP_HOME/logs下主节点的NameNode日志通常叫hadoop-hadoop-namenode-master.logDataNode日志叫hadoop-hadoop-datanode-worker1.log。看日志不是要一行行读完重点找首尾的Exception和ERROR带着错误关键字去查效率会高很多。8. 实验做完之后还可以扩展什么按照上面的步骤跑通集群已经可以写出一份相当扎实的实验报告。如果还有余力我建议往这几个方向扩展给HDFS配置NameNode高可用加上ZooKeeper做主备切换把离线分析任务换成Spark对比一下Spark和MapReduce在IoT日志统计上的性能表现或者把采集网关的数据直接写入HDFS做一个从设备数据采集到分布式存储的端到端演示。这些扩展方向都能让物联网架构课程设计更完整也会让面试或者答辩时有更多可讲的东西。我在实际教学里见的太多人可能跑通集群就以为万事大吉但恰恰是这些扩展点才能体现对架构的理解程度。毕竟搭集群只是手段能稳定处理物联网海量数据才是物联网架构这门课真正想让人掌握的底层能力。