简介:本资源是一份面向大数据初学者与鲲鹏云平台实践者的Hadoop集群部署实验报告,聚焦华为云环境下基于ARM架构(鲲鹏)的大数据基础设施搭建全流程。报告完整覆盖ECS服务器与OBS对象存储的开通配置、AK/SK密钥获取、多节点互信建立、SSH无密码登录、Hadoop 2.8.3源码级安装与核心配置(core-site.xml、hdfs-site.xml等六类文件)、Java环境(OpenJDK 1.8)精准适配及跨节点分发同步等关键环节,特别记录了因JAVA_HOME路径错误导致的反复调试与修复过程,具备强实操参考价值。资源为单个2.52MB的DOCX文档,内容结构清晰,含详细命令行操作截图、配置参数说明及问题排查注释,便于边学边练。目前已有893人学习下载,适合高校课程实验、信创云平台实训及Hadoop集群部署入门者系统掌握云上大数据环境构建方法。
1. 鲲鹏云大数据实验:一份能跑通 Hadoop + OBS 的 arm64 实战笔记,专治“Java_HOME 找不到”和“OBS 认证失败”玄学
这不是一份标准模板式实验报告,而是一份我在某高校实验室带学生复现鲲鹏云 Hadoop 集群时,被反复卡在java -version报错、hdfs namenode -format拒绝执行、hadoop fs -ls obs://返回 403 的血泪整理。它解决的不是“理论上怎么搭”,而是“为什么 node-0001 能过,node-0002 死活连不上 OBS”的真实问题。整套流程基于华为云真实 ECS(arm64 架构,openEuler 20.03 LTS)+ OBS 对象存储构建,所有配置项、路径、AK/SK 填写位置、jar 包依赖版本全部来自实测可运行环境。如果你正卡在“下载了 Hadoop 却启动不了 NameNode”“OBS 地址填对了但就是报 signature mismatch”“三台节点 SSH 互信成功却 still can’t connect to node-0002”,这份笔记就是为你写的——它不讲原理图,只告诉你哪一行命令必须加-f,哪个JAVA_HOME必须精确到.aarch64后缀,以及为什么core-site.xml里 endpoint 少一个斜杠就全盘崩溃。新手照着敲能跑通,熟手能一眼看出自己漏了哪层环境隔离。
2. 环境准备与认证打通:从 ECS 创建到 OBS AK/SK 安全落盘
2.1 华为云 ECS 选型与基础初始化:必须选 arm64,别碰 x86
鲲鹏云本质是基于 ARM 架构的国产化云平台,所有后续 Hadoop 编译、JDK 运行、OBS SDK 调用都强依赖 aarch64 指令集。若误选 x86_64 规格(如 s6.large.2),后续安装 OpenJDK 或 Hadoop native lib 会直接报cannot execute binary file: Exec format error。实测推荐配置:
- 镜像:openEuler 20.03 LTS(官方预装 kernel 4.19,兼容性最佳)
- 规格:kc1.large.2(2vCPU/4GB,最低可用;生产建议 kc1.2xlarge.4)
- 系统盘:≥100GB(Hadoop 日志 + tmp 目录易占满)
- 网络:务必勾选“自动分配公网 IP”,否则 node-0001 无法被其他节点 SSH 访问
创建完成后,立即执行以下初始化(非可选):
# 关闭防火墙(华为云默认开启,会拦截 9000/8020/8032 等 HDFS/YARN 端口) sudo systemctl stop firewalld sudo systemctl disable firewalld # 安装基础工具(华为云镜像常缺 wget/vim/sshpass) sudo dnf install -y wget vim-enhanced openssh-clients sshpass # 创建统一工作目录(避免后续路径混乱) sudo mkdir -p /home/modules/{hadoop,jdk,data,buf,nm} sudo chown -R $USER:$USER /home/modules提示:华为云 ECS 默认 root 密码不显示,首次登录需通过 VNC 控制台重置。切勿用网页控制台直接粘贴长命令——中文符号、换行符易损坏。
2.2 OBS 桶创建与 AK/SK 安全导出:endpoint 和双栈地址必须分清
OBS 是本实验的数据底座,所有hadoop fs -put操作均指向 OBS 桶。关键陷阱在于:华为云 OBS 提供 IPv4 和双栈两种 endpoint,但 Hadoop 2.8.3 仅支持 IPv4 格式。若错误填入obs.dualstack.cn-north-4.myhuaweicloud.com,hadoop fs -ls obs://bucket-name/必报java.net.UnknownHostException。
创建步骤(控制台操作):
- 进入「对象存储服务 OBS」→「桶列表」→「创建桶」
- 区域:严格匹配 ECS 所在区域(如 ECS 在
华北-北京四,则桶必须选cn-north-4) - 桶名称:全小写+短横线(如
hadoop-demo-bucket),避免下划线或大写(OBS 兼容性差) - 读写权限:设为「私有」(安全起见,后续通过 AK/SK 授权)
- 创建完成后,进入「安全凭证」→「访问密钥(AK/SK)」→「新增访问密钥」
此时下载credentials.csv,其内容形如:
User Name,Access Key Id,Secret Access Key roy_yuki,S8RSFKYBTOSPA9YX92XB,gjGNhoN8NkApdf4zjKcNDpLsQdsBW1RXl117E06q安全落盘操作(必须):
# 创建密钥专用目录(禁止放 /root 或 /home) mkdir -p /home/.aws chmod 700 /home/.aws # 生成 credentials 文件(注意:Hadoop 读取的是 ~/.aws/credentials,非 csv 原文件) cat > /home/.aws/credentials << 'EOF' [default] aws_access_key_id = S8RSFKYBTOSPA9YX92XB aws_secret_access_key = gjGNhoN8NkApdf4zjKcNDpLsQdsBW1RXl117E06q EOF chmod 600 /home/.aws/credentials注意:
aws_access_key_id和aws_secret_access_key是 Hadoop OBS FileSystem 的标准 key 名,不可改为Access Key Id等 csv 表头名。[default]section 名不可省略。
2.3 网络连通性自检:三步确认节点间无阻塞
集群失效 70% 源于网络配置错误。执行前请确保三台 ECS 均在同一 VPC、同一安全组,且安全组入方向放行:
- TCP 22(SSH)
- TCP 8020(NameNode RPC)
- TCP 9000(HDFS 客户端通信)
- TCP 8030-8033(YARN ResourceManager)
- TCP 8088(YARN Web UI)
自检脚本(在 node-0001 上执行):
# 1. 检查 /etc/hosts 是否解析正确(必须含三台节点) echo "124.70.110.126 node-0001" | sudo tee -a /etc/hosts echo "120.46.156.37 node-0002" | sudo tee -a /etc/hosts echo "121.36.3.111 node-0003" | sudo tee -a /etc/hosts # 2. 测试 ICMP 连通性(排除网络层故障) for ip in 120.46.156.37 121.36.3.111; do ping -c 2 -W 3 $ip &>/dev/null && echo "✅ $ip ping OK" || echo "❌ $ip ping FAIL" done # 3. 测试 SSH 端口连通性(应用层验证) for ip in 120.46.156.37 121.36.3.111; do timeout 3 bash -c "echo > /dev/tcp/$ip/22" 2>/dev/null && echo "✅ $ip:22 SSH port OK" || echo "❌ $ip:22 SSH port FAIL" done若ping FAIL,检查 VPC 路由表;若SSH port FAIL,检查安全组规则或 ECS 是否关机。
3. JDK 与 Hadoop 部署:arm64 专用 OpenJDK 与 Hadoop 2.8.3 补丁包
3.1 OpenJDK 1.8.0-aarch64 安装:必须用 .aarch64.rpm,拒绝 tar.gz
Hadoop 2.8.3 的 native lib(如 zlib、snappy)在 arm64 下需编译版 JDK。华为云 openEuler 自带的java-1.8.0-openjdk是通用版,缺少libjsig.so等关键库,导致hadoop namenode启动时报Error: Could not find or load main class org.apache.hadoop.hdfs.server.namenode.NameNode。
实测有效安装命令(node-0001 ~ node-0003 全部执行):
# 下载华为云适配的 aarch64 JDK(注意版本号必须含 .aarch64) wget https://repo.huaweicloud.com/java/jdk/8u242-b08/openjdk-1.8.0.242.b08-1.h5.oe1.aarch64.rpm # 安装(dnf 会自动解决依赖) sudo dnf localinstall -y openjdk-1.8.0.242.b08-1.h5.oe1.aarch64.rpm # 验证安装路径(关键!后续 JAVA_HOME 必须指向此路径) readlink -f $(which java) | sed 's|/bin/java||' # 输出应为:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.h5.oe1.aarch64提示:
readlink -f $(which java)是唯一可靠获取JAVA_HOME的方式。不要硬编码/usr/lib/jvm/java-1.8.0-openjdk—— openEuler 会追加.aarch64后缀,少一个字符就失败。
3.2 Hadoop 2.8.3-aarch64 补丁包获取与解压:拒绝官网 x86 版本
官网 Apache Hadoop 2.8.3 二进制包不含 aarch64 native lib。必须使用华为云提供的补丁包(含libhadoop.so交叉编译版)。下载地址(实测可用):
# 在 /home/modules 目录下执行 cd /home/modules wget https://mirrors.huaweicloud.com/kunpeng/archive/hadoop/hadoop-2.8.3-kunpeng.tar.gz tar -zxvf hadoop-2.8.3-kunpeng.tar.gz mv hadoop-2.8.3-kunpeng hadoop解压后验证 native lib:
ls -l /home/modules/hadoop/lib/native/ # 必须包含:libhadoop.so libhdfs.so libsnappy.so libz.so.1 # 若只有 .so.1.0 而无 .so 符号链接,手动创建: cd /home/modules/hadoop/lib/native sudo ln -sf libhadoop.so.1.0 libhadoop.so sudo ln -sf libhdfs.so.1.0 libhdfs.so3.3 环境变量全局生效:/etc/profile 中的 JAVA_HOME 必须绝对精确
/etc/profile是集群环境变量唯一可信源。错误写法(常见翻车点):
- ❌
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk(缺.aarch64) - ❌
export HADOOP_HOME=$HOME/hadoop($HOME在 root 下为/root,但 Hadoop 安装在/home/modules)
正确写法(三台节点全部执行):
# 追加到 /etc/profile 末尾 cat >> /etc/profile << 'EOF' # Hadoop Environment Variables export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.h5.oe1.aarch64 export HADOOP_HOME=/home/modules/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop export HADOOP_MAPRED_HOME=$HADOOP_HOME export HADOOP_COMMON_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME export YARN_HOME=$HADOOP_HOME export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native" # OBS FileSystem Support export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HADOOP_HOME/share/hadoop/tools/lib/aws-java-sdk-bundle-1.11.375.jar export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HADOOP_HOME/share/hadoop/tools/lib/hadoop-aws-2.8.3.jar EOF # 立即生效(避免重启) source /etc/profile # 验证(三台节点均应输出相同路径) echo $JAVA_HOME echo $HADOOP_HOME注意:
aws-java-sdk-bundle-1.11.375.jar和hadoop-aws-2.8.3.jar是 OBS 访问必需依赖,路径必须与hadoop-2.8.3-kunpeng包内实际路径一致。若ls $HADOOP_HOME/share/hadoop/tools/lib/中 jar 名不同,需同步修改HADOOP_CLASSPATH。
4. Hadoop 配置文件实战:core-site.xml 中的 OBS endpoint 必须带协议头
4.1 core-site.xml:OBS 认证与 endpoint 的四个致命参数
$HADOOP_HOME/etc/hadoop/core-site.xml是 OBS 接入核心。以下配置必须逐字复制(<value>内容不可增删空格):
<configuration> <!-- HDFS 默认文件系统 --> <property> <name>fs.defaultFS</name> <value>hdfs://node-0001:9000</value> </property> <!-- OBS FileSystem 配置(关键!)--> <property> <name>fs.obs.impl</name> <value>org.apache.hadoop.fs.obs.OBSFileSystem</value> </property> <!-- OBS endpoint(必须用 IPv4 地址,且带 https://)--> <property> <name>fs.obs.endpoint</name> <value>https://obs.cn-north-4.myhuaweicloud.com</value> </property> <!-- OBS 认证 AK/SK(从 /home/.aws/credentials 读取)--> <property> <name>fs.obs.access.key</name> <value>S8RSFKYBTOSPA9YX92XB</value> </property> <property> <name>fs.obs.secret.key</name> <value>gjGNhoN8NkApdf4zjKcNDpLsQdsBW1RXl117E06q</value> </property> <!-- 启用 OBS 路径样式(必开!否则报 400 Bad Request)--> <property> <name>fs.obs.path.style.access</name> <value>true</value> </property> </configuration>参数说明:
fs.obs.endpoint:必须为https://obs.cn-north-4.myhuaweicloud.com(带https://,且无/结尾)。填obs.cn-north-4.myhuaweicloud.com或http://...均失败。fs.obs.path.style.access=true:华为云 OBS 要求启用 path-style 访问,否则hadoop fs -ls obs://bucket/返回400 Bad Request。- AK/SK 值:直接复制
credentials.csv中第二、三列,不可加引号,不可换行。
4.2 hdfs-site.xml:NameNode 与 DataNode 目录必须独立
HDFS 数据目录若共用/home/modules/data,多节点启动时会因锁竞争崩溃。必须为每台节点分配独立路径:
<configuration> <!-- NameNode 元数据目录(仅 node-0001 使用)--> <property> <name>dfs.namenode.name.dir</name> <value>file:/home/modules/data/namenode</value> </property> <!-- DataNode 数据目录(每台节点不同)--> <property> <name>dfs.datanode.data.dir</name> <value>file:/home/modules/data/datanode-0001</value> </property> <!-- 副本数(三节点集群设为 2 即可)--> <property> <name>dfs.replication</name> <value>2</value> </property> <!-- 关闭权限检查(开发环境简化)--> <property> <name>dfs.permissions.enabled</name> <value>false</value> </property> </configuration>提示:
dfs.datanode.data.dir值需按节点定制:
- node-0001 →
/home/modules/data/datanode-0001- node-0002 →
/home/modules/data/datanode-0002- node-0003 →
/home/modules/data/datanode-0003执行前先创建目录:mkdir -p /home/modules/data/datanode-0001
4.3 yarn-site.xml 与 mapred-site.xml:资源调度最小化配置
YARN 配置以最小可用为原则,避免内存溢出(arm64 内存有限):
<!-- yarn-site.xml --> <configuration> <property> <name>yarn.resourcemanager.hostname</name> <value>node-0001</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>3072</value> <!-- 3GB,占总内存 75% --> </property> <property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>512</value> </property> </configuration><!-- mapred-site.xml(重命名 template)--> <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.map.memory.mb</name> <value>1024</value> </property> <property> <name>mapreduce.reduce.memory.mb</name> <value>2048</value> </property> </configuration>4.4 slaves 文件:必须用主机名,禁用 IP
$HADOOP_HOME/etc/hadoop/slaves决定 DataNode 启动节点。内容必须为:
node-0001 node-0002 node-0003严禁写成 IP 地址。Hadoop 启动脚本会调用ssh node-0002,若/etc/hosts未解析则失败。
5. 避坑指南:Hadoop 启动失败的五个高频现象与根因修复
5.1 现象:hdfs namenode -format报ClassNotFoundException: org.apache.hadoop.hdfs.server.namenode.NameNode
原因:HADOOP_CLASSPATH未包含hadoop-aws-2.8.3.jar或aws-java-sdk-bundle-1.11.375.jar,或 jar 包路径错误。
解决:
- 检查 jar 是否存在:
ls $HADOOP_HOME/share/hadoop/tools/lib/ | grep -E "(aws|hadoop-aws)" - 若 jar 名为
hadoop-aws-2.8.3.jar,则HADOOP_CLASSPATH必须精确匹配; - 若 jar 名含时间戳(如
hadoop-aws-2.8.3-20230101.jar),需更新HADOOP_CLASSPATH; - 执行
hadoop classpath确认输出中包含该 jar 路径。
5.2 现象:start-dfs.sh后jps显示 NameNode 不存在,日志报Invalid maximum heap size
原因:hadoop-env.sh中HADOOP_HEAPSIZE_MAX设置过大,超出 arm64 JVM 限制。
解决: 编辑$HADOOP_HOME/etc/hadoop/hadoop-env.sh,取消注释并修改:
# 修改前(默认 1000m,对 arm64 过大) # export HADOOP_HEAPSIZE_MAX=1000 # 修改后(实测稳定值) export HADOOP_HEAPSIZE_MAX=768 export HADOOP_NAMENODE_INIT_HEAPSIZE="768"5.3 现象:hadoop fs -ls obs://hadoop-demo-bucket/返回403 Forbidden
原因:OBS 桶策略未授权当前 AK/SK,或core-site.xml中fs.obs.access.key值错误。
解决:
- 登录 OBS 控制台 → 桶 → 「权限管理」→ 「桶策略」,确认策略允许
obs:GetObject; - 检查
core-site.xml中fs.obs.access.key值是否与credentials.csv第二列完全一致(区分大小写、无空格); - 执行
hadoop fs -ls obs://(无桶名),若返回404 Not Found则 endpoint 正确;若仍403,检查 AK/SK 是否过期。
5.4 现象:DataNode 启动后立即退出,hadoop-daemon.log报Cannot create directory /home/modules/data/datanode-0001/current
原因:dfs.datanode.data.dir目录权限不足,或父目录/home/modules/data属主非当前用户。
解决:
# 递归修正权限(三台节点均执行) sudo chown -R $USER:$USER /home/modules/data sudo chmod -R 755 /home/modules/data # 手动创建缺失目录 mkdir -p /home/modules/data/datanode-0001/current5.5 现象:yarn node -list显示0 active nodes,yarn-daemon.log报Connection refused到node-0001:8031
原因:yarn-site.xml中yarn.resourcemanager.hostname值与/etc/hosts解析不一致。
解决:
- 执行
ping node-0001,确认返回124.70.110.126; - 若返回其他 IP,编辑
/etc/hosts删除旧条目,重新添加124.70.110.126 node-0001; - 重启 YARN:
stop-yarn.sh && start-yarn.sh。
6. 验证与进阶技巧:用 OBS 作为 HDFS 替代存储的三个实操场景
6.1 场景一:将本地文件直传 OBS,跳过 HDFS 中转
传统流程:local → hdfs dfs -put → mapreduce → hdfs dfs -get。在鲲鹏云上,OBS 可直接作为计算输入源,大幅减少 I/O:
# 上传测试文件(10MB 随机数据) dd if=/dev/urandom of=/tmp/test-data.txt bs=1M count=10 # 直接上传至 OBS(无需启动 HDFS) hadoop fs -put /tmp/test-data.txt obs://hadoop-demo-bucket/input/ # 验证上传(返回文件大小即成功) hadoop fs -ls obs://hadoop-demo-bucket/input/ # 输出:-rwxrwxrwx 3 roy_yuki supergroup 10485760 2023-09-01 10:00 obs://hadoop-demo-bucket/input/test-data.txt提示:
hadoop fs -put对 OBS 的支持依赖core-site.xml中fs.obs.impl和fs.obs.path.style.access正确配置。若报错,请回溯第 4.1 节。
6.2 场景二:MapReduce 作业直接读写 OBS,配置job.xml参数
编写 MapReduce 程序时,需在Job实例中显式设置 OBS 输入输出:
// Java 代码片段(需引入 hadoop-aws 依赖) Configuration conf = new Configuration(); conf.set("fs.obs.impl", "org.apache.hadoop.fs.obs.OBSFileSystem"); conf.set("fs.obs.endpoint", "https://obs.cn-north-4.myhuaweicloud.com"); conf.set("fs.obs.access.key", "S8RSFKYBTOSPA9YX92XB"); conf.set("fs.obs.secret.key", "gjGNhoN8NkApdf4zjKcNDpLsQdsBW1RXl117E06q"); Job job = Job.getInstance(conf, "obs-mapreduce"); job.setInputFormatClass(TextInputFormat.class); job.setOutputFormatClass(TextOutputFormat.class); // 输入输出路径均为 obs:// FileInputFormat.addInputPath(job, new Path("obs://hadoop-demo-bucket/input/")); FileOutputFormat.setOutputPath(job, new Path("obs://hadoop-demo-bucket/output/"));打包提交命令:
# 打包时包含 hadoop-aws 依赖 hadoop com.sun.tools.javac.Main ObsWordCount.java jar cf obs-wordcount.jar ObsWordCount*.class # 提交作业(指定 OBS 为默认 FS) hadoop jar obs-wordcount.jar ObsWordCount \ -D fs.defaultFS=obs://hadoop-demo-bucket/ \ obs://hadoop-demo-bucket/input/ \ obs://hadoop-demo-bucket/output/6.3 场景三:Hive on OBS —— 复用 Hadoop 配置快速启用数据仓库
Hive 可直接复用 Hadoop 的 OBS 配置,只需在hive-site.xml中指定 warehouse 目录为 OBS:
<!-- hive-site.xml --> <property> <name>hive.metastore.warehouse.dir</name> <value>obs://hadoop-demo-bucket/hive/warehouse</value> </property> <property> <name>hive.exec.scratchdir</name> <value>obs://hadoop-demo-bucket/hive/tmp</value> </property>启动 Hive CLI 后执行:
-- 创建外部表指向 OBS 数据 CREATE EXTERNAL TABLE logs ( ip STRING, time STRING, method STRING, url STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' LOCATION 'obs://hadoop-demo-bucket/weblogs/'; -- 查询(数据实际存储在 OBS,Hive 仅管理元数据) SELECT COUNT(*) FROM logs;注意:Hive 2.x 需额外添加
hive-site.xml中hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat以优化 OBS 小文件读取。
从那以后我每次部署鲲鹏云 Hadoop,都会强制走一遍这五步验证:①java -version输出路径与JAVA_HOME一致;②hadoop classpath包含hadoop-aws.jar;③hadoop fs -ls obs://返回桶列表;④hdfs dfsadmin -report显示 3 个 live datanode;⑤yarn node -list显示 3 个 active nodes。少一步,后面两小时都在查日志。希望帮到你。
本文还有配套的精品资源,点击获取