简介:这份实验报告记录了在华为鲲鹏云环境中从零搭建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 互信与 JDK
3.1 修改 /etc/hosts:节点名和 IP 的对应关系要全
三台节点的操作系统装好后,第一件事是配置主机名映射。实验报告里三台节点的 IP 分别是 192.168.1.101、192.168.1.102、192.168.1.103,下面统一用这三个内网地址做演示。先给每台机器设置 hostname:
hostnamectl 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 能解析到内网 IP:
ping -c 3 node-0002这个步骤的常见坑是只改了 NameNode 的 /etc/hosts,DataNode 上没改,结果从 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 root@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-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.0,Hadoop 启动时找不到实际的 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.xml:OBS 的 AK/SK 和 endpoint 是配置核心
进入 /home/modules/hadoop/etc/hadoop 目录,编辑 core-site.xml。这是 Hadoop 的核心配置,这里把 OBS 对象存储并入了 Hadoop 的默认文件系统。配置内容如下:
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://node-0001:9000</value> </property> <property> <name>fs.obs.access.key</name> <value>AKIAEXAMPLEACCESSKEY</value> </property> <property> <name>fs.obs.secret.key</name> <value>EXAMPLEAESECRETKEYVALUE</value> </property> <property> <name>fs.obs.endpoint</name> <value>obs.cn-north-4.examplecloud.com</value> </property> <property> <name>fs.obs.impl</name> <value>org.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 和 SK;fs.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> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/home/modules/data/namenode</value> </property> <property> <name>dfs.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> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.resourcemanager.hostname</name> <value>node-0001</value> </property> <property> <name>yarn.nodemanager.local-dirs</name> <value>/home/nm/localdir</value> </property> </configuration>mapred-site.xml 配置:
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>slaves 文件定义 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-0003
node-0001 上所有配置完成后,用 scp 把整个 hadoop 目录分发到另外两台节点:
scp -r /home/modules/hadoop root@node-0002:/home/modules/ scp -r /home/modules/hadoop root@node-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 root@node-0002 "source /etc/profile && hadoop version" ssh root@node-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.0,Hadoop 启动脚本用这个路径去找 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 root@node-0002 的连接失败。
原因:虽然交互式登录能免密,但 Hadoop 的启动脚本使用 ssh 执行远程命令时,目标节点的 root 用户的 authorized_keys 里缺少 node-0001 的公钥,原因是密钥是在普通用户下生成的,公钥内容不匹配。
解决:统一在 root 用户下生成密钥,确认 /root/.ssh/authorized_keys 中确实包含 node-0001 的 id_rsa.pub 内容。用ssh root@node-0002 "hostname"验证远程命令能执行成功后再启动 Hadoop。
6. 验证集群跑通:从 jps 到 wordcount 一步不落
集群配置完后,不能只看屏幕上输出 Started 就认为成功,Hadoop 集群必须通过进程检查、服务状态和实际任务三个层面验证。
先在 node-0001 上执行格式化(仅首次部署需要):
hdfs namenode -format格式化完成后启动 HDFS 和 YARN:
start-dfs.sh start-yarn.sh在三台节点分别执行 jps,node-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 集群一次装通。
本文还有配套的精品资源,点击获取