鲲鹏云Hadoop集群搭建避坑指南:JAVA_HOME与NameNode实战解析

发布时间:2026/10/17 16:25:07
鲲鹏云Hadoop集群搭建避坑指南:JAVA_HOME与NameNode实战解析
简介一份共2.52MB的docx实验报告记录在华为云鲲鹏环境下从零搭建Hadoop分布式集群的完整过程。适合高校大数据课程实验、云计算实训及需要完成同类部署的读者参考。内容从购买弹性云服务器与OBS对象存储、获取AK/SK访问密钥开始依次覆盖多节点SSH免密登录、主机映射文件配置、自定义目录创建、核心配置文件编写、Java环境路径修正、软件包重新分发同步直至NameNode初始化和HDFS服务启动。全文以实操日志体例组织包含具体节点IP地址、完整执行命令与出错场景既能作为课程实验报告模板也可当作鲲鹏云大数据平台的部署对照手册。已有892人学习下载能显著减少环境配置过程中的踩坑与排错时间特别适合需要交付实验报告或快速完成环境搭建的读者。1. 鲲鹏云大数据实验一份让新手反复执行“重新分发”的实操记录如果你正准备复现《鲲鹏云大数据实验docx》先别急着打开终端。我第一次按这份实验报告操作时前半段很快买完云资源进入 Hadoop 搭建就出问题JAVA_HOME 总是指向一个不存在的目录NameNode 初始化反复失败最后只能回到“重新分发”这一步。这份文档不是 Hadoop 原理讲义而是一套从“准备云环境 ECS OBS”到“三节点 Hadoop 集群启动”的完整命令流水账。它适合两类人一是要做鲲鹏云大数据实验报告、需要完整步骤支撑的初学者二是想在 ARM 架构下把 Hadoop 集群跑通却不想从零拼步骤的从业者。读的时候把 javahome 报错当成主线你会发现后面所有“重新执行”都有了解释。2. 准备阶段ECS 实例规格、OBS 文件系统与 AK/SK 的边界2.1 三台 ECS 的角色分配为什么实验一定要三个节点实验文档开头给出了三个节点Node0001、Node0002、Node0003。这不是随意凑数而是 Hadoop 集群最基础的 master/worker 结构。Node0001 承担控制面运行 NameNode 和 ResourceManagerNode0002 与 Node0003 承担数据面运行 DataNode 和 NodeManager。三台机器在同一个内网里NameNode 才能稳定管理 DataNode 的注册与心跳。选规格的时候可以参考Node0001 给 4C8G两个 worker 给 2C4G 就够。实验负载主要是格式化、启动服务和跑一个 MapReduce 作业真正的瓶颈通常在磁盘 IO 和内存不在 CPU。镜像要选 ARM 版本的 Linux 发行版因为鲲鹏节点是 aarch64 架构选错镜像后面所有 rpm 包都会装不上。节点角色核心进程建议规格node-0001masterNameNode、ResourceManager4C8Gnode-0002workerDataNode、NodeManager2C4Gnode-0003workerDataNode、NodeManager2C4G安全组要注意放通端口SSH 22、HDFS 9000/8020、NameNode Web UI 50070、ResourceManager Web UI 8088以及节点之间内网全互通。如果端口没放通会出现 jps 里进程都在但 NameNode 连接不了 DataNode 的怪现象。我一般会把三台节点放在同一个安全组然后单独对公网只放通 22 端口。实验报告里写的是用公网 IP 互相访问复现时建议改成内网 IP数据不走公网速度更快也更安全。2.2 OBS 并行文件系统它不是普通对象桶实验文档在购买 OBS 时特意选了“并行文件系统”这一步容易被忽略。普通对象桶以对象为存储单位没有真正的目录层级并行文件系统提供近似 POSIX 的目录语义Hadoop 的 OBS 客户端在读写目录、列目录时开销更小处理 MapReduce 输出目录也更自然。OBS 在实验里的作用不是备份而是作为 Hadoop 的可访问文件系统。三台节点通过 core-site.xml 里的 AK/SK 和 Endpoint 连到同一个桶相当于把对象存储挂进了集群。后续hadoop fs -ls obs://桶名就能直接列目录不需要额外挂载工具。创建完并行文件系统后控制台会提供下载credentials.csv的入口。这个文件里包含三列User Name、Access Key Id、Secret Access Key。Access Key Id 是身份标识Secret Access Key 是密钥两者合起来就是 AK/SK。实验文档提示“操作完成后得到 credentials.csv打开即可得到 AK/SK”指的就是这一步。我建议把凭据先存到一个本地文件等配置 core-site.xml 时再复制进去mkdir -p /home/modules/obs cat /home/modules/obs/credentials EOF AK你的AccessKeyId SK你的SecretAccessKey ENDPOINTobs.cn-north-4.myhuaweicloud.com EOF chmod 600 /home/modules/obs/credentialschmod 600是为了防止其他系统用户读取。要注意这个文件只是给自己看的备忘录Hadoop 不会自动读取它真正生效的是后面写进 core-site.xml 的fs.obs.access.key和fs.obs.secret.key。Endpoint 决定了 AK/SK 去哪个区域的 OBS 服务做认证。实验文档里出现的是obs.cn-north-4.myhuaweicloud.com这是华北区的 IPv4 地址如果 VPC 开启了 IPv6还可以用双栈地址obs.dualstack.cn-north-4.myhuaweicloud.com。复现时只要保证桶所在区域和 Endpoint 一致就行否则会报 403。2.3 节点约定把 IP 映射写进 /etc/hosts三台 ECS 创建后实验文档里记录了 node-0001、node-0002、node-0003 各自的公网 IP。实际操作时第一步是修改三台节点的/etc/hosts把节点名对应到内网 IPcat /etc/hosts EOF 192.168.1.11 node-0001 192.168.1.12 node-0002 192.168.1.13 node-0003 EOF这段命令要在三台节点上都执行。IP 要替换成你实际的 VPC 内网地址不要照抄公网 IP。Hadoop 启动时 NameNode 会通过主机名去连接 DataNode而主机名解析依赖/etc/hosts或 DNS。如果不写 hostsDataNode 注册时上报的主机名可能是随机短主机名NameNode 解析不了节点就掉线。我还建议顺便改掉各节点的/etc/hostname让 node-0002 的主机名就是node-0002node-0003 就是node-0003。改完用hostname确认。这一步配合 hosts 一起做能省掉后面排查 DataNode 上线问题的功夫。3. 搭建 Hadoop 集群hosts 互信、JDK 真实路径与五份核心配置文件3.1 SSH 互信为什么 NameNode 启动 DataNode 需要免密登录实验文档里有一段“配置节点互信”和“无密码跳转”这是集群搭建的关键前置步骤。start-dfs.sh脚本在 master 节点执行时会通过 SSH 连接到每个 slave 节点并远程启动 DataNode。如果每次连接都要输入密码脚本无法完成自动化。生成密钥的命令如下ssh-keygen -t rsa -N -f /root/.ssh/id_rsa cat /root/.ssh/id_rsa.pub-N 表示密钥不设置口令-f指定保存路径。生成后把 node-0001 的公钥内容复制到 node-0002 和 node-0003 的/root/.ssh/authorized_keys中。具体方式是在 node-0002 上执行mkdir -p ~/.ssh chmod 700 ~/.ssh echo 粘贴node-0001的公钥 ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys验证是否成功ssh node-0002 hostname如果能直接返回node-0002说明免密生效。我踩过的一个细节是权限.ssh目录必须是 700authorized_keys必须是 600。如果权限过宽OpenSSH 会出于安全策略直接忽略这个公钥现象就是每次 SSH 仍然要密码而且日志里不会给出明确提示。3.2 JAVA_HOME所有“重新分发”的根源实验文档里反复出现“javahome 错误导致失败”“更改 javahome 的目录”这类记录。原因很简单鲲鹏节点是 aarch64 架构下载的 OpenJDK 是 ARM 版本安装后的真实路径通常带aarch64后缀例如/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.h5.oe1.aarch64很多教程或模板里写的是/usr/lib/jvm/java-1.8.0-openjdk这个路径在没有多版本 JDK 的 x86 机器上可能成立但在鲲鹏节点上会指向不存在的软链。Hadoop 脚本拿到这个路径后找不到 java 可执行文件NameNode 启动自然失败。应该先找到真实路径readlink -f $(which java)然后写进环境变量。我一般统一写进/etc/profile同时对每个节点生效echo export JAVA_HOME/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.h5.oe1.aarch64 /etc/profile echo export PATH$JAVA_HOME/bin:$PATH /etc/profile echo export HADOOP_HOME/home/modules/hadoop-2.8.3 /etc/profile echo export PATH$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin /etc/profile source /etc/profile java -version注意Hadoop 自带的一组脚本还会读取$HADOOP_HOME/etc/hadoop/hadoop-env.sh。这个文件里也可能有一个JAVA_HOME配置如果这里写错即使/etc/profile正确start-dfs.sh依然会失败。最稳的做法是把JAVA_HOME同时写进hadoop-env.sh确保脚本直接拿到绝对路径。3.3 五份核心配置core-site、hdfs-site、yarn-site、mapred-site、slaves先把数据目录建好。实验文档里的两个目录/home/modules/data/buf和/home/nm/localdir分别服务于 Namenode 元数据、临时缓冲和 NodeManager 本地目录。mkdir -p /home/modules/data/buf mkdir -p /home/nm/localdircore-site.xml 是全局配置。重点是把 AK/SK 和 Endpoint 填进去并声明默认文件系统configuration property namefs.defaultFS/name valuehdfs://node-0001:9000/value /property property namefs.obs.impl/name valueorg.apache.hadoop.fs.obs.OBSFileSystem/value /property property namefs.obs.access.key/name value你的AccessKeyId/value /property property namefs.obs.secret.key/name value你的SecretAccessKey/value /property property namefs.obs.endpoint/name valueobs.cn-north-4.myhuaweicloud.com/value /property /configurationfs.defaultFS决定hadoop fs命令默认访问的是 HDFS。fs.obs.*是 OBS 客户端识别凭据和区域所使用的键值fs.obs.impl类名取决于你下载的 OBS 支持包版本常见实现是OBSFileSystem。如果 AK/SK 填错后面执行hadoop fs -ls obs://...会直接返回 403。hdfs-site.xml 配置 NameNode 和 DataNode 的数据目录以及副本数configuration property namedfs.namenode.name.dir/name value/home/modules/data/buf/namenode/value /property property namedfs.datanode.data.dir/name value/home/modules/data/buf/datanode/value /property property namedfs.replication/name value2/value /property /configuration副本数设 2 是因为实验里只有两个 worker 节点。设默认值 3 也能启动但会频繁出现副本不足的告警对实验报告没有增益。yarn-site.xml 配置 ResourceManager 地址和 NodeManager 辅助服务configuration property nameyarn.resourcemanager.hostname/name valuenode-0001/value /property property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property /configurationmapred-site.xml 需要从模板复制出来后修改cp /home/modules/hadoop-2.8.3/etc/hadoop/mapred-site.xml.template /home/modules/hadoop-2.8.3/etc/hadoop/mapred-site.xml然后写入configuration property namemapreduce.framework.name/name valueyarn/value /property /configuration最后编辑 slaves 文件列出所有 workernode-0002 node-0003注意不要写入 node-0001否则 master 也会被注册成 DataNode。配置完成后这五份文件必须同步到 node-0002 和 node-0003只改 master 节点会导致集群状态不一致。4. 避坑排查四个让集群翻车的高频现象4.1 现象一start-dfs.sh 启动后 NameNode 直接消失我在第一次复现时执行start-dfs.sh后看 jps发现 node-0001 上只有 Jps 进程NameNode 根本没起来。日志里会看到JAVA_HOME is not set correctly或Not a valid identifier。原因就是 JAVA_HOME 路径配错Hadoop 脚本解析不到 java 可执行文件。这个错经常出现在/etc/profile已经改了但hadoop-env.sh没改的情况。解决方法是先readlink -f $(which java)拿到真实路径再同时修改/etc/profile和/home/modules/hadoop-2.8.3/etc/hadoop/hadoop-env.sh最后source /etc/profile重新执行start-dfs.sh。4.2 现象二NameNode 格式化反复失败格式化时报错的原因很多比如 javahome 指向错误导致格式化脚本中途退出残留了半份元数据。之后即使改对路径再格式化也会因为旧数据未清理而继续失败。解决方法是先停掉所有 Hadoop 进程确认没有遗留进程后删除dfs.namenode.name.dir和dfs.datanode.data.dir下已经生成的数据目录然后再重新执行hdfs namenode -format。如果你在格式化后换了一台节点继续操作也要检查 NameNode 的 clusterID 与 DataNode 的 clusterID 是否一致这个字段记录在两个目录下的VERSION文件中。4.3 现象三DataNode 全部离线Web UI 显示 0 个 Live Nodesjps 能看到 DataNode 进程但 NameNode 的 Web UI 或hdfs dfsadmin -report显示没有可用 DataNode。日志里常见UnknownHostException或Unresolved host name。原因是/etc/hosts里写的节点名和各个节点/etc/hostname不一致或者 hosts 里用了不可解析的公网 IP。Hadoop 的 DataNode 启动后会上报自己的主机名NameNode 收到后用这个名字反查 IP查不到就不接受注册。解决方法是把三台节点的 hosts 统一成内网 IP 映射并修改/etc/hostname为唯一名称然后重启所有节点的 Hadoop 进程。另外要注意NodeManager 也存在类似问题配置不一致时 YARN 页面会有节点失联。4.4 现象四访问 obs:// 路径报 403 AccessDenied配置好 OBS 后执行hadoop fs -ls obs://桶名/报 403。这个错和 HDFS 无关纯粹是 OBS 认证失败。原因一般是三选一AK/SK 复制错了Endpoint 区域与桶不一致或者写的是普通对象桶名称而不是并行文件系统名称。实验文档里要求把 AK、SK、Endpoint 在 core-site.xml 中更改这三个属性任何一个不匹配都会访问不到。解决方法是打开 credentials.csv 重新核对 Access Key Id 和 Secret Access Key不要带空格再检查桶所在地域和 Endpoint 是否一致。如果确认无误可以先用 OBS 控制台手动上传一个文件排除桶权限本身的问题。5. 集群一致性软件包分发、启动顺序与三分钟验证命令5.1 用 rsync 而不是 scp分发 Hadoop 与 JDK 的正确姿势实验文档里多次出现“分发 hadoop 包到各节点”“重新分发”的操作。这是因为 javahome 错误或配置文件改过之后必须把最新状态同步到 node-0002、node-0003。手工逐台 scp 容易漏文件我建议用 rsync。for node in node-0002 node-0003; do rsync -av /home/modules/hadoop-2.8.3 $node:/home/modules/ rsync -av /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.h5.oe1.aarch64 $node:/usr/lib/jvm/ done-a保留文件属性、属主和时间戳-v显示明细。rsync 的增量特性可以避免每次全量重传在文件多的时候比 scp 快很多。如果目标机器没有 rsync先执行yum install -y rsync。这里有一个容易踩的坑不要直接分发/etc/profile到所有节点。不同节点的 hosts 内容、网络配置可能不同覆盖后容易把节点搞乱。更稳的做法是把环境变量单独放到/etc/profile.d/hadoop.sh分发这一个文件然后逐台 source。5.2 初始化与启动顺序什么时候格式化什么时候跳过格式化 NameNode 只能在 master 节点执行并且只在第一次部署或清理数据后执行。命令是hdfs namenode -format如果之前格式化失败过要先清空数据目录再格式化避免 clusterID 残留。不要对运行中的集群执行格式化那等于清空整个 HDFS 元数据。格式化完成后按顺序启动start-dfs.sh start-yarn.sh jpsstart-dfs.sh会依次拉起 NameNode、DataNode 和 SecondaryNameNodestart-yarn.sh拉起 ResourceManager 和 NodeManager。jps 输出的进程列表是快速判断集群是否正常的第一手段。我习惯把这组命令写进一个脚本文件每台机器一个启动脚本避免手动敲错顺序。如果某个进程没起来优先看$HADOOP_HOME/logs/目录下对应的日志文件不要反复重启集群那样只会让错误信息更难定位。5.3 三分钟验证命令从 jps 到 dfsadmin集群启动后我会依次跑三个命令确认状态。hdfs dfsadmin -report能列出 DataNode 的 IP、存储容量和最后心跳时间。正常情况应看到 node-0002 和 node-0003 各一个 DataNode状态为 In Service。yarn node -list能查看 NodeManager 是否注册状态为 RUNNING。访问 Web UI 也能快速确认NameNode 一般在http://node-0001:50070Hadoop 2.x 默认端口ResourceManager 在http://node-0001:8088。如果浏览器打不开先检查安全组和防火墙再检查服务进程是否存活。这里给一张最小检查表方便对照检查项命令正常结果进程jpsmaster 有 NameNode、ResourceManagerworker 有 DataNode、NodeManagerDataNodehdfs dfsadmin -reportLive Nodes 2无 Dead NodesNodeManageryarn node -list2 个 RUNNING日志tail -100 $HADOOP_HOME/logs/...无 ERROR 堆栈6. 进阶验证把 OBS 当数据源跑 WordCount6.1 从 HDFS 扩展到 obs:// 路径集群搭建完成后我建议不要只停留在 HDFS 内部直接用 OBS 做一次 MapReduce 作业能同时验证三件事AK/SK 配置是否生效、集群是否真正可用、OBS 作为一个文件系统能不能扛住 MapReduce 的中间数据读写。先把本地文件放到 OBShadoop fs -ls obs://你的桶名/ hadoop fs -mkdir -p obs://你的桶名/input hadoop fs -put /home/modules/test.txt obs://你的桶名/input/如果这一步能顺利列出目录并写入文件说明 core-site.xml 里的 OBS 参数没问题。接下来跑 WordCounthadoop jar \ /home/modules/hadoop-2.8.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.3.jar \ wordcount \ obs://你的桶名/input \ obs://你的桶名/output作业跑完看结果hadoop fs -cat obs://你的桶名/output/part-r-00000这里有个细节MapReduce 作业读写 OBS 时会大量使用本地临时目录建议在 core-site.xml 中额外配置fs.obs.buffer.dir指向本地磁盘例如/home/modules/data/buf否则默认临时目录空间不足时作业会失败。6.2 每次部署前先做一次环境基线检查从那以后我每次换新集群部署 Hadoop都会强制走一遍同样的基线检查三台节点的readlink -f $(which java)输出必须完全一致/etc/hosts必须统一ssh node-0002 hostname必须免密返回正确主机名core-site.xml 里的 AK、SK 和 Endpoint 必须能通过一条hadoop fs -ls obs://桶名/验证。for node in node-0001 node-0002 node-0003; do ssh $node readlink -f \$(which java); /home/modules/hadoop-2.8.3/bin/hadoop version done这个循环把三个节点的 Java 路径和 Hadoop 版本一次性打出来任何不一致都能立刻发现。确认这四项后再格式化 NameNode基本不会再出现“重新分发”循环。希望帮到你。本文还有配套的精品资源点击获取