鲲鹏云ARM架构Hadoop集群部署:JAVA_HOME与OBS关键配置 简介这份实验报告记录了在华为鲲鹏云环境中从零搭建Hadoop集群的完整过程面向正在学习云计算与大数据平台部署的开发者或是需要参考真实实验步骤完成课程作业的在校学生。资源为单个docx文档大小2.52MB内容以图文步骤为主便于对照操作。报告中详细说明了购买弹性云服务器ECS与对象存储服务OBS、获取AK/SK认证信息、配置各节点/etc/hosts与SSH互信、创建Hadoop所需目录等前期准备随后逐步展开core-site.xml、hdfs-site.xml、yarn-site.xml等核心配置文件的编写要点并针对Java家目录路径错误导致的初始化失败、HDFS启动异常等问题给出了修正与重试的排错思路。整份报告将节点分发、环境变量同步等集群部署关键步骤一一列出已有892人学习对于想了解鲲鹏云生态下大数据基础设施落地细节的读者来说是一份很有参考价值的操作笔记。1. 想在一台鲲鹏云主机上把 Hadoop 集群搭起来最先坑你的不是 Hadoop 本身这套大数据实验我前前后后重装了三次三台节点轮流出问题最后定位到根因全是同一个JAVA_HOME 指错了目录。Hadoop 2.8.3 在鲲鹏云 ARM 架构下的部署流程看起来和 x86 上没什么区别下载安装包、解压、改 XML、启动服务但实际走一遍就会发现OpenJDK 的安装路径、OBS 的 endpoint 写法、节点互信的生效时机每个环节都埋着坑。这份实验报告记录的就是以 node-0001 为 NameNode、node-0002 和 node-0003 为 DataNode 的三节点集群完整搭建过程适合正在做鲲鹏云大数据课程实验、或者第一次在云主机上部署 Hadoop 的人参考。装不好最直接的结果是 namenode 格式化失败、datanode 起不来排查一圈发现连 Java 都没找对。2. 准备云资源ECS、OBS 与 AK/SK 的先后顺序别搞反2.1 购买 ECS 时先把网络和安全组想清楚实验的第一步是在云平台上购买三台弹性云服务器 ECS分别命名 node-0001、node-0002、node-0003。这里先别急着点购买有一个顺序问题Hadoop 集群所有节点必须在同一个 VPC 内并且安全组要放通相互访问的端口。如果先买完再发现节点不在同一内网网段后面配置 /etc/hosts 写内网 IP 时会发现互相 ping 不通整个互信步骤全部白做。我一般会在购买页面直接选好预设的 VPC 和子网三台机器保持同一个子网。操作系统选择 EulerOS 或 CentOS 的 ARM 版本都可以本次使用的镜像是自带 OpenJDK 1.8 源的系统后面装 Java 用的是 yum 方式而不是手工解压 JDK 包。规格方面NameNode 节点建议 4 核 8G 起两个 DataNode 2 核 4G 也能跑但如果要执行 wordcount 这类 MapReduce 任务内存还是给足一点YARN 的 Container 分配会舒服很多。安全组要放通的端口包括 SSH 的 22、NameNode Web UI 的 50070、DataNode 的 50010 和 50075、YARN ResourceManager 的 8088以及节点间通信需要的 8020、9000 等端口。实操中更省事的做法是实验环境下直接放通全部内网端口只限制公网入口。2.2 OBS 并行文件系统与 AK/SK 获取在三台 ECS 购买完成后需要购买对象存储服务 OBS。这一步的目的不是存实验数据而是给 Hadoop 提供访问 OBS 的认证凭证。购买 OBS 后要创建并行文件系统注意这里不是创建普通桶而是选择并行文件系统类型否则后面 core-site.xml 里配置的 fs.obs 访问会不识别。创建完成后进入桶在访问密钥管理里生成 AK/SK。平台会提供一份 CSV 格式的凭证文件包含 User Name、Access Key Id、Secret Access Key 三项。这份文件下载后要放好后面配置 core-site.xml 时需要把 Access Key Id 和 Secret Access Key 填进去。需要强调的是AK/SK 等同于云账号的钥匙实验报告里写明文是当时为了教学方便自己实操时不要提交到公开仓库。OBS 的 endpoint 地址也有讲究。实验报告里给出的是 obs.cn-north-4.examplecloud.com即华北区域的 IPv4 地址双栈地址则在前面加 dualstack。如果 ECS 买在其他区域endpoint 也要改成对应区域的地址否则访问 OBS 时会出现连接拒绝或超时。2.3 容易被跳过的网络连通性检查很多同学在配置 OBS 后直接跳到 Hadoop 安装结果后面执行 hdfs 命令时报错回头排查才发现 ECS 根本访问不了 OBS endpoint。这一步最好在配置 Hadoop 之前就验证掉。登录 node-0001执行下面的命令确认到 OBS 的网络链路是否通curl -v https://obs.cn-north-4.examplecloud.com -o /dev/null如果 curl 能返回 HTTP 状态码说明到 OBS 的 443 端口是通的。如果卡住不动或超时先检查安全组是否放通了出方向 HTTPS 流量再确认 ECS 所在子网是否有 NAT 网关提供公网访问能力。这个检查只要做一次三台节点共用同一个 VPC 的话网络配置一致node-0001 通了其余两台通常也没问题。需要注意curl 通了不代表 Hadoop 的 OBS 客户端能正常工作Hadoop 的 obs 访问还要依赖 AK/SK 和 endpoint 配置这个到第四章再展开。3. 集群基础三件套hosts、SSH 互信与 JDK3.1 修改 /etc/hosts节点名和 IP 的对应关系要全三台节点的操作系统装好后第一件事是配置主机名映射。实验报告里三台节点的 IP 分别是 192.168.1.101、192.168.1.102、192.168.1.103下面统一用这三个内网地址做演示。先给每台机器设置 hostnamehostnamectl set-hostname node-0001node-0002 和 node-0003 分别执行对应的主机名。然后编辑三台节点的 /etc/hosts 文件内容保持一致vim /etc/hosts写入以下内容保留系统自带的 localhost 行192.168.1.101 node-0001 192.168.1.102 node-0002 192.168.1.103 node-0003每台节点都写完这三行后用 ping 命令验证一下 hostname 能解析到内网 IPping -c 3 node-0002这个步骤的常见坑是只改了 NameNode 的 /etc/hostsDataNode 上没改结果从 node-0002 ssh 到 node-0003 时解析不到主机名。集群环境要求所有节点的主机名映射完全一致少一台都不行。3.2 SSH 免密登录从 node-0001 到所有节点无密码跳转Hadoop 启动脚本会通过 SSH 连接到各个节点执行命令如果每次连接都要输密码启动过程会卡在密码提示上。所以必须配置 node-0001 到三台节点的免密登录。先在 node-0001 上生成密钥对ssh-keygen -t rsa一路回车即可生成后会得到 /root/.ssh/id_rsa.pub 和 /root/.ssh/id_rsa。然后把公钥分发到所有节点包括 node-0001 自己ssh-copy-id -i /root/.ssh/id_rsa.pub rootnode-0001 ssh-copy-id -i /root/.ssh/id_rsa.pub rootnode-0002 ssh-copy-id -i /root/.ssh/id_rsa.pub rootnode-0003第一次执行会提示确认主机指纹输入 yes然后输入目标节点的 root 密码。分发完成后验证一下ssh node-0002如果不需要密码直接进入 node-0002 的 shell说明免密配置成功执行 exit 退出。有经验的运维会顺手把 authorized_keys 的权限改成 600、.ssh 目录改成 700避免密钥文件权限过大导致 SSH 拒绝加载公钥。3.3 JDK 安装与 JAVA_HOME 定位本实验最大的翻车点Hadoop 2.8.3 依赖 Java 8实验环境通过 yum 安装 OpenJDK 而不是手工解压官方 JDK 包。由于是 ARM 架构安装的版本是 java-1.8.0-openjdk-1.8.0.242.b08-1.h5.oe1.aarch64。注意看这个版本号的最后一段 aarch64这是 ARM 版本的标识安装时如果源里默认给你 x86 的包装完 Java 命令能跑但 Hadoop 启动会报无法加载库文件的错误。安装命令很简单yum install -y java-1.8.0-openjdk-devel关键是找到 JAVA_HOME 的真实路径。很多人以为 JAVA_HOME 指向 /usr/lib/jvm/java-1.8.0 就行但这个路径只是一个软链接实际安装目录是带完整版本号的ls -l /usr/lib/jvm/实验报告里踩的坑就在这里刚开始把 JAVA_HOME 写成了 /usr/lib/jvm/java-1.8.0Hadoop 启动时找不到实际的 Java 库文件导致 namenode 格式化和 HDFS 启动全部失败。正确的路径写法是export JAVA_HOME/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.h5.oe1.aarch64验证 Java 环境是否可用java -version看到 openjdk version 1.8.0_242 的输出就说明安装成功。三台节点都要执行安装和环境变量配置这一步漏了哪台哪台的 DataNode 进程就起不来。4. Hadoop 2.8.3 安装与五个关键配置文件4.1 下载解压与目录规划实验报告里 Hadoop 版本是 2.8.3这个版本虽然老但对 ARM 架构兼容性好是鲲鹏云课程实验最常用的版本。下载安装包后上传到 node-0001 的 /root 目录然后执行cd /root cp hadoop-2.8.3.tar.gz /home/modules/ cd /home/modules/ tar -zxvf hadoop-2.8.3.tar.gz解压后的目录是 /home/modules/hadoop-2.8.3。安装目录建议统一放在 /home/modules 下路径越短越不容易出错后续配置文件里所有绝对路径都基于这个目录写。同时要在各节点创建 Hadoop 运行时需要的目录mkdir -p /home/modules/data/buf mkdir -p /home/nm/localdir第一个目录用于 HDFS 数据存储的缓冲第二个是节点本地目录YARN 的中间结果会写到这。创建完目录后把解压好的 hadoop 目录改个短名字mv /home/modules/hadoop-2.8.3 /home/modules/hadoop4.2 core-site.xmlOBS 的 AK/SK 和 endpoint 是配置核心进入 /home/modules/hadoop/etc/hadoop 目录编辑 core-site.xml。这是 Hadoop 的核心配置这里把 OBS 对象存储并入了 Hadoop 的默认文件系统。配置内容如下configuration property namefs.defaultFS/name valuehdfs://node-0001:9000/value /property property namefs.obs.access.key/name valueAKIAEXAMPLEACCESSKEY/value /property property namefs.obs.secret.key/name valueEXAMPLEAESECRETKEYVALUE/value /property property namefs.obs.endpoint/name valueobs.cn-north-4.examplecloud.com/value /property property namefs.obs.impl/name valueorg.apache.hadoop.fs.obs.OBSFileSystem/value /property /configuration参数说明fs.defaultFS 定义了 NameNode 的地址和 RPC 端口node-0001 是主机名必须在 /etc/hosts 里有对应解析fs.obs.access.key 和 fs.obs.secret.key 填的是 2.2 节下载的 credentials.csv 里的 AK 和 SKfs.obs.endpoint 就是 OBS 服务地址区域必须和 ECS 一致fs.obs.impl 指定了 OBS 文件系统的实现类这个类来自实验包里的 hadoop-huaweicloud.jar。这里如果 AK/SK 写错最常见的现象是后面访问 OBS 时报 UnsupportedOperationException 或者 access denied。排查时先检查 CSV 文件里的值是否被完整复制注意 SK 中可能包含斜杠等特殊字符粘贴时不要漏字符。4.3 hdfs-site.xml副本数和数据目录实验环境三台节点副本数设置为 2既能保证数据冗余又不会因为副本数大于节点数导致文件写入卡住。配置如下configuration property namedfs.replication/name value2/value /property property namedfs.namenode.name.dir/name value/home/modules/data/namenode/value /property property namedfs.datanode.data.dir/name value/home/modules/data/datanode/value /property /configuration需要注意dfs.namenode.name.dir 和 dfs.datanode.data.dir 指定的目录如果不存在启动时会自动创建但如果父目录权限不对会报 Permission denied。实验报告的目录配置中/home/modules/data/buf 是中间数据缓冲namenode 和 datanode 的目录建议单独规划。如果设置 dfs.replication 为 3在只有两台 DataNode 存活的情况下写入文件会一直等待第三副本表现为 HDFS 写入 hung 住。实验初期节点故障时这问题很常见副本数 2 是稳妥选择。4.4 yarn-site.xml、mapred-site.xml 与 slaves 文件yarn-site.xml 配置资源管理器的地址和节点管理器附属服务。需要注意的坑是mapreduce 框架在 2.x 版本必须显式配置为 yarn否则作业跑在 local 模式无法利用集群资源。yarn-site.xml 配置configuration property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property property nameyarn.resourcemanager.hostname/name valuenode-0001/value /property property nameyarn.nodemanager.local-dirs/name value/home/nm/localdir/value /property /configurationmapred-site.xml 配置configuration property namemapreduce.framework.name/name valueyarn/value /property /configurationslaves 文件定义 DataNode 节点列表实验报告里这个文件在 etc/hadoop 目录下内容如下node-0001 node-0002 node-0003注意 2.x 版本中 slaves 文件在启动脚本里仍是生效的NameNode 会按这个文件里的主机名逐个启动 DataNode 进程。只写 node-0002 和 node-0003、不写 node-0001 也是可以的但实验报告里包含了三台节点保持了一致性。环境变量配置在 /etc/profile 中追加export HADOOP_HOME/home/modules/hadoop export PATH$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export HADOOP_CONF_DIR$HADOOP_HOME/etc/hadoop追加后执行 source /etc/profile 使配置生效。4.5 分发到 node-0002 和 node-0003node-0001 上所有配置完成后用 scp 把整个 hadoop 目录分发到另外两台节点scp -r /home/modules/hadoop rootnode-0002:/home/modules/ scp -r /home/modules/hadoop rootnode-0003:/home/modules/分发前要确认三台节点的 JAVA_HOME 路径完全一致。实验报告里出现过一个情况node-0001 的 java 路径写对并分发后node-0002 的 /etc/profile 里 JAVA_HOME 还是旧路径导致 node-0002 启动 datanode 时报错。所以分发完包后每台节点都要单独验证source /etc/profile java -version hadoop version也可以在 node-0001 上批量执行验证命令ssh rootnode-0002 source /etc/profile hadoop version ssh rootnode-0003 source /etc/profile hadoop version如果 hadoop version 能输出 2.8.3 的版本信息说明每台节点的环境变量和安装包都正常。5. 常见问题排查JAVA_HOME 错误引发的连锁反应5.1 现象namenode 格式化被拒绝提示找不到 Java 库实验报告里 namenode 初始化时出现错误原因写着 javahome 错误。具体现象是执行 hdfs namenode -format 后终端输出一串 ClassNotFoundException 或 Error: could not find or load main class。原因定位JAVA_HOME 写到了软链接路径 /usr/lib/jvm/java-1.8.0Hadoop 启动脚本用这个路径去找 lib 目录下的库文件时失败。OpenJDK 的实际安装目录在 /usr/lib/jvm 下带完整版本号的目录里软链接只是方便用户使用并不包含 Hadoop 需要的全部目录结构。解决将 /etc/profile 中的 JAVA_HOME 改成完整路径 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.h5.oe1.aarch64然后 source /etc/profile确认 java -version 输出正常后重新执行 namenode 格式化。修复 JAVA_HOME 后原来所有因 Java 环境导致的后续报错会一并消失不必反复重装 Hadoop。5.2 现象节点间 SSH 免密失效启动 HDFS 卡在密码提示配置互信后第一次能免密跳转但重启机器后 ssh node-0002 又要求输密码。原因三台节点的 /etc/hosts 不一致node-0002 上解析 node-0001 的地址和 node-0001 自己解析的地址不同SSH 检查 host key 时判定为未知主机拒绝了免密认证。也可能是某次重新生成密钥后没有重新分发公钥。解决先统一 /etc/hosts再在 node-0001 上执行 ssh-keygen -R node-0002 清除旧的 host key 记录然后重新执行 ssh-copy-id 推送公钥。用 ssh -v 查看认证日志判断是 key 被拒还是 host key 冲突。5.3 现象HDFS 能启动但 datanode 进程反复挂掉用 jps 查看时发现 node-0001 上有 NameNode 进程但 node-0002 和 node-0003 上 DataNode 启动后过几秒自动退出。原因datanode 的 data 目录/home/modules/data/datanode所属用户不对或者目录权限是 755导致 DataNode 无法写入元数据。另一个常见原因是三台节点的 clusterID 不一致前一次格式化的 namenode 元数据与 datanode 记录的版本号不匹配。解决检查 dfs.datanode.data.dir 目录的属主和权限确认属主是 root权限 700 或 755 均可但不建议 777。如果 clusterID 不一致需要停止所有节点进程清空 /home/modules/data/datanode 下的 current 目录然后在 node-0001 重新格式化并启动。注意重新格式化会丢数据实验环境无所谓生产环境绝不能这样操作。5.4 现象访问 OBS 报错 UnsupportedOperationException配置好 OBS 相关参数后执行 hdfs dfs -ls obs://bucket 时报该方法不支持。原因fs.obs.impl 没配或者 hadoop-huaweicloud.jar 没有放入 $HADOOP_HOME/share/hadoop/common/lib 目录。OBS 文件系统需要这个 jar 包才能加载实现类缺失时 Hadoop 回退到默认的 LocalFileSystem自然不支持 obs 协议。解决确认实验包中的 hadoop-huaweicloud.jar 是否已拷贝到所有节点的 lib 目录检查 core-site.xml 里 fs.obs.impl 的值是否完整。这两个条件满足后hdfs dfs -ls obs://xxx 才能正常执行。5.5 现象启动 HDFS 报权限拒绝即使用的是 root执行 start-dfs.sh 时输出提示 Permission denied且明确指向 ssh rootnode-0002 的连接失败。原因虽然交互式登录能免密但 Hadoop 的启动脚本使用 ssh 执行远程命令时目标节点的 root 用户的 authorized_keys 里缺少 node-0001 的公钥原因是密钥是在普通用户下生成的公钥内容不匹配。解决统一在 root 用户下生成密钥确认 /root/.ssh/authorized_keys 中确实包含 node-0001 的 id_rsa.pub 内容。用ssh rootnode-0002 hostname验证远程命令能执行成功后再启动 Hadoop。6. 验证集群跑通从 jps 到 wordcount 一步不落集群配置完后不能只看屏幕上输出 Started 就认为成功Hadoop 集群必须通过进程检查、服务状态和实际任务三个层面验证。先在 node-0001 上执行格式化仅首次部署需要hdfs namenode -format格式化完成后启动 HDFS 和 YARNstart-dfs.sh start-yarn.sh在三台节点分别执行 jpsnode-0001 应看到 NameNode 和 ResourceManager 进程node-0002 和 node-0003 应看到 DataNode 和 NodeManager 进程。缺哪个进程直接看对应节点的日志文件路径在 $HADOOP_HOME/logs 下排错效率比猜原因高十倍。进程全部就位后用 HDFS 命令做一次实际写入验证hdfs dfs -mkdir -p /user/root/input hdfs dfs -put /etc/hosts /user/root/input/ hdfs dfs -cat /user/root/input/hosts能列出文件并输出内容说明 HDFS 读写链路正常。接着验证 OBS 访问hdfs dfs -ls obs://your-bucket-name/能看到 OBS 桶内的文件列表说明 AK/SK 和 endpoint 配置正确。最后用自带 wordcount 跑一轮完整 MapReduce 作业hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.3.jar wordcount /user/root/input /user/root/output hdfs dfs -cat /user/root/output/part-r-00000能看到单词统计结果且 YARN 的 ResourceManager 页面http://192.168.1.101:8088显示作业状态为 SUCCEEDED整个集群才算真正跑通。从那以后我每次搭新集群都会强制走一遍 jps 检查加 wordcount 验证这两步过了后续跑什么作业心里都有底。这次的 JAVA_HOME 教训也让我养成了习惯所有节点分发完成后先统一校验 Java 路径再格式化宁可多花两分钟检查也不要等报错再逐个节点翻日志。希望这篇笔记能帮你把鲲鹏云上的 Hadoop 集群一次装通。本文还有配套的精品资源点击获取