华为云鲲鹏ECS搭建Hadoop集群:从OBS对接与JAVA_HOME避坑实战 简介这份《鲲鹏云大数据实验docx》是一份面向云计算与大数据初学者的实操型实验报告完整记录了在华为云鲲鹏环境中搭建Hadoop集群的全过程。文档从购买弹性云服务器ECS、创建OBS并行文件系统并获取AK/SK开始逐步展开Node0001、Node0002、Node0003三个节点的配置涵盖/etc/hosts节点互信、SSH免密登录、目录结构创建、core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml及slaves文件编写并针对Java_home配置错误导致的启动失败给出了重新分发、修正环境变量、初始化NameNode和启动HDFS的完整排错过程。资源为单份docx文档压缩包大小约2.52MB步骤与命令记录具体便于按序复现关键操作均标明节点与执行位置适合边读边对照。目前已有892人学习下载。读者可从中获得一套可借鉴的云上大数据集群部署思路也能避开环境配置中的典型坑点对掌握华为云OBS与Hadoop的集成尤为实用。1. 鲲鹏云大数据实验从买ECS到启动HDFS的完整链路《鲲鹏云大数据实验docx》这份实验文档记录的不是什么高深算法而是把一套三节点Hadoop集群从零跑起来的全过程购买华为云ECS、创建OBS并行文件系统、获取AK/SK、配置节点互信、改五个XML配置文件、初始化NameNode、启动HDFS。最值钱的部分藏在文档里反复出现的“javahome错误”里——我第一次照着复现时光是这个变量就折腾了一个下午最后发现ARM架构的JDK路径和x86完全不是一个套路。这份文档适合正要做鲲鹏云大数据实验的学生也适合要在国产化ARM环境里部署Hadoop的从业者照着跑一遍能省掉大量试错成本。2. 准备华为云环境ECS规格与OBS并行文件系统的选择2.1 为什么实验要先买ECS和OBS实验文档的完整链路是“云资源准备 → 集群搭建 → 配置 → 启动”第一步就是准备华为云环境。三节点Hadoop集群需要三台ECS分别承担不同角色node-0001作为主节点跑NameNode和ResourceManagernode-0002和node-0003作为从节点跑DataNode和NodeManager。这里有个容易被忽略的点Hadoop集群节点之间要互相通信如果三台ECS不在同一个VPC内网里后面配置/etc/hosts时填公网IP会非常别扭。我一般会在购买时就选同一个区域、同一个VPC让三台机器有内网互通能力。OBS在实验中的作用不是“备份数据”而是作为Hadoop的底层存储对接目标。通过core-site.xml里配置的AK/SK和endpointHDFS可以把数据直接写到OBS并行文件系统上相当于用云对象存储替代了本地三副本数据盘。实验文档里特意选了“并行文件系统”而不是普通对象桶是因为并行文件系统对Hadoop这种需要随机读写的场景支持更好Hadoop的OBS插件对接并行文件系统时稳定性也更高。2.2 购买ECS与镜像选型实验文档里三个节点的IP都在华为云上操作系统环境从后续JDK包名里的“oe1”后缀可以判断大概率是openEuler系镜像。鲲鹏CPU是ARM架构所以镜像一定要选带arm64标识的JDK也必须用aarch64版本这一点在实验文档的javahome错误里反复出现后面我会专门展开。购买ECS时我的建议是三台相同规格2核4GB起步系统盘40GB够用。实验场景选按需计费就行做完实验及时释放避免持续扣费。安全组至少要放通22端口SSH、8020端口NameNode RPC、50070端口NameNode Web UI、8088端口YARN Web UI不放通的话后面浏览器访问管理界面会直接超时。材料里记录的124.70.110.126这类地址是弹性公网IP实际配置时我建议把三个节点的内网IP先记下来后面/etc/hosts里用的是内网通信地址。2.3 创建OBS并行文件系统与获取AK/SK进入华为云控制台搜索OBS服务创建并行文件系统。区域要和后续ECS保持一致实验文档用的是华北-北京四cn-north-4这个区域代码后面配置endpoint时直接用到。创建完成后进入桶能看到OBS提供的访问地址实验文档里记了两个地址类型地址使用场景IPv4地址obs.cn-north-4.myhuaweicloud.com默认场景IPv4网络访问双栈地址obs.dualstack.cn-north-4.myhuaweicloud.com需要IPv6访问的场景两者的区别在于双栈地址额外支持IPv6协议栈实验环境用第一条就够了。接着在控制台的“我的凭证”里下载credentials.csv打开后是三列User Name、Access Key Id、Secret Access Key。这个Access Key Id和Secret Access Key就是后面core-site.xml里要填的AK/SK属于最高级别的敏感凭据千万不要复制实验文档里贴出来的示例值直接用必须用自己的。3. 三节点互信与JDK环境集群通信的底层基础3.1 /etc/hosts让三个节点互相叫得上名字Hadoop集群启动时主节点要通过主机名去找从节点所以/etc/hosts是第一步。三个节点上都要执行vim /etc/hosts把三台机器的内网IP和主机名写进去格式如下# /etc/hosts 追加内容 10.0.0.11 node-0001 10.0.0.12 node-0002 10.0.0.13 node-0003这里有个经验hosts里一定要用内网IP不要用公网IP。材料里记录的124.70.110.126等地址是绑定的弹性公网IP如果写进hosts节点之间通信会绕公网不但慢而且安全组策略稍微严一点就直接不通。主机名node-0001、node-0002、node-0003要和后面slaves文件里的名字完全一致大小写都不能差否则HDFS启动时会报“无法解析主机名”。3.2 SSH免密登录三步打通节点互信集群里NameNode要远程启动DataNode进程所以主节点到所有从节点必须免密登录。实验文档里的做法是“生成密钥 → 分发公钥 → 首次连接选yes”对应到命令就是# 在 node-0001 上生成 RSA 密钥对 ssh-keygen -t rsa -P # 查看公钥内容并复制 cat /root/.ssh/id_rsa.pub # 在 node-0002、node-0003 上执行追加到 authorized_keys echo ssh-rsa 公钥内容 rootnode-0001 ~/.ssh/authorized_keys # 回 node-0001 验证免密 ssh node-0002 date ssh node-0003 date生成密钥时加-P 参数是为了不设置口令这样SSH登录时不需要额外输入密码公钥追加到authorized_keys之后SSH服务端会比对客户端私钥签名匹配就放行。最后一步验证能看到日期输出就说明免密通了。实验文档里那句“执行后选yes”指的是首次SSH连接时确认目标主机指纹在自动化脚本场景下可以用-o StrictHostKeyCheckingno跳过但手工操作时选yes确认一次更稳妥。3.3 OpenJDK安装与JAVA_HOME完整路径实验材料里出现的JDK路径是java-1.8.0-openjdk-1.8.0.242.b08-1.h5.oe1.aarch64注意结尾的aarch64——这就是ARM架构的标志。x86服务器上常见的路径是java-1.8.0-openjdk-1.8.0.xxx.x86_64到鲲鹏上就变成aarch64版本。安装完成后Java的安装目录在/usr/lib/jvm下但具体子目录名会因为发行版不同有差异所以必须先ls看一下实际目录名。JAVA_HOME的正确配置方式是写全路径而不是软链路径示例代码如下# 在每个节点上确认实际 JDK 目录名 ls /usr/lib/jvm/ # 编辑 /etc/profile 追加以下内容 export JAVA_HOME/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.h5.oe1.aarch64 export PATH$JAVA_HOME/bin:$PATH # 立即生效并验证 source /etc/profile java -version不要写成export JAVA_HOME/usr/lib/jvm/java-1.8.0这种软链路径因为不同发行版里软链的解析行为不统一Hadoop的启动脚本在部分系统上会解析成无效目录。实验文档里反复出现的javahome错误根源就是把路径写成了通用目录。改完/etc/profile后每个节点都必须执行source这个问题后面第5章还会重点展开。4. Hadoop配置与OBS对接五个配置文件的关键参数4.1 安装目录与数据目录规划Hadoop安装包在实验文档里是hadoop-2.8.3.tar.gz解压到/home/modules下。在解压之前先创建两个关键目录mkdir -p /home/modules/data/buf mkdir -p /home/nm/localdir cd /home/modules tar -zxvf hadoop-2.8.3.tar.gz这两个目录不是随便建的。/home/modules/data/buf是NameNode的元数据目录后面hdfs-site.xml里的dfs.namenode.name.dir会引用它/home/nm/localdir是NodeManager处理MapReduce中间结果的本地目录yarn-site.xml里的yarn.nodemanager.local-dirs会引用它。先把目录建好再改配置逻辑上顺一些。注意三台节点都要建这两个目录不能只建在主节点否则从节点NodeManager启动时会因为本地目录不存在而报错。4.2 core-site.xmlAK、SK、Endpoint一个都不能错core-site.xml的配置核心是把Hadoop的默认文件系统指向HDFS同时把OBS的认证信息和endpoint写进去。实验文档里明确提到“将akskendpoint更改”代码示例如下configuration !-- 默认文件系统指向 HDFS8020 是 NameNode RPC 端口 -- property namefs.defaultFS/name valuehdfs://node-0001:8020/value /property !-- OBS 访问密钥替换为 credentials.csv 里的真实内容 -- property namefs.obs.access.key/name value你的AccessKeyId/value /property property namefs.obs.secret.key/name value你的SecretAccessKey/value /property !-- OBS endpoint区域必须和创建桶时一致 -- property namefs.obs.endpoint/name valueobs.cn-north-4.myhuaweicloud.com/value /property /configuration三个参数里最容易错的是endpoint。很多人在创建OBS桶时选了别的区域配置里却填了cn-north-4结果就是HDFS启动后访问OBS一直报连接失败。endpoint的区域代码要和OBS桶所在区域完全一致不存在“多填几个地址试试”的说法。AK/SK粘贴时要注意别带首尾空格从credentials.csv直接复制出来的人最容易踩这个坑。4.3 hdfs-site.xml、yarn-site.xml、mapred-site.xml与slaves剩下的三个配置文件作用不同但改法一致都在$HADOOP_HOME/etc/hadoop/目录下。先看整体文件清单配置文件关键配置项作用hdfs-site.xmldfs.namenode.name.dir、dfs.datanode.data.dir、dfs.replication管理HDFS元数据与数据块存储位置yarn-site.xmlyarn.resourcemanager.hostname、yarn.nodemanager.local-dirs资源调度与节点管理mapred-site.xmlmapreduce.framework.name指定MapReduce运行框架slaves三个节点主机名决定DataNode和NodeManager的启动范围hdfs-site.xml里dfs.namenode.name.dir指向/home/modules/data/bufdfs.datanode.data.dir指向/home/modules/data/dn需要先mkdir副本数dfs.replication在实验环境设为2就够三节点里挂掉一台数据还在。yarn-site.xml的yarn.resourcemanager.hostname必须是主节点node-0001yarn.nodemanager.local-dirs指向/home/nm/localdir。mapred-site.xml在Hadoop 2.x里必须设置mapreduce.framework.name为yarn否则默认走local模式作业逻辑全跑在单机上。slaves文件每行一个主机名写入node-0001、node-0002、node-0003注意这个文件决定的是DataNode和NodeManager进程的启动范围主节点也可以作为DataNode参与存储。4.4 环境变量与三节点分发所有配置文件改完后还要配置HADOOP_HOME环境变量同样写在/etc/profile里export HADOOP_HOME/home/modules/hadoop-2.8.3 export PATH$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH source /etc/profile hadoop version这里有个特别重要的经验配置文件不是只改主节点而是要分发到所有节点。实验文档里因为javahome错误重新分发了两轮这个流程对应到操作就是# 在 node-0001 上执行分发 hadoop 目录到两个从节点 scp -r /home/modules/hadoop-2.8.3 node-0002:/home/modules/ scp -r /home/modules/hadoop-2.8.3 node-0003:/home/modules/ # 分发 /etc/profile scp /etc/profile node-0002:/etc/profile scp /etc/profile node-0003:/etc/profile # 在每个从节点上执行 source /etc/profile为什么必须重新分发因为Hadoop启动脚本在每台机器上是独立执行hadoop-env.sh的主节点的JAVA_HOME改对了从节点没同步start-dfs.sh在SSH到从节点后还是会用错误的JAVA_HOME起进程表现就是主节点进程全起来了从节点一个都没有。实验文档里把这个问题完整暴露了出来这是它比其他精简教程值钱的地方。提示core-site.xml里AK/SK不要使用任何现成文档里的示例值credentials.csv下载后自己保管好配置完可以顺手把文件移到安全位置。5. 避坑排查五个让集群反复重建的错误5.1 JAVA_HOME路径检测失败环境变量改了却还在报错现象java -version能正常输出版本但执行hadoop version或者hdfs namenode -format时报错“找不到JAVA_HOME”或“JAVA_HOME is not set correctly”。原因这类报错绝大多数是/etc/profile改了但没有source或者只source了主节点从节点没执行。我在复现时就是改完主节点直接格式化结果从节点环境变量全是旧值。另外有些人的JAVA_HOME写的是软链路径启动脚本解析到空目录现象和没设置完全一样。解决三个节点都执行source /etc/profile然后逐个执行echo $JAVA_HOME确认有输出。最稳妥的做法是把JAVA_HOME写死成完整路径并且在hadoop-env.sh里也显式加上一行export JAVA_HOME/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.h5.oe1.aarch64这样即使有人改了系统profileHadoop也能找到JDK。5.2 NameNode初始化反复失败格式化之前先自查JDK现象执行hdfs namenode -format走到一半失败或者格式化显示成功但紧接着启动HDFS时NameNode进程立刻退出。原因实验文档里“因为javahome的错误导致这里出错了”就是指这一环。格式化操作本身依赖JAVA_HOME去加载NameNode类路径错误时格式化产物不完全后续启动自然起不来。还有一种情况是第一次格式化用的是错误JDK改完后又直接重新格式化残留目录里的旧元数据和新配置冲突。解决改完JAVA_HOME后先删除NameNode数据目录再重新创建rm -rf /home/modules/data/buf mkdir -p /home/modules/data/buf然后重新执行格式化。格式化只做一次重复格式化会清掉元数据导致之前的HDFS目录结构全部丢失。5.3 SSH免密配置好了仍要密码现象在node-0001上执行ssh node-0002后仍然提示输入root密码SSH互信完全没生效。原因最常见的是.ssh目录权限不对。SSH对密钥文件权限非常敏感.ssh目录如果被其他用户可写sshd会直接拒绝用公钥认证另一个常见原因是公钥没追加进authorized_keys或者authorized_keys的属主不是当前用户。解决在node-0002和node-0003上执行chmod 700 /root/.ssh chmod 600 /root/.ssh/authorized_keys确认authorized_keys的所有者是root。还可以用ssh -v node-0002看调试输出里面会明确提示是permission问题还是key不匹配。5.4 OBS访问失败endpoint区域和桶不一致现象HDFS启动成功但执行hdfs dfs命令访问OBS路径时报连接超时或不可达错误。原因core-site.xml里fs.obs.endpoint配的区域和OBS桶实际所在区域不一致。比如桶创建在华东endpoint却写了cn-north-4OBS服务端会直接拒绝连接。解决登录OBS控制台进入对应桶在“概览”页面能看到桶的区域信息把fs.obs.endpoint改成实际区域代码。同时检查AK/SK粘贴时有没有带上多余空格从CSV直接复制到XML时最常见的问题就是换行符和空格混进去导致认证失败。5.5 改完配置后集群节点不齐现象执行start-dfs.sh后jps看到主节点进程齐全但从节点空荡荡或者启动一段时间后从节点进程自动退出。原因只改了主节点的配置并重启服务从节点的hadoop包和hosts文件还是旧版本。实验文档里明确记录了“由于javahome错误重新分发”——分发的不只是hadoop包还有/etc/profile和/etc/hosts。解决把核心配置打包统一分发scp /etc/hosts、scp /etc/profile、scp -r hadoop目录全部覆盖到从节点然后每个节点重新source。分发完再检查一遍hosts里有没有残留的旧公网IP如果有改成内网IP后重启网络服务或重启ECS否则节点间通信还是走的错误地址。6. 启动HDFS并验证把实验文档变成自己的部署清单所有配置分发完毕终于到了验证环节。启动顺序有讲究先格式化NameNode再启动HDFS最后启动YARN# 第一次部署才需要格式化之后再启动不要执行 hdfs namenode -format # 启动 HDFS 和 YARN start-dfs.sh start-yarn.sh # 验证进程 jps # node-0001 应看到 NameNode、ResourceManager、DataNode # node-0002/node-0003 应看到 DataNode、NodeManager # 验证数据节点在线状态 hdfs dfsadmin -report # 验证 OBS 对接 hdfs dfs -ls obs://你的桶名/jps是所有验证里最直观的主节点少了NameNode看日志从节点少了DataNode大概率是配置文件没分发到位。hdfs dfsadmin -report能显示每个DataNode的容量和状态。最后一条命令直接验证OBS对接是否成功——能列出桶里的目录说明AK/SK和endpoint都对了。我自己的习惯是把实验文档整理成一个核验清单每次装集群前强制走一遍首先在三个节点上都执行echo $JAVA_HOME确认有值然后grep fs.obs.endpoint core-site.xml确认区域正确接着for node in node-0001 node-0002 node-0003; do ssh $node hostname; done验证免密链路。这套动作看起来笨但能挡掉九成以上的启动失败。另外实验文档里的公网IP一定要全部替换成自己实验环境的VPC内网IP我第一次偷懒没全换结果hosts里残留一个旧地址集群里一台节点怎么都连不上折腾了半天才发现是IP没替换干净。从那以后我每次装集群都强制走一遍配置核验再也没翻过车。这份实验文档把完整过程记录下来对照学习能省不少时间希望帮到你。本文还有配套的精品资源点击获取