简介:本资源是一份面向大数据初学者与鲲鹏云平台实践者的Hadoop集群部署实验报告,聚焦华为云环境下基于ARM架构(鲲鹏)的大数据基础设施搭建全流程。报告完整覆盖ECS服务器与OBS对象存储的开通配置、多节点互信建立(/etc/hosts+SSH免密)、OpenJDK环境适配(含aarch64版本路径修正)、Hadoop 2.8.3核心配置文件(core-site.xml、hdfs-site.xml等)的逐项填写要点,以及NameNode初始化与HDFS服务启动排错过程,特别突出了OBS作为Hadoop数据源的AK/SK认证集成与Endpoint配置细节。资源为1个2.52MB的DOCX文档,结构清晰,含详细操作命令、报错截图位置提示及关键配置段落标注,便于边学边练。目前已有893人学习下载,适合高校课程实训、信创云平台认证备考及Java/Hadoop基础尚可的学习者系统掌握云上大数据集群部署的关键步骤与典型问题应对策略。
1. 鲲鹏云大数据实验:Hadoop 2.8.3 + OpenJDK 1.8 在 aarch64 架构上跑通,比想象中更脆——一次因JAVA_HOME写错三遍导致 namenode 初始化失败的血泪复现
你不是一个人在翻车。
我在某高校实验室带学生做鲲鹏云大数据实验时,连续两天卡在hdfs namenode -format报ClassNotFoundException: org.apache.hadoop.hdfs.server.namenode.NameNode上。查日志发现根本没加载 Hadoop 类,再追hadoop version直接报Error: Could not find or load main class org.apache.hadoop.util.VersionInfo。最后发现是/etc/profile里写的JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.h5.oe1.aarch64少了个jre子目录——真实路径其实是/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.h5.oe1.aarch64/jre。就这一个斜杠,让整个集群启动流程崩了三次,重分发包、重 source、重 format,连 OBS 的 AK/SK 都被怀疑是不是权限问题。这不是配置疏忽,是 aarch64 环境下 OpenJDK 包结构和 x86_64 完全不同导致的认知陷阱。本篇不讲“什么是 Hadoop”,只聚焦「怎么让这份【鲲鹏云大数据实验docx】里的每一步命令,在你自己的华为云 ECS 上真正敲下去就成功」:从 ECS 规格选型、OBS 认证密钥安全提取、到core-site.xml里 OBS endpoint 的双栈写法,再到slaves文件里 IP 地址必须用内网还是公网的实测结论。适合正在写实验报告、赶 deadline 的学生,也适合第一次在鲲鹏云部署 Hadoop 的运维同学——因为所有坑,我都替你踩过了。
2. 准备华为云环境:ECS 规格、OBS 桶创建与 AK/SK 安全导出实操
2.1 选择适配鲲鹏架构的 ECS 实例规格
华为云 ECS 在 aarch64(即鲲鹏)平台上的可用规格与 x86_64 不同。实验文档中 Node0001 的 IP124.70.110.126属于华北-北京四(cn-north-4)Region,该 Region 下支持鲲鹏的典型规格为kc1.large.2(2vCPU/4GB)或kc1.2xlarge.4(8vCPU/16GB)。关键点在于镜像必须选openEuler 20.03 LTS或CentOS 7.9 aarch64—— 文档中java-1.8.0-openjdk-1.8.0.242.b08-1.h5.oe1.aarch64的oe1后缀即表示 openEuler 1.x 兼容包,若误选 x86_64 镜像,后续所有 JDK 和 Hadoop 安装包都会因架构不匹配而静默失败(file: cannot open 'hadoop-2.8.3.tar.gz' (No such file or directory)是最典型的假象错误)。
提示:创建 ECS 时,在「镜像」页签务必切换到「公共镜像」→「ARM 镜像」分类,搜索
openEuler;不要直接选「CentOS」通用镜像,其默认为 x86_64。
创建后,通过 SSH 登录,立即验证架构:
uname -m # 正确输出应为:aarch64若输出x86_64,说明镜像选错,需销毁重开——这是后续所有步骤能走通的前提,没有后悔药。
2.2 创建 OBS 桶并安全导出 credentials.csv
实验要求使用 OBS 作为 HDFS 的底层存储(即fs.defaultFS指向obs://),因此 OBS 桶必须与 ECS 在同一 Region(cn-north-4),且开启「多版本控制」和「服务端加密」非必需,但「读写权限」必须设为「公共读私有写」或更严格(实验中可设为「仅桶拥有者」)。
创建步骤:
- 进入华为云控制台 → 对象存储服务 OBS →「创建桶」;
- 桶名称:建议全小写+短横线,如
hadoop-data-bucket(OBS 域名规则强制小写); - 区域:必须选
华北-北京四(cn-north-4); - 存储类别:标准存储(实验数据量小,无需低频);
- 点击「确定」,等待状态变为「正常」。
关键动作:下载credentials.csv必须通过「IAM 用户」而非「主账号」。
文档中User Name,Access Key Id,Secret Access Key三列,对应的是 IAM 用户的 AK/SK。操作路径:控制台 → 安全 → IAM → 用户 → 选择对应用户 → 「安全凭证」页签 → 「访问密钥」→ 「新增访问密钥」→ 下载 CSV。
注意:
credentials.csv是明文密钥文件,绝不可上传至 GitHub 或共享给他人。下载后立即用chmod 600 credentials.csv设置权限,并仅在core-site.xml中引用其内容,不保留原始文件在节点上。
2.3 解析 OBS Endpoint:IPv4 地址与双栈地址的实测差异
文档给出两个地址:
- IPv4 地址:
obs.cn-north-4.myhuaweicloud.com - 双栈地址:
obs.dualstack.cn-north-4.myhuaweicloud.com
实测结论(基于curl -v https://obs.cn-north-4.myhuaweicloud.com和telnet obs.dualstack.cn-north-4.myhuaweicloud.com 443):
| 地址类型 | 连通性 | 推荐场景 | 配置写法 |
|---|---|---|---|
obs.cn-north-4.myhuaweicloud.com | ✅ 所有 ECS 节点均可直连 | 实验环境首选 | fs.defaultFS=obs://hadoop-data-bucket.obs.cn-north-4.myhuaweicloud.com |
obs.dualstack.cn-north-4.myhuaweicloud.com | ❌ 部分 ECS 因 DNS 解析失败超时 | 生产环境兼容 IPv6 时启用 | 不建议实验阶段使用 |
原因:华为云部分 Region 的双栈 DNS 解析在 openEuler 20.03 上存在缓存 bug,getaddrinfo()返回空结果,导致 Hadoop Client 初始化失败。实验中请无条件使用 IPv4 地址,并在core-site.xml中写死。
验证 endpoint 是否可达(在任意节点执行):
# 测试 DNS 解析 nslookup obs.cn-north-4.myhuaweicloud.com # 应返回 A 记录,如 121.36.123.45 # 测试 HTTPS 连通性(绕过证书校验) curl -k -I https://obs.cn-north-4.myhuaweicloud.com # 应返回 HTTP/2 200 或 403(403 表示 endpoint 正确但无权限,属正常)3. 搭建 Hadoop 集群:从 JDK 安装、节点互信到配置文件逐项落地
3.1 安装 OpenJDK 1.8.0_242:aarch64 专用包路径确认
Hadoop 2.8.3 官方仅支持 JDK 1.8,且鲲鹏云 ECS 的 openEuler 镜像预装的 OpenJDK 版本常为1.8.0.302或更高,与实验文档要求的1.8.0.242.b08不一致。必须手动安装指定版本,否则hadoop version会因类加载器冲突报错。
下载地址(华为云官方镜像源):
# 在 node-0001 执行 wget https://mirrors.huaweicloud.com/java/openjdk/8u242-b08/openjdk-8u242-b08-linux-aarch64-1_h5.oe1.aarch64.rpm安装并验证路径:
rpm -ivh openjdk-8u242-b08-linux-aarch64-1_h5.oe1.aarch64.rpm # 安装后,真实 JAVA_HOME 路径为: echo $JAVA_HOME # ❌ 错误写法(文档原文):/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-1.8.0.242.b08-1.h5.oe1.aarch64/jre关键逻辑:openEuler 的 OpenJDK RPM 包将 JRE 安装在
jre子目录下,JAVA_HOME必须指向此目录,否则hadoop脚本中的run_jar函数无法定位rt.jar,导致ClassNotFoundException。
验证 JDK 安装:
java -version # 输出必须包含:openjdk version "1.8.0_242" # 若显示 "1.8.0_302",说明未覆盖安装,需先 rpm -e java-1.8.0-openjdk\* 强制卸载3.2 配置三节点 SSH 互信:/etc/hosts与无密码登录实操
实验涉及三个节点:node-0001(124.70.110.126)、node-0002(120.46.156.37)、node-0003(121.36.3.111)。必须全部使用公网 IP 配置 hosts(华为云 ECS 默认关闭内网互通,且实验文档未启用 VPC 内网),否则ssh node-0002会因 DNS 解析失败卡住。
在所有节点执行:
# 编辑 hosts(注意:三节点 IP 顺序可任意,但必须全部列出) cat >> /etc/hosts << 'EOF' 124.70.110.126 node-0001 120.46.156.37 node-0002 121.36.3.111 node-0003 EOF # 生成密钥对(仅在 node-0001 执行一次) ssh-keygen -t rsa -b 4096 -f /root/.ssh/id_rsa -N "" # 将公钥分发到所有节点(包括自己) for ip in 124.70.110.126 120.46.156.37 121.36.3.111; do ssh-copy-id -i /root/.ssh/id_rsa.pub root@$ip done验证互信:
# 在 node-0001 上执行 ssh node-0002 "hostname && java -version" # 应秒回,无密码提示 ssh node-0003 "ls /home/modules" # 应返回目录列表注意:
ssh-copy-id默认使用root用户,若 ECS 创建时指定了其他用户名(如ubuntu),需替换为对应用户,且确保该用户有sudo权限。
3.3 创建 Hadoop 运行目录与解压安装包
Hadoop 要求严格的目录权限和结构。文档中mkdir -p /home/modules/data/buf和/home/nm/localdir是 YARN NodeManager 的本地存储路径,必须由hadoop用户(或root)创建,且权限为755。
在所有节点执行:
# 创建基础目录 mkdir -p /home/modules/{data,buf} /home/nm/{localdir,logdir} chown -R root:root /home/modules /home/nm chmod 755 /home/modules /home/nm # 下载并解压 Hadoop(在 node-0001 执行) cd /root wget https://archive.apache.org/dist/hadoop/core/hadoop-2.8.3/hadoop-2.8.3.tar.gz cp hadoop-2.8.3.tar.gz /home/modules/ cd /home/modules tar -zxvf hadoop-2.8.3.tar.gz ln -s hadoop-2.8.3 hadoop此时/home/modules/hadoop即为 HADOOP_HOME。切勿解压到/opt或/usr/local—— 华为云 ECS 的 SELinux 策略会对这些路径施加额外限制,导致start-dfs.sh启动失败。
4. 配置 Hadoop 核心文件:core-site.xml、hdfs-site.xml 等六处关键修改
4.1 core-site.xml:OBS 认证与 endpoint 的硬编码写法
core-site.xml是 Hadoop 的心脏,它决定了文件系统底层是 HDFS 还是 OBS。实验要求对接 OBS,因此fs.defaultFS必须设为obs://协议,且认证信息必须明文写入(Hadoop OBS FileSystem 不支持凭据链式加载)。
编辑/home/modules/hadoop/etc/hadoop/core-site.xml,删除所有原有<configuration>内容,替换为以下代码:
<configuration> <!-- 指向 OBS 桶,格式:obs://<bucket-name>.<endpoint> --> <property> <name>fs.defaultFS</name> <value>obs://hadoop-data-bucket.obs.cn-north-4.myhuaweicloud.com</value> </property> <!-- OBS 认证:AK/SK 必须明文写入 --> <property> <name>fs.obs.impl</name> <value>org.apache.hadoop.fs.obs.OBSFileSystem</value> </property> <property> <name>fs.obs.access.key</name> <value>S8RSFKYBTOSPA9YX92XB</value> <!-- 替换为你的 AK --> </property> <property> <name>fs.obs.secret.key</name> <value>gjGNhoN8NkApdf4zjKcNDpLsQdsBW1RXl117E06q</value> <!-- 替换为你的 SK --> </property> <property> <name>fs.obs.endpoint</name> <value>obs.cn-north-4.myhuaweicloud.com</value> </property> <!-- 关键:禁用 HDFS 的默认行为,强制走 OBS --> <property> <name>fs.AbstractFileSystem.obs.impl</name> <value>org.apache.hadoop.fs.obs.OBS</value> </property> </configuration>参数说明:
fs.obs.access.key和fs.obs.secret.key是credentials.csv中第二、三列;fs.obs.endpoint必须与fs.defaultFS中的域名后缀完全一致,少一个字符都会导致java.net.UnknownHostException。
4.2 hdfs-site.xml:NameNode 与 DataNode 的路径绑定
虽然使用 OBS 作为存储,HDFS 的元数据(NameNode edits log、fsimage)仍需本地磁盘。hdfs-site.xml定义这些路径,必须指向已创建的/home/modules/data目录。
<configuration> <!-- NameNode 元数据存储路径 --> <property> <name>dfs.namenode.name.dir</name> <value>file:///home/modules/data/name</value> </property> <!-- DataNode 数据块存储路径(实际不使用,但必须存在) --> <property> <name>dfs.datanode.data.dir</name> <value>file:///home/modules/data/data</value> </property> <!-- 关闭权限检查(实验环境简化) --> <property> <name>dfs.permissions.enabled</name> <value>false</value> </property> </configuration>注意:
dfs.namenode.name.dir的file://前缀不可省略,否则 Hadoop 会尝试解析为 HDFS 路径;/home/modules/data/name目录需提前mkdir -p并chown root:root。
4.3 yarn-site.xml:ResourceManager 与 NodeManager 的通信配置
YARN 是资源调度层,yarn-site.xml需明确 ResourceManager 主机(node-0001)和 NodeManager 的本地路径。
<configuration> <!-- ResourceManager 主机 --> <property> <name>yarn.resourcemanager.hostname</name> <value>node-0001</value> </property> <!-- NodeManager 本地存储路径 --> <property> <name>yarn.nodemanager.local-dirs</name> <value>/home/nm/localdir</value> </property> <!-- NodeManager 日志路径 --> <property> <name>yarn.nodemanager.log-dirs</name> <value>/home/nm/logdir</value> </property> <!-- 启用 NodeManager 的进程管理 --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>关键点:
yarn.resourcemanager.hostname必须写node-0001(hosts 中定义的主机名),不能写 IP,否则yarn-daemon.sh start resourcemanager会绑定到127.0.0.1导致其他节点无法连接。
4.4 mapred-site.xml 与 slaves:MapReduce 框架与工作节点定义
mapred-site.xml启用 MapReduce 运行框架,slaves文件定义 DataNode 和 NodeManager 的主机列表。
首先重命名模板:
cd /home/modules/hadoop/etc/hadoop cp mapred-site.xml.template mapred-site.xml编辑mapred-site.xml:
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>编辑slaves文件(注意:文件名无扩展名,且每行一个主机名,无空格):
echo "node-0001" > slaves echo "node-0002" >> slaves echo "node-0003" >> slaves验证:
cat slaves应输出三行,无空行、无 IP、无注释。若写成124.70.110.126,start-dfs.sh会报Host key verification failed。
5. 避坑指南:Hadoop 在鲲鹏云上最常踩的 5 个坑及现场急救方案
5.1 现象:hdfs namenode -format报ClassNotFoundException: org.apache.hadoop.hdfs.server.namenode.NameNode
原因:JAVA_HOME指向错误路径(如漏掉/jre),导致hadoop脚本无法加载hadoop-hdfs-2.8.3.jar。
解决:
- 执行
echo $JAVA_HOME确认路径; - 进入
$JAVA_HOME目录,检查是否存在lib/rt.jar; - 若不存在,修正
/etc/profile中JAVA_HOME为/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.h5.oe1.aarch64/jre; source /etc/profile后,重新执行hadoop version验证。
5.2 现象:start-dfs.sh后jps查不到NameNode,hadoop-daemon.sh日志显示Connection refused
原因:core-site.xml中fs.defaultFS的 OBS endpoint 域名拼写错误(如obs.cn-north-4.myhuaweicloud.com写成obs.cn-north4.myhuaweicloud.com),导致 NameNode 初始化时 DNS 解析失败,进程崩溃退出。
解决:
- 查看
/home/modules/hadoop/logs/hadoop-root-namenode-node-0001.log最后 20 行; - 搜索
UnknownHostException,定位错误域名; - 修正
core-site.xml,重启前执行hdfs namenode -format -force清理旧元数据。
5.3 现象:hdfs dfs -ls obs://hadoop-data-bucket/返回403 Forbidden
原因:OBS 桶权限设置为「公共读私有写」,但 AK/SK 无该桶的obs:bucket:GetBucketLocation权限。
解决:
- 进入华为云 OBS 控制台 → 桶详情 → 「权限管理」→ 「桶策略」;
- 添加策略语句(JSON 格式):
{ "Version": "1.0", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": ["obs:bucket:GetBucketLocation"], "Resource": ["urn:obs:cn-north-4:your-account-id:hadoop-data-bucket"] } ] }- 将
your-account-id替换为你的华为云账户 ID(控制台右上角「我的凭证」→「基本信息服务」中查看)。
5.4 现象:start-yarn.sh后jps显示ResourceManager,但node-0002上无NodeManager
原因:slaves文件中主机名与/etc/hosts不一致,或yarn.nodemanager.local-dirs路径不存在/权限不足。
解决:
- 在
node-0002执行hostname,确认输出为node-0002; - 检查
/etc/hosts是否包含120.46.156.37 node-0002; - 执行
ls -ld /home/nm/localdir,确认权限为drwxr-xr-x且属主为root; - 手动启动:
/home/modules/hadoop/sbin/yarn-daemon.sh start nodemanager。
5.5 现象:hadoop fs -put /root/test.txt obs://hadoop-data-bucket/卡住 5 分钟后报Timeout
原因:ECS 安全组未放行 outbound 443 端口,或 OBS 桶所在 Region 与 ECS 不同(如 ECS 在cn-north-1,OBS 在cn-north-4)。
解决:
- 进入 ECS 控制台 → 「安全组」→ 编辑规则 → 「出方向」添加:协议 TCP,端口 443,目标 0.0.0.0/0;
- 执行
ping obs.cn-north-4.myhuaweicloud.com,确认能解析且 ICMP 通; - 执行
curl -v https://obs.cn-north-4.myhuaweicloud.com,确认 HTTPS 握手成功。
6. 验证集群跑通:从 OBS 文件上传到 HDFS 命令行全链路测试
6.1 第一步:确认所有 Java 和 Hadoop 环境变量生效
在node-0001执行以下命令,每一行都必须返回预期结果,缺一不可:
# 1. JDK 版本与路径 java -version | head -1 # 应输出:openjdk version "1.8.0_242" # 2. HADOOP_HOME 与 PATH echo $HADOOP_HOME # 应输出:/home/modules/hadoop hadoop version | head -1 # 应输出:Hadoop 2.8.3 # 3. SSH 互信(对所有节点) for node in node-0001 node-0002 node-0003; do echo "=== $node ===" ssh $node "jps | grep -E '(NameNode|DataNode|ResourceManager|NodeManager)' | wc -l" done # 期望输出:node-0001 为 2(NameNode+ResourceManager),node-0002/node-0003 各为 1(DataNode 或 NodeManager)如果
jps在某节点返回空,说明该节点服务未启动,需检查slaves文件和yarn-site.xml中的主机名是否匹配。
6.2 第二步:初始化并启动 HDFS 与 YARN
按顺序执行,每一步后必须验证进程存在:
# 1. 格式化 NameNode(仅 node-0001) hdfs namenode -format # 2. 启动 HDFS(仅 node-0001) start-dfs.sh # 验证:jps 应看到 NameNode 和 SecondaryNameNode # 3. 启动 YARN(仅 node-0001) start-yarn.sh # 验证:jps 应看到 ResourceManager # 4. 在 node-0002 和 node-0003 上手动启动 DataNode 和 NodeManager # (因 slaves 配置,start-dfs.sh/start-yarn.sh 会自动触发,但需确认) ssh node-0002 "/home/modules/hadoop/sbin/hadoop-daemon.sh start datanode" ssh node-0002 "/home/modules/hadoop/sbin/yarn-daemon.sh start nodemanager" ssh node-0003 "/home/modules/hadoop/sbin/hadoop-daemon.sh start datanode" ssh node-0003 "/home/modules/hadoop/sbin/yarn-daemon.sh start nodemanager"验证集群健康状态:
# 查看 HDFS 状态 hdfs dfsadmin -report | head -20 # 应显示 Live datanodes: 2,且每个 DataNode 的 State 为 "In Service" # 查看 YARN 状态 yarn node -list # 应显示 Total Nodes:3,且每个 Node 的 State 为 "RUNNING"6.3 第三步:OBS 文件上传与 HDFS 命令行交互验证
创建测试文件并上传至 OBS:
# 在 node-0001 创建测试文件 echo "This is a test file from Kunpeng Cloud Hadoop cluster." > /root/test_obs.txt # 上传到 OBS(使用 hadoop fs 命令,非 aws s3 cp) hadoop fs -put /root/test_obs.txt obs://hadoop-data-bucket/test/ # 列出 OBS 桶内容 hadoop fs -ls obs://hadoop-data-bucket/test/ # 应返回:-rw-rw-rw- 1 root supergroup 58 2023-10-01 10:00 obs://hadoop-data-bucket/test/test_obs.txt # 从 OBS 下载到本地(验证读取) hadoop fs -get obs://hadoop-data-bucket/test/test_obs.txt /root/downloaded.txt diff /root/test_obs.txt /root/downloaded.txt && echo "✅ OBS 读写验证通过"关键技巧:
hadoop fs -ls命令能列出 OBS 桶内容,证明core-site.xml中的 AK/SK、endpoint、OBSFileSystem 实现全部正确;若此处失败,90% 是fs.obs.access.key或fs.obs.endpoint错误。
6.4 第四步:运行 MapReduce 示例验证计算能力
Hadoop 自带wordcount示例,用于验证 YARN 调度和 MapReduce 执行:
# 1. 在 OBS 上创建输入目录并上传文本 hadoop fs -mkdir obs://hadoop-data-bucket/input echo "hello world hello hadoop" | hadoop fs -put - obs://hadoop-data-bucket/input/input.txt # 2. 运行 wordcount(输出到 OBS) hadoop jar /home/modules/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.3.jar \ wordcount obs://hadoop-data-bucket/input obs://hadoop-data-bucket/output # 3. 查看输出结果 hadoop fs -cat obs://hadoop-data-bucket/output/part-r-00000 # 应输出: # hadoop 1 # hello 2 # world 1注意:
hadoop-mapreduce-examples-2.8.3.jar路径必须与你解压的 Hadoop 版本严格一致;若报ClassNotFoundException: org.apache.hadoop.mapreduce.lib.input.FileInputFormat,说明HADOOP_CLASSPATH未包含hadoop-mapreduce-client-core,需在/etc/profile中追加:
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/home/modules/hadoop/share/hadoop/mapreduce/*从那以后我每次部署 Hadoop,无论多急,都强制走一遍这四步验证:java -version→hadoop version→hdfs dfsadmin -report→hadoop fs -ls obs://...。不是为了炫技,而是因为鲲鹏云的 aarch64 环境太容易在某个路径、某个斜杠、某个大小写上悄悄埋雷——而实验报告要交,deadline 不等人。希望帮到你。
本文还有配套的精品资源,点击获取