简介:面向鲲鹏云与大数据入门学习者,这份实验报告以华为云环境为基础,完整记录了从购买华为云ECS、开通OBS并获取AK/SK,到下载OpenJDK与相关jar包、搭建并配置Hadoop集群的实践过程。内容覆盖三个节点的互信配置、SSH免密登录、/etc/hosts节点识别、目录创建,以及core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml、slaves等核心文件的编写与调整;同时记录了因Java家目录错误导致的重新分发、/etc/profile修正、NameNode初始化和HDFS启动排错过程,适合对照真实云环境逐步复现Hadoop部署的读者。资源为1个docx文档,压缩包2.52MB,已有891人学习;文档按华为云准备、购买OBS、集群搭建、节点配置等阶段组织,便于按步骤翻阅与复现。通过这份实验材料,可系统掌握OBS作为数据源的AK/SK认证与Endpoint配置、Hadoop多节点同步分发方法,以及HDFS/YARN/MapReduce相关参数的设置思路。
1. ARM 云主机上搭 Hadoop:这份实验 docx 替你把前半程的坑都踩完了
这周拆了一份某云平台的大数据实验报告 docx,通篇就是一件事:在鲲鹏 ARM 架构的三台云主机上,从零把 Hadoop 2.8.3 集群跑起来。文档里没有花哨理论,全是购买云资源、配置节点互信、改 core-site.xml、初始化 NameNode 这种“做完一遍才能写出来”的过程记录。我翻到一半最明显的感知是,作者被同一件事折腾了三次:JAVA_HOME 路径写错、分发 Hadoop 包后配置不一致、格式化 NameNode 失败。对正在写鲲鹏云大数据实验报告、或者第一次在 ARM 云主机上复现三节点 Hadoop 的同学,这份 docx 的真正价值不是命令列表,而是把选型、配置、失败路径一次性串好,省掉你至少一周的试错时间。
2. 云环境与对象存储:三台 ARM ECS 加一个并行文件系统怎么选
2.1 购买 ECS:三台同规格 ARM 实例是起步配置
实验报告的第一步是购买弹性云服务器,文档里只写了“购买 ECS 确认配置”,但没解释为什么是三台、为什么都要同一规格。我的判断是:Hadoop 的元数据节点和计算节点解耦,一个 NameNode 加两个 DataNode 是最小可用集群,既能跑通实验,又能看到数据块复制和故障转移的现象。
选型层面有几个关键点:
镜像必须是 arm64 版本。鲲鹏这类 ARM 服务器和 x86 的软件包不通用,公共镜像那边要挑带 aarch64 字段的版本。文档里反复出现的aarch64后缀就是 ARM 64 位架构标识,装错 x86 的 OpenJDK 会在启动时报无法执行二进制文件。
三台机器建议在同一个 VPC 和安全组里。文档中购买时没有强调网络,但后文配置/etc/hosts时用的是节点内网通信。如果三台机器不在同一子网,Hadoop 的 RPC 通信和 SSH 互信会走公网,又慢又不安全。
规格方面,实验场景不需要很大的存储和内存,建议参考这个配置:
| 角色 | 建议规格 | 系统盘 | 镜像 |
|---|---|---|---|
| node-0001(master) | 4 vCPU / 8GB | 40GB | arm64 公共镜像 |
| node-0002(worker) | 4 vCPU / 8GB | 40GB | arm64 公共镜像 |
| node-0003(worker) | 4 vCPU / 8GB | 40GB | arm64 公共镜像 |
购买完成后,安全组需要放通以下端口,否则集群脚本之间会互相连不上:
| 端口 | 用途 |
|---|---|
| 22 | SSH 登录和节点互信 |
| 8020 | NameNode RPC |
| 50070 | NameNode Web UI |
| 8088 | YARN ResourceManager Web UI |
| 8030 / 8031 / 8032 | ResourceManager 调度和 RPC |
| 8040 / 8041 | NodeManager 通信 |
| 19888 | JobHistory Server |
2.2 OBS 并行文件系统:为什么不是普通对象桶
实验报告里明确写了创建“并行文件系统”,这一点很多初次接触的人会忽略。对象存储服务底层的普通桶是按对象语义设计的,追加写、重命名、目录列举这类操作性能很差,甚至部分语义不支持。Hadoop 的 OutputStream 写入模式需要反复rename临时文件,普通桶会频繁触发服务端拷贝,跑出来的结果就是任务慢、偶发失败。
并行文件系统在对象存储上层做了一层 POSIX 兼容语义,支持并发读写、目录层级操作和移动文件,适合做 HDFS 的底层存储或冷数据归档。文档里的做法是在控制台里创建并行文件系统,而不是创建标准存储桶。
操作路径大概是:进入对象存储服务控制台,在“并行文件系统”标签页点创建,然后填:
| 配置项 | 填写建议 |
|---|---|
| 名称 | 全小写字母和数字,比如obs-hadoop-test |
| 区域 | 和 ECS 在同区域,省跨区域流量费 |
| 存储类别 | 标准存储,实验场景别选冷存储 |
| 多AZ | 实验可以关掉,生产环境按数据重要性开启 |
创建之后进入桶的概览页,你会看到两个访问地址:IPv4 地址和双栈地址。文档里记录的格式类似这样:
| 访问方式 | 地址形态 | 使用场景 |
|---|---|---|
| IPv4 | obs.<region>.example.com | Hadoop 客户端常规访问 |
| 双栈 | obs.dualstack.<region>.example.com | 需要 IPv4/IPv6 双栈兼容的环境 |
注意,后面配置core-site.xml时fs.obs.endpoint只填域名,不要带https://,也不要带桶名前缀。
2.3 获取 AK/SK:credentials.csv 是集群访问 OBS 的钥匙
文档在创建完并行文件系统之后,强调“打开即可得到 AK/SK”,并且生成了一个credentials.csv文件。这个文件就是云平台账号的访问密钥对,Hadoop 访问 OBS 时要拿它做身份认证。
credentials.csv通常是三列:
| 字段 | 值 |
|---|---|
| User Name | 创建密钥的 IAM 用户 |
| Access Key Id | 类似AKIAXXXXXXXXXXXXXXXX的访问密钥 ID |
| Secret Access Key | 一串用于签名请求的私钥 |
我一般会直接在控制台的“访问密钥”页面创建,系统下载了一份 csv 后,把文件存到不会被 Git 同步的地方。密钥一旦泄露,对方就等于拿到了你对 OBS 内数据的读写权限。
权限最小化也很重要。实验场景只需要这个密钥对并行文件系统做读写,不建议直接给到全局管理权限。后在 IAM 里给该用户绑定“对象存储服务 OBS 只读和对象读写”的策略,再在桶的权限策略里限定指定桶即可。
3. 互信与 Java 环境:三节点通信和 ARM JDK 路径的坑
3.1 配置 hosts 与 SSH 无密码登录
Hadoop 启动脚本会自动从 master 节点 SSH 到所有 worker 节点,拉起 DataNode 和 NodeManager 进程。如果每次登录都要输密码,脚本会卡在交互提示上。所以文档里的第一步就是配置节点互信。
先在每台节点的/etc/hosts里加入三台机器的解析,使用内网 IP:
cat >> /etc/hosts << EOF 10.0.0.11 node-0001 10.0.0.12 node-0002 10.0.0.13 node-0003 EOF上面命令的作用是把节点名解析到内网 IP,这样 SSH 和 Hadoop 配置里都直接用node-0001这类主机名,避免 IP 写得到处都是。文档里也明确写了“各节点执行”,意思是三台机器都要做,不能只在 master 上改。
接下来生成 RSA 密钥并分发到各节点:
# 在三个节点都执行:生成 RSA 密钥,-N "" 表示空密码 ssh-keygen -t rsa -b 2048 -N "" -f /root/.ssh/id_rsa # 在 node-0001 上执行:把本机公钥追加到另外两个节点的信任列表 ssh-copy-id -i /root/.ssh/id_rsa.pub root@node-0002 ssh-copy-id -i /root/.ssh/id_rsa.pub root@node-0003ssh-keygen生成一对密钥,ssh-copy-id把公钥写到目标节点的~/.ssh/authorized_keys文件。首次执行会问密码,之后再用ssh node-0002 date就不需要输入了。
我测试时发现,如果用户不是 root,需要确认目标目录权限,authorized_keys的权限不能太放,一般建议chmod 600,否则 SSH 会拒绝加载公钥。
3.2 安装 OpenJDK:注意 aarch64 后缀的路径
Hadoop 2.8.3 还跑在 Java 8 上,所以文档里下载的是 OpenJDK 8。在 ARM 云主机上,软件仓库里的 OpenJDK 包名会带aarch64标识。
# 在三台节点分别执行:安装 JDK 8 的完整开发包 yum install -y java-1.8.0-openjdk-devel # 安装后确定实际安装目录 ls /usr/lib/jvm/执行ls后会看到类似这样的目录名:
java-1.8.0-openjdk-1.8.0.242.b08-1.h5.oe1.aarch64这个目录字符串看着别扭,但它是 ARM 架构下的真实路径。文档里反复出现的“javahome 错误”就是出在这里:很多人直接抄网上的/usr/lib/jvm/java-1.8.0-openjdk,但这个目录在部分发行版里不存在,必须写成完整版本号路径。
然后配置环境变量,三台节点都写入/etc/profile末尾:
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-2.8.3 export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin这里HADOOP_HOME是下一章才解压的路径。配置好之后执行source /etc/profile让它立即生效,然后java -version看输出。如果显示的还是系统自带的老版本,说明PATH里旧路径排在了前面。
文档里提到“无密码跳转”,实际就是用ssh node-0002验证互信。如果登录后java -version报找不到命令,那就是/etc/profile没有在 SSH 非交互模式下被加载。
4. Hadoop 配置落盘:core-site、yarn-site、slaves 逐个填
4.1 解压安装包与目录规划
实验文档在 node-0001 上先创建了两个目录:/home/modules/data/buf和/home/nm/localdir。前者我一般用作 NameNode 元数据落盘目录,后者用作 DataNode 数据块目录。
# 在 node-0001 上执行,创建 HDFS 元数据和数据落盘目录 mkdir -p /home/modules/data/buf mkdir -p /home/nm/localdir # 解压 Hadoop 安装包到统一目录 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。这里有个容易被忽略的点:下载的 OBS 相关适配 jar 包,要去掉旧包后复制进$HADOOP_HOME/share/hadoop/common/lib/里,确保 OBS 文件系统类能被加载。
4.2 core-site.xml:AK/SK 与 Endpoint 是关键
核心配置文件是$HADOOP_HOME/etc/hadoop/core-site.xml。文档里专门提到要改 AK、SK、Endpoint。
<configuration> <!-- 默认文件系统:这里保留 HDFS,方便先跑通内部流程 --> <property> <name>fs.defaultFS</name> <value>hdfs://node-0001:8020</value> </property> <!-- OBS 访问密钥 --> <property> <name>fs.obs.access.key</name> <value>your-access-key</value> </property> <property> <name>fs.obs.secret.key</name> <value>your-secret-key</value> </property> <!-- OBS Endpoint:去掉 https:// 前缀,使用控制台复制的值 --> <property> <name>fs.obs.endpoint</name> <value>obs.<region>.example.com</value> </property> <!-- OBS 文件系统实现类:按实际 jar 包调整 --> <property> <name>fs.obs.impl</name> <value>org.apache.hadoop.fs.obs.OBSFileSystem</value> </property> </configuration>参数说明:
fs.defaultFS设成 HDFS 的 RPC 地址,集群内部流程先走 HDFS;如果文档要求的实验是纯 OBS 模式,可以改成obs://your-bucket/。fs.obs.access.key和fs.obs.secret.key填的是credentials.csv里那两列,别把User Name也填进去。fs.obs.endpoint在这里最容易翻车,控制台复制下来的地址可能带https://,填进去之后客户端会拼接出错误的 URL。
4.3 hdfs-site.xml、yarn-site.xml、mapred-site.xml 和 slaves
接着改 HDFS 的落盘目录:
<configuration> <property> <name>dfs.namenode.name.dir</name> <value>file:///home/modules/data/buf</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:///home/nm/localdir</value> </property> <property> <name>dfs.replication</name> <value>2</value> </property> </configuration>dfs.namenode.name.dir存 NameNode 的编辑日志和镜像,dfs.datanode.data.dir是 DataNode 实际数据块落盘目录。实验只有两个 DataNode,副本数设 2 就能完整看到块复制。
YARN 配置:
<configuration> <property> <name>yarn.resourcemanager.hostname</name> <value>node-0001</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>yarn.resourcemanager.hostname指向 master 节点,mapreduce_shuffle是 MapReduce 任务在 NodeManager 上的辅助服务,缺少它会导致任务提交后一直卡在 ACCEPTED 状态。
MapReduce 框架选择:
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>最后编辑slaves文件,列出所有 worker:
node-0002 node-0003这里注意,Hadoop 2.x 用slaves,3.x 改成了workers。文档用的 2.8.3,所以文件还是slaves。如果你下载的是 3.x 安装包,文件名要同步改。
4.4 环境变量与配置分发
在 node-0001 上改好所有配置后,还要把改动同步到 node-0002 和 node-0003,否则只有 master 知道有哪些配置,worker 节点拿到的是默认值,集群行为不会一致。
# 同步 Hadoop 安装目录 rsync -av /home/modules/hadoop-2.8.3 root@node-0002:/home/modules/ rsync -av /home/modules/hadoop-2.8.3 root@node-0003:/home/modules/ # 同步 hosts 和 profile scp /etc/hosts /etc/profile root@node-0002:/etc/ scp /etc/hosts /etc/profile root@node-0003:/etc/同步完成后,到两个 worker 节点执行source /etc/profile和hadoop version,确认版本一致。这一步值得做,因为文档里最典型的问题就是“改了配置忘分发”,后面启动集群时出现各种玄学报错,查半天才发现是节点配置不一致。
5. 启动前的避坑手册:JAVA_HOME、分发与 AK/SK 三个高危点
全文最值得反复看的部分是作者对“javahome 错误”的三次修复。我顺着文档里的失败记录,整理出五条高频踩坑记录,每条都按现象、原因、解决来写。
5.1 坑一:JAVA_HOME 路径指向不存在的目录
现象:执行hdfs namenode -format或start-dfs.sh时,脚本报错Error: JAVA_HOME is not set correctly,或者直接提示找不到/usr/lib/jvm/java-1.8.0-openjdk。
原因:ARM 云主机的 OpenJDK 安装目录带完整版本号和aarch64后缀。文档里明确给出的是java-1.8.0-openjdk-1.8.0.242.b08-1.h5.oe1.aarch64,很多人照抄通用教程写成不带版本号的路径,而这个路径在系统里根本不存在。
解决:先执行ls /usr/lib/jvm/看到真实目录名,再修改/etc/profile里的JAVA_HOME。如果想省事,也可以做一个软链:
ln -s /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.h5.oe1.aarch64 /usr/lib/jvm/java-1.8.0之后JAVA_HOME指向/usr/lib/jvm/java-1.8.0也可以。软链方案的好处是以后升级 JDK 只需要改软链,不用再动配置文件。
5.2 坑二:改完 profile 没有 source,环境变量不生效
现象:在 SSH 登录到其他节点执行java -version时,显示的还是旧版本或报找不到 Java;但手动执行bash之后再查又是好的。
原因:/etc/profile只在登录 shell 启动时加载。如果你是用ssh node-0002直接执行命令,非交互式会话不会重新读取 profile,自然拿不到刚配置的JAVA_HOME。
解决:每个节点改完/etc/profile后都要执行一次source /etc/profile。如果是通过ssh远程执行,建议用ssh root@node-0002 'source /etc/profile && java -version'来验证。
5.3 坑三:配置只改 master,忘了重新分发到 worker
现象:集群能启动,但运行 MapReduce 任务时报java.io.IOException: File ... could only be replicated to 0 nodes,或者 YARN Web UI 上只有 master 有 NodeManager。
原因:只在 node-0001 上改了core-site.xml和hdfs-site.xml,worker 节点还是旧配置。DataNode 启动后上报的存储目录和 NameNode 不一致,导致块复制失败。
解决:分发配置后,在三个节点分别执行hdfs getconf -confKey dfs.datanode.data.dir,看输出的目录路径是否一致。不一致就重新rsync,并重启 HDFS 服务。
5.4 坑四:AK/SK 填错或 Endpoint 带了协议前缀
现象:执行hdfs dfs -ls obs://your-bucket/时,报AccessDenied或The request signature we calculated does not match。
原因:有两类原因,一类是credentials.csv里的 Secret Access Key 复制时带了换行或空格;另一类是fs.obs.endpoint填了https://obs.<region>.example.com,导致客户端签名时的域名和服务端不一致。
解决:重新用cat -A credentials.csv查看文件,确认没有不可见字符。Endpoint 只填纯域名,不填协议前缀。改完配置后source /etc/profile并重启 HDFS 相关进程再试。
5.5 坑五:NameNode 格式化失败,残留目录没有清干净
现象:第一次hdfs namenode -format因为 JAVA_HOME 错误失败了,修正路径后再执行,提示NameNode has been already formatted或直接创建目录时报文件已存在。
原因:格式化失败时会在/home/modules/data/buf残留current/VERSION等文件。第二次格式化前没有清空这个目录,HDFS 检查到已格式化状态,拒绝重复初始化。
解决:先把残留目录清空,再重新创建,最后格式化:
# 在 node-0001 上执行,清空旧元数据目录 rm -rf /home/modules/data/buf/* mkdir -p /home/modules/data/buf # 重新初始化 NameNode hdfs namenode -format这里就是所谓的“后悔药”步骤,任何 NameNode 格式化失败,第一件事永远是检查旧目录有没有清干净,而不是反复尝试 format 命令。
6. 启动验证与技巧:格式化 NameNode、启动 HDFS、测 OBS 写入
6.1 从格式化到进程启动
前四章配置做完,启动顺序是固定的:先在 node-0001 格式化 NameNode,再启动 HDFS,最后启动 YARN。
# 在 node-0001 上执行,只在首次搭建时格式化 hdfs namenode -format # 启动 HDFS 和 YARN start-dfs.sh start-yarn.sh # 检查各节点进程 jps格式化成功后,NameNode 进程、DataNode 进程、ResourceManager、NodeManager 都会出现在jps结果里。master 上应该有NameNode、SecondaryNameNode、ResourceManager;worker 上应该有DataNode和NodeManager。如果某个 worker 缺进程,先去查对应节点的$HADOOP_HOME/logs下的日志,最常见的就是 SSH 互信没配好。
6.2 验证 OBS 读写:一条命令看出配置是否生效
集群内部的 HDFS 通了还不够,实验报告的核心是用 OBS 作为数据存储。验证方式很简单:
# 查看 OBS 并行文件系统根目录 hdfs dfs -ls obs://your-bucket/ # 把本地文件写入 OBS hdfs dfs -put /etc/hosts obs://your-bucket/test-input/ # 从 OBS 读回本地 hdfs dfs -get obs://your-bucket/test-input/hosts /tmp/hosts-back能完成put和get,说明 AK/SK、Endpoint、OBS 适配 jar 全部正常。注意这里的your-bucket必须是并行文件系统名称,不能是普通桶名。
从那以后,我每次搭集群都会把“核对 JAVA_HOME、source profile、三节点 diff 配置文件”这三步强制走一遍,再碰格式化命令,几乎没有再翻过车。希望这些记录能帮你把这份 docx 里的实验顺利跑通。
本文还有配套的精品资源,点击获取