从零开始部署 Hadoop 2.7.3 集群,听起来像是课本里才会出现的操作,但真到自己动手的时候,环境变量配错一个、格式化后 Datanode 起不来、Yarn 内存参数一改就崩,这些坑我全都踩过。这篇文章就是一份完整的全流程记录,从节点规划到环境变量调优,再到集群启动和问题排查,手把手把每一步的原理和实操讲清楚。如果你正在搭 Hadoop 2.7.3 集群,或者被“环境变量配置错误”这类问题折磨过,这篇内容应该能帮你省下至少一个通宵。
1. 部署前的环境准备与整体规划
1.1 为什么选 Hadoop 2.7.3
很多人会问,现在 Hadoop 都出到 3.x 了,为什么还要部署 2.7.3?说实话,生产新项目我不会用 2.7.3,但在很多存量数据平台、高校实验室和课程设计中,2.7.3 依然是主力版本。它稳定、社区资料多、对硬件要求相对低,和 Hive、HBase、Zookeeper 的兼容性资料也最好找。
另外一个原因是学习价值高。2.7.3 是 Hadoop 2.x 生态的典型代表,把它的部署流程吃透,NameNode、Datanode、ResourceManager、NodeManager 这几个角色的协作机制也就搞明白了。后面再去理解 HA、联邦、3.x 的架构变化,基本是水到渠成的事。
版本选型上建议直接下载官方编译好的hadoop-2.7.3.tar.gz,不要去碰源码自己编译。依赖的 protobuf、Jetty、JSP 版本错一个,编译半天都不一定过。我见过有同学从 GitHub 拉源码,编译到一半卡在 native 库上,最后还是老老实实回去用官方包。
1.2 节点规划:三台虚拟机怎么分
部署集群前最重要的事情是规划角色分配。Hadoop 2.7.3 集群最少需要三台机器:一台跑 NameNode 和 ResourceManager,两台跑 Datanode 和 NodeManager。生产环境会把 NameNode 和 ResourceManager 分开,但学习场景三台足够。
我用的规划如下:
| 主机名 | IP 地址 | 角色 |
|---|---|---|
| hadoop-master | 192.168.56.101 | NameNode + ResourceManager |
| hadoop-slave1 | 192.168.56.102 | Datanode + NodeManager |
| hadoop-slave2 | 192.168.56.103 | Datanode + NodeManager |
系统选的是 CentOS 7.9 最小化安装,内存分配建议 master 给 4G,两个 slave 各给 2G。别觉得内存不够,2.7.3 本身不算吃内存,但 JVM 堆、Yarn 容器、HDFS 缓存都会占,2G 是下限。
主机名建议在安装系统时就规划好,装好之后再改 hostname 也不是不行,但要同步改/etc/hosts、/etc/sysconfig/network,还要重启网络服务,容易出幺蛾子。建议一开始就把主机名固定下来。
1.3 系统初始化:用户、目录、SSH 免密一把梭
Hadoop 官方文档明确说不推荐用 root 跑集群。虽然 root 也能跑,但 HDFS 的 Permission 检查、日志权限、进程管理都会出现怪异行为,尤其是你在做权限实验时,root 会让你完全看不到效果。
我一般是创建hadoop用户,把安装目录和数据目录统一规划好:
useradd hadoop passwd hadoop mkdir -p /opt/hadoop mkdir -p /data/hadoop/tmp mkdir -p /data/hadoop/namenode mkdir -p /data/hadoop/datanode chown -R hadoop:hadoop /opt/hadoop /data/hadoop目录规划这里提前说一下,后面配置core-site.xml和hdfs-site.xml的时候,这些路径要对应写进去。很多人图省事直接让 Hadoop 把数据写在/tmp下面,如果你重启了系统,或者用清理工具清掉了/tmp,整个 HDFS 的数据就会凭空蒸发,NameNode 的 fsimage 也没了,教训很深刻。
SSH 免密从 master 到所有节点都必须配好,不然start-dfs.sh执行到一半卡在输密码的提示上,你不在电脑前的话整个部署就卡死了。配置流程一把梭:
su - hadoop ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa ssh-copy-id hadoop@hadoop-master ssh-copy-id hadoop@hadoop-slave1 ssh-copy-id hadoop@hadoop-slave2 # 验证 ssh hadoop@hadoop-slave1 "hostname"这里有个细节容易被忽略:不仅 master 到 slave 要免密,master 到自己(localhost)也要免密。如果不小心漏了这一步,start-dfs.sh启动本地 NameNode 时会用 ssh 连接本机,然后卡在密码输入上。我当时就在这卡了五分钟,思考人生。
另外,关闭防火墙和 SELinux 在测试环境是必须的。CentOS 7 上用:
systemctl stop firewalld systemctl disable firewalld sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config setenforce 0防火墙不禁用的话,50070 端口你很可能会被 Iptables 拦一道,排查半天还以为服务挂了。生产环境不能关防火墙,但是在测试和学习环境,先把这层麻烦去掉,专心搞部署。
2. 环境变量配置与调优:很多坑都在这一环
2.1 JDK 环境变量:Hadoop 对 JVM 的执念
Hadoop 2.7.3 官方支持和 Java 7,不过实际用 Java 8 也完全没问题。JDK 版本别用 OpenJDK 9 及以上,否则可能出现初始化模块错误。推荐安装 JDK 8,比如jdk-8u211-linux-x64.tar.gz,解压到/usr/local/java。
JDK 的环境变量常规写法是:
cat >> /etc/profile << 'EOF' export JAVA_HOME=/usr/local/java/jdk1.8.0_211 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:$PATH EOF source /etc/profile java -version这里有一个初学者经常踩的坑:将$PATH放在最前面,结果系统原来的命令被新加的命令覆盖,甚至把/usr/bin/ls这种命令的优先级都抢了。正确做法是把新加的 bin 放在$PATH之前,但不要把$PATH丢掉。
2.2 Hadoop 环境变量:Hadoop 官方文档没写全的细节
Hadoop 环境变量的配置点有两个:系统级/etc/profile和 Hadoop 内部的hadoop-env.sh。两个分层配置,作用不同。
系统级配置主要是让 shell 能直接执行hdfs、yarn、mapred命令:
cat >> /etc/profile << 'EOF' export HADOOP_HOME=/opt/hadoop/hadoop-2.7.3 export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop export PATH=${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH EOF source /etc/profile hadoop version大多数教程到这里就结束了,但实际上hadoop-env.sh里还有一个隐藏调优点,就是 JVM 参数。打开/opt/hadoop/hadoop-2.7.3/etc/hadoop/hadoop-env.sh,找到下面的配置:
export HADOOP_HEAPSIZE=1024这个参数控制 NameNode、Datanode 等守护进程的默认堆内存。如果你机器只有 2G,默认是 1024,属于比较安全的值;如果改成 2048,那么两个节点同时开 Datanode 和 NodeManager,内存就会告急,极大概率出现容器起不来、进程被杀的情况。
还有一个经常被人忽略的变量是HADOOP_OPTS。一些特殊的自定义参数可以塞进去,比如:
export HADOOP_OPTS="$HADOOP_OPTS -Dfile.encoding=UTF-8"2.3 环境变量配置错误后的自救流程
环境变量配错是小概率但后果严重的事件。最经典的惨案是:在/etc/profile写错了路径,source之后发现ls、cat、vim全都不好使了,连/bin/ls都找不到,然后整个人就懵了。
这种情况下不要慌,有一个标准的自救流程。
第一层,如果你是 SSH 登录的,不要关闭当前会话,重新开一个终端。新终端会默认加载/etc/profile,如果也是坏的,最坏的情况是连ssh都进不去。我用过的办法是借助物理操作或者让管理员改回/etc/profile。
第二层,如果你还能执行绝对路径命令,比如/usr/bin/ls还能用,用/usr/bin/vim /etc/profile修改回来。这里有个技巧,不要直接写死 PATH,先用一个安全命令导出:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin然后再去修复/etc/profile。这个方法我用了不止一次,尤其是在折腾 Zookeeper、Kafka、Hadoop 环境变量时,分分钟救回系统。
第三层,如果source /etc/profile之后连 Java 都找不到了,多半是JAVA_HOME配置有误,用echo $JAVA_HOME先看是否为空,再逐项排查。养成配置环境变量后先开新会话验证的习惯,能避免 90% 的“配置好了但不生效”问题。
2.4 环境变量调优:不只是 PATH 那么简单
环境变量调优往往是整个集群部署文章里最容易被跳过,但在实际运行中最影响体验的部分。除了 PATH,真正决定你使用效率的是下面这几个:
HADOOP_CONF_DIR:指定配置文件目录。默认在$HADOOP_HOME/etc/hadoop,但在一些封装工具里会被覆盖。建议显式指定,尤其是你要用 Spark On Yarn 的时候,Spark 会读取这个变量找 Yarn 配置。HADOOP_LOG_DIR:默认日志在$HADOOP_HOME/logs,但如果/opt分区满了,日志写不进去,服务直接起不来。建议把日志目录单独放到/data/hadoop/logs。HADOOP_PID_DIR:默认放/tmp,容易被清理掉。PID 文件丢失会导致 stop-dfs.sh 找不到进程,然后出现一收不到停进程信号的情况,建议也改到/data/hadoop/pids。
在hadoop-env.sh里加这些:
export HADOOP_LOG_DIR=/data/hadoop/logs export HADOOP_PID_DIR=/data/hadoop/pids我见过一个线上事故,OOM Killer 把 Datanode 进程杀了,但 PID 文件还在,停止脚本以为 Datanode 活着,一直发信号失败。后来发现 /tmp 被清理重写过,记录和进程已经完全对不上,白白排查了几个小时。数据目录和日志目录独立出系统盘,这件事真的越早做越好。
3. 集群核心配置:每个参数背后的原理
3.1 core-site.xml:集群的“大脑”配置
core-site.xml 是 Hadoop 的全局配置。最核心的两个参数:默认文件系统、临时目录。
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop-master:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/data/hadoop/tmp</value> </property> <property> <name>fs.trash.interval</name> <value>1440</value> </property> </configuration>fs.defaultFS设为hdfs://hadoop-master:9000,这决定了客户端访问 HDFS 的入口。如果你的主机名解析有问题,把 IP 写死为hdfs://192.168.56.101:9000也可以,但后续维护起来不够直观。
hadoop.tmp.dir这个参数特别容易被忽略。它的作用远超“临时目录”这四个字,NameNode 的dfs.name.dir默认值依赖它,Datanode 的dfs.data.dir默认也依赖它。如果 tmp 目录设在系统盘且空间不足,NameNode 的元数据可能直接写满磁盘。改成/data/hadoop/tmp后,HDFS 数据存储和系统分区解耦,安全性大幅提升。
3.2 hdfs-site.xml:副本数、名称节点元数据与数据节点数据目录
hdfs-site.xml 决定了 HDFS 的存储行为。我这套测试环境的配置:
<configuration> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/data/hadoop/namenode</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/data/hadoop/datanode</value> </property> <property> <name>dfs.permissions</name> <value>false</value> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>hadoop-master:50090</value> </property> </configuration>dfs.replication设置为 2,因为集群只有两个 Datanode,设置 3 的话有一个副本会找不到目标机器,造成数据写入阻塞。生产环境有几台 DataNode 就设几,别盲目设大。
dfs.permissions在测试环境建议临时关闭,否则每次put文件都要关心用户权限,还有各种 owner 不一致的问题。生产环境必须保持默认开启,否则安全审计直接报废。
dfs.namenode.secondary.http-address指向 master,如果你配置了 SecondaryNameNode,就要把地址写对,否则 checkpoint 失败,namenode 的 edits log 会越来越大。顺便说一句,SecondaryNameNode 不是备份节点,它只是定期合并 edit log 的辅助节点,千万别把它当成故障切换的救星。
3.3 yarn-site.xml:资源管理器的关键参数计算
Yarn 的配置是整个集群里最容易踩内存坑的地方。配置核心是告诉 NodeManager 每个节点最多给多少个容器、每个容器申请多少内存时不会被拒。我的配置如下:
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>1536</value> </property> <property> <name>yarn.scheduler.maximum-allocation-mb</name> <value>1536</value> </property> <property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>256</value> </property> <property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value> </property> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop-master</value> </property> </configuration>内存参数的计算逻辑:slave 机器是 2G 内存,操作系统本身要留 1G 左右,NodeManager 的 JVM 要占一部分,剩下给容器的就不到 1536MB。虚拟内存检查默认开启,在 2G 内存机器上经常因为虚拟内存超过物理内存而 kill 掉容器,学习环境直接关掉。
如果你要让 Yarn 正常跑起来跑 wordcount,这样配置就够了。但如果跑 Spark On Yarn,这个内存要重新算,执行器内存、Driver 内存、Overhead 加在一起,超过 yarn 的限制就会报错。
3.4 mapred-site.xml:MapReduce 的调度器老搭配
在 Hadoop 2.x 里,MapReduce 跑在 Yarn 上,但必要的配置还是要写。默认没有这个文件,需要从模板复制:
cp $HADOOP_HOME/etc/hadoop/mapred-site.xml.template $HADOOP_HOME/etc/hadoop/mapred-site.xml内容:
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>hadoop-master:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>hadoop-master:19888</value> </property> </configuration>mapreduce.framework.name=yarn是必须的,否则 MapReduce 作业会直接跑在本地模式,根本不会提交到集群。很多同学配置完发现日志里显示Running job locally,就是因为这个参数没配对。
3.5 slaves 文件与 masters 文件:角色声明要精准
在 Hadoop 2.7.3 中,slaves、masters文件决定了启动脚本去哪找对应角色。slaves文件声明 Datanode 和 NodeManager 的主机名:
hadoop-slave1 hadoop-slave2注意:slaves 里不能写 hadoop-master,否则 master 节点也会启动一个 Datanode,这个在测试环境会稀释磁盘占用,在真实环境还可能造成数据副本策略异常。
masters文件声明 SecondaryNameNode 的主机名(不是 NameNode 主机!)。如果不写这个文件,默认 SecondaryNameNode 会和 NameNode 在同一台机器上,这在三节点集群里可以接受,但生产环境分离是好习惯。
3.6 hadoop-env.sh:JAVA_HOME 显式指定别偷懒
hadoop-env.sh里默认的JAVA_HOME是注释状态,很多环境没配置/etc/profile的情况下,Hadoop 就找不到 Java。建议在这个文件里面直接显式指定绝对路径:
export JAVA_HOME=/usr/local/java/jdk1.8.0_211别用export JAVA_HOME=$(readlink -f $(which java) | sed ...)这类的动态推导。虽然这种写法更智能,但不同发行版的路径结构差异很大,推导错了你很难排查。用绝对路径最稳。
4. 集群启动、验证与系统级调优
4.1 NameNode 格式化:小心你的数据目录
在首次启动集群之前,必须格式化 NameNode:
hdfs namenode -format这里有个绝大多数人都遇到过的经典问题:格式化的动作是生成一个空的元数据文件系统镜像到dfs.namenode.name.dir对应的目录。如果你后来改了core-site.xml或hdfs-site.xml的目录,你之前格式化生成的数据和数据目录里 Datanode 的clusterID就对不上了,然后启动 Datanode 时会报Incompatible clusterIDs。
所以一个最关键的忠告:hdfs namenode -format之前,先把 NameNode 和 Datanode 的数据目录都清空一遍,或者至少记住格式化时的目录配置。这个坑我踩了不止一次,尤其是你在搞伪分布式、单节点、集群模式来回切换的时候,配置文件一变就忘了格式化。
格式化输出最后一行看到:
Storage directory /data/hadoop/namenode has been successfully formatted.才算完成。
4.2 启动集群:顺序和方式
启动顺序有讲究,不要直接start-all.sh一锅端。隔离启动的方式方便定位问题:
# 先启动 HDFS start-dfs.sh # 再启动 Yarn start-yarn.sh # 启动历史服务器 mr-jobhistory-daemon.sh start historyserverstart-all.sh在 2.7.3 中依然存在,官方也不推荐,因为会把 HDFS 和 Yarn 绑死。分开启动,如果 HDFS 失败了,Yarn 至少能独活;Yarn 失败时 HDFS 也照常读写。
启动过程你可以看到脚本在尝试通过 SSH 连到 slave1、slave2,只是没有输出过程,如果你 SSH 没有配好,会一直在那里卡着。启动完后,用jps在每台机器上看进程:
- master 上应有
NameNode、SecondaryNameNode、ResourceManager - slave1 和 slave2 上应有
DataNode、NodeManager
如果缺少哪个进程,去$HADOOP_LOG_DIR或/opt/hadoop/hadoop-2.7.3/logs下翻日志,这是定位问题最直接的路径。
4.3 通过 Web UI 和命令行验证集群健康度
进程都起来了,不代表集群是可用的。我习惯从两个面板确认:
- NameNode 界面:
http://hadoop-master:50070(2.7.3 版本) - Yarn 界面:
http://hadoop-master:8088
打开 HDFS 界面后,在“Datanodes”标签里应能看到两个存活节点。如果只有 1 个或 0 个,多半是网络或 clusterID 的问题。看一下每个 Datanode 的容量是否和虚拟磁盘大小接近,这能排除磁盘挂载异常。
其他确认命令:
hdfs dfsadmin -report hdfs dfs -mkdir -p /test hdfs dfs -put /etc/hosts /test/ hdfs dfs -ls /test跑一个简单测试用例验证 Yarn:
cd $HADOOP_HOME/share/hadoop/mapreduce hadoop jar hadoop-mapreduce-examples-2.7.3.jar pi 2 10输出中看到Job Finished successfully和最终估算的 Pi 值,整个集群就基本算通了。
有个细节想单独提一下:提交作业时如果一直卡在Running job状态,先去 Yarn 界面看有没有 Application 在排队,再去看 NodeManager 日志。初学者很容易在这个环节用Ctrl+C终止作业,但实际只是调度队列堵塞,不是集群挂了。
4.4 系统级调优:完成比完美更重要
集群起来以后,还有三个非常关键的 Linux 系统调优点。这几个不配置不会导致失败,但配置之后能大幅减少偶发问题。
第一个是文件句柄限制。NameNode 和 Datanode 在高并发下需要大量打开文件,CentOS 7 默认 1024,非常不够。修改/etc/security/limits.conf:
hadoop soft nofile 65536 hadoop hard nofile 65536 hadoop soft nproc 65536 hadoop hard nproc 65536第二个是禁用 THP(透明大页)。Hadoop 官方文档里都建议关闭,因为 THP 在 Java 高并发分配内存时容易造成卡顿。
echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag第三个是 vm.swappiness。默认 30,对于运行 JVM 的机器来说,太容易把不常用 Page 换出、换入。建议调到 10 以下:
sysctl -w vm.swappiness=10 echo 'vm.swappiness=10' >> /etc/sysctl.conf这三个调优做完了,你的集群才算是“能用”的状态。很多人部署完出现了跑两小时就慢、数据写入频繁抖动的情况,多数不是 Hadoop 本身的问题,而是操作系统的这几个默认值拖了后腿。
5. 常见问题排查与避坑实录
5.1 Datanode 起不来:ClusterID 不匹配
这是集群部署里出现频率最高的故障。现象是 master 和 slave 上jps查看,slave 上没有 DataNode 进程,或者有进程但 web 界面“Live Nodes”只有 1 个。
打开hadoop-hadoop-datanode-xxx.log,核心报错如下:
Incompatible clusterIDs in /data/hadoop/datanode: Datanode clusterID = CID-abc,namenode clusterID = CID-xyz原因就是 NameNode 格式化后生成了新的 clusterID,而 Datanode 没有对应更新。我用的标准解决方式:
# 在问题节点上执行 rm -rf /data/hadoop/datanode/* # 重启这个节点的 datanode hadoop-daemon.sh start datanode这样做 Datanode 会重新向 NameNode 注册自己。虽然暴力,但对测试环境和学习环境是最快的方案。
5.2 50070/8088 端口打不开
另一个高频问题:jps进程都在,Web UI 就是访问不了。先检查进程监听情况:
netstat -tlnp | grep 50070 netstat -tlnp | grep 8088如果监听地址是0.0.0.0,多半是防火墙拦截;如果监听在127.0.0.1,说明配置写死了回环地址,需要检查fs.defaultFS、dfs.namenode.http-address以及/etc/hosts的主机名解析。
很多教程提到改hdfs-site.xml的dfs.namenode.http-address为你自己的局域网 IP,这种方法也能解决问题,但更治本的是确保/etc/hosts中的所有主机名解析到正确的 IP,并且客户端用该主机名而不是 localhost 访问。
5.3 Yarn 容器分配失败或作业卡在 ACCEPTED
作业提交后一直ACCEPTED,说明 ResourceManager 没有把容器调度下去。先看两台 slave 上 NodeManager 的状态:
yarn node -list yarn node -status <nodeId>如果节点状态为 RUNNING,但分配内存不足,多半是你在yarn-site.xml中的yarn.nodemanager.resource.memory-mb配得太大,所有容器加起来的 virtual memory 超过了 NodeManager 的可用值。
日志中的典型提示:
Container is running beyond virtual memory limits对应解法就是我在前面配置里写到的yarn.nodemanager.vmem-check-enabled=false,或者手动调大yarn.nodemanager.vmem-pmem-ratio。学习环境直接关掉检查就好,但生产环境必须按规范比例来。
5.4 伪分布式切换全分布式时极易翻车
互联网上大量教程是“伪分布式”搭建,你在伪分布式上搭好了目录结构,换到全分布式时最容易出现的错位是:/etc/hosts、core-site.xml、hdfs-site.xml三处主机名不一致。
例如伪分布式里fs.defaultFS写的是hdfs://localhost:9000,全分布式里有写hdfs://hadoop-master:9000,如果某台 slave 的/etc/hosts里没有 hadoop-master 的映射,那 Datanode 根本找不到 NameNode。
我的建议是:确定集群模式后,三处配置一起检查,一把梭一致化。不要心存侥幸。格式化前后不要频繁改配置,改完配置一定要重新格式化并清空数据目录。
5.5 JVM 堆内存设置不当引发崩溃
Hadoop 2.7.3 的守护进程默认堆大小由HADOOP_HEAPSIZE控制。我曾经在 4G 内存的 master 上把HADOOP_HEAPSIZE调到 3072,NameNode 进程是起来了,但把整个系统内存占满,Swap 飙升,最后 OOM Killer 把 ResourceManager 给杀了。
调参的原则是:Master 节点建议 NameNode 和 ResourceManager 的堆各不超过物理内存的 1/4;Slave 节点 Datanode 和 NodeManager 堆加起来不超过物理内存的 1/2。剩下留给操作系统和 Page Cache,DataNode 的读写很多依赖 Page Cache 加速。
这个方向上有一个更隐蔽的坑:mapred.child.java.opts。如果你在mapred-site.xml里设置过子任务 JVM 参数,比如-Xmx1024m,但 Yarn 的容器内存上限只有 1536MB,那 Map 任务很可能在启动时直接被拒绝。MapReduce 任务堆内存不要盲目给大,超过容器上限就直接报错。
6. 一点部署后的个人体会
这套流程走下来,最值得记住的一句话是:Hadoop 集群部署不是一个“安装软件”的过程,而是让四个角色(NameNode、DataNode、ResourceManager、NodeManager)在正确的目录、正确的环境中各司其职。也正因如此,环境变量、目录规划、参数配置这三件事占了你 70% 的功夫。最后一手经验分享给你:如果你准备用 IDEA 做 Hadoop 开发,建议把HADOOP_HOME配到本地的winutils.exe对应版本,不然在 Windows 上连 HDFS 会反复报权限错;如果你要整合 Zookeeper 做自动故障转移,先把单点集群跑稳再加 ZK,不要一上来就搞 HA,否则问题叠加时排查维度直接爆炸。希望这份全流程记录能帮你少踩几个我当年踩过的坑。