华为云ECS上搭建Hadoop集群与OBS互联的完整实践指南 简介面向大数据与云计算学习者的华为云实验操作报告完整记录云主机实现大数据、云服务实现大数据、BigData Pro综合实验及大数据交互式查询四个实验。内容涵盖弹性云服务器ECS购买、OBS对象存储配置、访问密钥设置、Hadoop集群节点通信、Spark集群协同以及Spark SQL与Flink SQL交互式查询等关键环节每个实验均给出可落地的操作步骤与配置示例可直接复现实验环境也可作为大数据课程设计或毕业设计的参考资料。报告按四大实验模块组织关键操作配有命令和输出信息能帮助读者快速定位配置要点避免踩坑。资源为单个docx文档格式规整便于编辑、标注和打印压缩包大小4.36MB。已有2448人学习下载适合正在修读大数据课程、备考华为云认证或自学云计算的读者参考。1. 华为云大数据环境不是点几个按钮就能跑起来的很多人以为在华为云上做大数据实验就是买几台弹性云服务器 ECS再把 Hadoop 装上去就能跑。我最初也这么想结果花了整个下午卡在「集群起来了WordCount 却一直报错」「HDFS 能写但访问 OBS 桶直接 AccessDenied」这类问题上。这份实验报告把「云主机实现大数据」和「云服务实现大数据」两条路都走了一遍核心要解决的是 ECS 上四节点 Hadoop 集群怎么搭、怎么和对象存储 OBS 打通、最后怎么用 Spark 做交互式查询。适合手里有华为云账号、想照着复现一遍完整大数据环境的人也适合那些集群搭到一半想回头查配置的人。2. 准备华为云环境ECS、OBS 与 AK/SK 的购买与配置顺序动手搭 Hadoop 之前先把华为云这边的资源买对、配对。这一步做错后面所有节点互信、OBS 互联都会跟着乱。我按实验报告的节奏把准备阶段拆成 ECS 购买、OBS 并行文件系统创建、IAM 用户与 AK/SK 三个部分。2.1 购买 ECS规格、镜像和安全组一次配对报告里实验一用的是 4 台 ECS 做 Hadoop 集群分别是 node1 到 node4内部 IP 固定成 192.168.0.10、192.168.0.53、192.168.0.169、192.168.0.77。这个规模对实验来说够用1 台做 NameNode 和 ResourceManager另外 3 台做 DataNode 和 NodeManager。购买时我一般会这样选规格4 核 8GB 或 8 核 16GB。Hadoop 跑 WordCount 时YARN 的 NodeManager 要同时管多个 Map/Reduce 容器内存太小会出现容器被频繁 kill 的报错。实验环境 4 台都用同一规格方便后面统一配置资源参数。镜像选 CentOS 7.x 或 EulerOS 这类 Linux 发行版注意和实验报告里下载的 OpenJDK、Hadoop 版本保持兼容。我习惯用 CentOS 7.6 及以上yum 源稳定防火墙操作也熟悉。网络四台机器要放在同一 VPC 和子网下否则内网 IP 不通后面/etc/hosts写的私有 IP 全白费。安全组入方向至少放通 22SSH、8020HDFS RPC、9870 或 50070NameNode Web UI看 Hadoop 版本、8088YARN Web UI、8080Spark Master Web UI。只放 22 是新手最容易踩的坑主机防火墙关了云安全组还挡着集群照样连不上。下单后记录每台机器的主机名报告里是 ecs-ca89-0001 到 ecs-ca89-0004后面 hosts 文件里要用。# 购买完成后确认四台机器的内网 IP 与主机名一一对应 ip addr show eth0 hostname这一步的意义是让后续所有配置都基于「内网 IP 主机名」的映射关系而不是依赖公网 IP。公网 IP 只用于第一次 SSH 登录集群内部通信全部走内网安全也更稳定。2.2 创建 OBS 并行文件系统区域、桶名与终端节点OBS 在实验里的角色是存放大数据文件和结果数据。报告里明确写到在 OBS 控制台创建的是一个「并行文件系统」而不是普通对象桶。并行文件系统支持并发读写和目录挂载语义Hadoop 通过obs://协议访问它的体验更接近 HDFS这是它和普通 OBS 桶最大的差别。创建时注意两点区域选择要和 ECS 一致。实验报告里用的终端节点是obs.cn-north-4.myhuaweicloud.com属于华北-北京四。ECS、OBS 同区域走内网不产生公网流量费用读写速度也快得多。桶名全局唯一创建后不可修改。建议用「项目名 环境」的命名方式比如hadoop-lab-data。报告里给了两个终端节点地址类型终端节点IPv4 单栈obs.cn-north-4.myhuaweicloud.comIPv4/IPv6 双栈obs.dualstack.cn-north-4.myhuaweicloud.com配置 Hadoop 的core-site.xml时我用的是 IPv4 地址obs.cn-north-4.myhuaweicloud.com。实验环境没有 IPv6 需求双栈地址只有在公网访问或业务明确要求 IPv6 时才需要。桶创建完成后把桶名和区域记到一处后面大量配置都要用。2.3 创建 IAM 用户与 AK/SK把 credentials.csv 当成密钥文件对待Hadoop 访问 OBS 不能直接用华为云账号的登录密码需要用访问密钥。实验报告里的操作路径是在 IAM 控制台新增用户给这个用户创建访问密钥最后浏览器会下载一个名为credentials.csv的文件。这个文件里有两样东西Access Key Id相当于用户名可以公开。Secret Access Key相当于密码只在创建时完整显示一次关闭页面后无法再次查看。# 下载到本地的 credentials.csv 内容类似 # User Name,Access Key Id,Secret Access Key # 你的用户名,AKIAxxxxxxxxxxxx,xxxxxxxxxxxxxxxxxxxxxxxxxxxxx我一般会把 credentials.csv 改名存到一个不会误传的目录比如放远端服务器的/root/credentials.csv或本地密码管理工具里。接下来配置 OBS 互联时要把这两个值填进core-site.xml所以一定保证它可读、不丢失。丢了只能重新在 IAM 里创建新密钥旧密钥会被禁用到时候所有 HDFS 读写 OBS 的作业都会断。3. 四节点初始化OpenJDK、hosts 与 SSH 免密互信资源买好后进入真正的集群搭建阶段。这一章要完成四件事装 Java、写 hosts、配 SSH 互信、关防火墙。每一步都直接影响后续 Hadoop 进程能不能正常拉起。3.1 在线下载 OpenJDK版本选对后面少折腾Hadoop 本身是 Java 写的所有节点必须先装 JDK。报告里的做法是在节点上在线下载 OpenJDK 安装包四台机器都要装。版本上我建议用 OpenJDK 8。Hadoop 2.x 和 3.x 都对 Java 8 支持最稳Spark 的官方文档也明确 Java 8 是安全选项。装 Java 11 或 17 不是不行但实验场景没必要冒兼容性风险。# 以 node1 为例先下载解压到 /usr/local/java cd /usr/local wget https://镜像站点地址/jdk8u-xxx-linux-x64.tar.gz tar -zxvf jdk8u-xxx-linux-x64.tar.gz mv jdk1.8.0_xxx /usr/local/java# 配置 JAVA_HOME 环境变量四台节点都要执行 cat /etc/profile EOF export JAVA_HOME/usr/local/java export PATH$JAVA_HOME/bin:$PATH export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar EOF source /etc/profile java -versionsource /etc/profile是让当前会话立即生效java -version能看到版本号才算装完。网速快的话直接yum install java-1.8.0-openjdk也行但用 tar 包的好处是可以完全控制 JDK 路径后面写 Hadoop 的JAVA_HOME时不容易对错。3.2 编辑 /etc/hosts内网 IP 与主机名一一对应四台机器之间要互相用主机名访问靠的就是 hosts 文件。报告里 node1 到 node4 分别对应不同的内网 IP把这些映射写进每一台机器的/etc/hosts比配置 DNS 更直接实验环境也够用。# 四台节点都要执行vim 编辑 /etc/hosts追加以下内容 192.168.0.10 ecs-ca89-0001 node1 192.168.0.53 ecs-ca89-0002 node2 192.168.0.169 ecs-ca89-0003 node3 192.168.0.77 ecs-ca89-0004 node4这里有个细节每行末尾我加了node1、node2这类短主机名。实验报告里 SSH 互信用的是node1到node4而华为云给的主机名是ecs-ca89-0001这种格式。两个都写上既能保持系统主机名合法又能让ssh node2这类命令直接解析。写完 hosts 后在 node1 上验证ping -c 2 node2 ping -c 2 node3 ping -c 2 node4能 ping 通内网 IP 才能进入下一步。如果 ping 不通先检查四台机器是否在同一子网再看安全组入方向有没有放通 ICMP。3.3 配置 SSH 免密互信一条命令把四台机器串起来Hadoop 启动时NameNode 要通过 SSH 到各 DataNode 上拉起进程。如果没有免密登录每次启动都要输密码脚本化启动根本走不通。报告里在 node1 到 node4 上分别收集公钥、写入 authorized_keys实现四台机器互相免密。# 在每个节点上生成密钥对已存在可跳过 ssh-keygen -t rsa -P -f /root/.ssh/id_rsa# 在 node1 上把本机公钥追加到所有节点包括自己 cat /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys ssh-copy-id node2 ssh-copy-id node3 ssh-copy-id node4同理在 node2、node3、node4 上各自执行一次ssh-copy-id指向其他三台。全部做完后测试ssh node2 ssh node3 ssh node4重点是第一次连接会提示确认指纹输入yes后回车之后再连就不再问密码。报告里特意强调要看到「成功互联」的效果这一步过不了后面start-dfs.sh报错基本都跟它有关。3.4 关闭防火墙systemctl 与安全组两件事别漏报告原文写了「node1~node4 节点分别执行关闭防火墙」。Linux 主机防火墙不关Hadoop 各进程之间的端口访问会被拦表现就是 DataNode 一直注册不上 NameNode。# 四台节点依次执行 systemctl stop firewalld systemctl disable firewalld systemctl status firewalldstop是临时关闭disable是让重启后不再自动拉起status确认状态是 inactive。做完这步主机层面的防火墙就放开了。但别高兴太早华为云还有第二层关卡安全组。即使主机防火墙全关安全组入方向规则同样会丢弃包。这也是我反复提醒要先在控制台放通 8020、8088、9870/50070 等端口的原因。主机防火墙 云安全组是两道门只关一道集群照样连不通。4. 配置 Hadoop 与 OBS 互联core-site.xml、依赖 jar 与 Spark 集成节点初始化完成轮到 Hadoop 本身的配置。这一章的配置项决定了三件事HDFS 怎么存、YARN 怎么分配资源、OBS 怎么被 Hadoop 认成文件系统。同时把 Spark 也装进来为最后交互式查询做准备。4.1 解压 Hadoop 并配置环境变量在 node1 上下载 Hadoop 发行包解压到/usr/local/hadoop。实验报告里没有限定具体版本号我按 Hadoop 2.x 或 3.x 均可的思路处理但注意整个集群四台机器版本必须一致且JAVA_HOME要和第 3 章装的 JDK 路径匹配。cd /usr/local wget https://镜像站点地址/hadoop-x.x.x.tar.gz tar -zxvf hadoop-x.x.x.tar.gz mv hadoop-x.x.x /usr/local/hadoopcat /etc/profile EOF export HADOOP_HOME/usr/local/hadoop export PATH$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH export HADOOP_CONF_DIR$HADOOP_HOME/etc/hadoop EOF source /etc/profile hadoop version环境变量配好后重点检查hadoop version输出的 Java 版本是不是 1.8。如果显示的是系统自带的其它 Java 版本去$HADOOP_HOME/etc/hadoop/hadoop-env.sh里把JAVA_HOME写死成/usr/local/java。这个文件在 Hadoop 3.x 里必须显式指定否则启动时经常报找不到 Java。4.2 core-site.xmlHDFS 主节点与 OBS 终端节点core-site.xml是 Hadoop 的全局配置。这里要写两部分defaultFS 指向 node1让 HDFS 客户端知道 NameNode 在哪OBS 相关参数让 Hadoop 能识别obs://协议。!-- $HADOOP_HOME/etc/hadoop/core-site.xml -- configuration property namefs.defaultFS/name valuehdfs://node1:8020/value /property property namefs.obs.impl/name valueorg.apache.hadoop.fs.obs.OBSFileSystem/value /property property namefs.obs.endpoint/name valueobs.cn-north-4.myhuaweicloud.com/value /property property namefs.obs.access.key/name value你的AK值/value /property property namefs.obs.secret.key/name value你的SK值/value /property /configurationfs.defaultFS我写的是node1:8020对应第 3 章 hosts 里的主机名。如果你更习惯写 IP写hdfs://192.168.0.10:8020也可以但四台机器的写法要统一混用容易出奇怪问题。fs.obs.*这一组是 OBS 互联的关键。AK/SK 直接填第 2 章从 credentials.csv 里拿到的值。生产环境有人用 keytab 或 IAM 临时凭证更安全但实验环境直接把 AK/SK 写在配置里是最常见、最省事的做法。4.3 hdfs-site.xml 与 yarn-site.xml副本数和资源调度HDFS 的副本数四台节点我设置成 2。实验环境没必要按生产标准复制 3 份2 份既能保证基本容错又不会把磁盘快速占满。NameNode 和 DataNode 的存储目录我用file:///data/hdfs/namenode和file:///data/hdfs/datanode要提前建好目录并给权限。!-- $HADOOP_HOME/etc/hadoop/hdfs-site.xml -- configuration property namedfs.replication/name value2/value /property property namedfs.namenode.name.dir/name valuefile:///data/hdfs/namenode/value /property property namedfs.datanode.data.dir/name valuefile:///data/hdfs/datanode/value /property property namedfs.permissions.enabled/name valuefalse/value /property /configurationdfs.permissions.enabled设为 false 是实验环境图省事的做法省去反复授权 HDFS 目录的步骤。生产环境必须保持 true。YARN 的资源分配以 4 核 8GB 的 ECS 为基准!-- $HADOOP_HOME/etc/hadoop/yarn-site.xml -- configuration property nameyarn.resourcemanager.hostname/name valuenode1/value /property property nameyarn.nodemanager.resource.memory-mb/name value6144/value /property property nameyarn.nodemanager.resource.cpu-vcores/name value3/value /property property nameyarn.scheduler.maximum-allocation-mb/name value2048/value /property /configuration8GB 内存的机器我给 NodeManager 分配 6GB剩下给系统、DataNode 和 NodeManager 自身。yarn.scheduler.maximum-allocation-mb控制单个容器最大内存设成 2GB 是防止 WordCount 这类作业把内存吃满导致任务被杀。如果机器是 16GB把 memory-mb 调到 12288vcores 调到 6 左右更合适。配置完成后node2、node3、node4 上都要同步这四份 XML。常见做法是配置完成后把$HADOOP_HOME/etc/hadoop整个目录用 scp 拷到其它节点scp -r $HADOOP_HOME/etc/hadoop node2:$HADOOP_HOME/etc/ scp -r $HADOOP_HOME/etc/hadoop node3:$HADOOP_HOME/etc/ scp -r $HADOOP_HOME/etc/hadoop node4:$HADOOP_HOME/etc/注意hadoop-env.sh里也要改JAVA_HOME否则其它节点起来后还是找不到 Java。4.4 集成 OBS 与 Spark依赖 jar、SPARK_HOME 与启动集群只写fs.obs.impl还不够。Hadoop 自带的发行包里没有华为云 OBS 的文件系统实现必须额外下载hadoop-huaweicloud依赖 jar 包放进 Hadoop 的 lib 目录否则启动后访问 obs 路径会报No FileSystem for scheme: obs。实验报告里专门写了「下载 jar 包」这一步位置在 node1 上执行。常见做法是cd $HADOOP_HOME/share/hadoop/common/lib wget https://镜像站点地址/hadoop-huaweicloud-x.x.x.jar # 同时把 obs-java-sdk、okhttp 等依赖一并放入该目录依赖 jar 的版本要尽量和 Hadoop 主版本匹配不匹配的典型报错是ClassNotFoundException: org.apache.hadoop.fs.obs.OBSFileSystem或者NoSuchMethodError。装好后用一条命令验证hadoop fs -ls obs://你的桶名/能列出桶内容说明 OBS 互联成功。报告里 2.3.2 节的「测试与 OBS 互联」就是这一步。Spark 的安装相对简单下载与 Java 8 兼容的 Spark 发行包解压到/usr/local/spark配置环境变量后在 node1 上启动 Standalone 模式cd /usr/local wget https://镜像站点地址/spark-x.x.x-bin-hadoop2.7.tgz tar -zxvf spark-x.x.x-bin-hadoop2.7.tgz mv spark-x.x.x-bin-hadoop2.7 /usr/local/spark# 配置 spark-env.sh cd /usr/local/spark/conf cp spark-env.sh.template spark-env.sh cat spark-env.sh EOF export JAVA_HOME/usr/local/java export SPARK_MASTER_HOSTnode1 export SPARK_WORKER_CORES3 export SPARK_WORKER_MEMORY4g EOF# 配置 workers 文件 cp workers.template workers sed -i s/localhost/node2\nnode3\nnode4/ /usr/local/spark/conf/workers # 启动 Spark /usr/local/spark/sbin/start-all.shSpark Master 跑在 node1Worker 跑在 node2、node3、node4。SPARK_WORKER_MEMORY给 4GB结合 ECS 总内存 8GB 来权衡留足系统余量。启动后用jps查看node1 出现Master其它节点出现Worker说明集群就绪。5. 避坑指南华为云大数据集群常见问题排查这一章写我复现实验报告时实际碰到的四个问题每条都按「现象 → 原因 → 解决」记录遇到类似报错可以直接对号入座。5.1 现象一SSH 免密登录一直要密码配完互信后执行ssh node2仍然提示输入密码。原因是authorized_keys文件的权限不对或者公钥追加错了位置。OpenSSH 对.ssh目录和authorized_keys文件权限非常敏感当前用户可写就会被拒绝。解决方法是确认三件事chmod 700 /root/.ssh chmod 600 /root/.ssh/authorized_keys cat /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys另外检查 node1 公钥是否真的在 node2 的authorized_keys里。公钥内容是一长串以ssh-rsa开头、结尾带rootecs-ca89-000x的文本比对首尾字符即可判断是否匹配。5.2 现象二HDFS 启动后 DataNode 起不来start-dfs.sh执行完jps只见 NameNode不见 DataNode日志里报版本不匹配或Incompatible clusterIDs。原因是频繁格式化 NameNode 导致 NameNode 的 clusterID 和 DataNode 不一致。格式化操作会重新生成集群 ID但 DataNode 的存储目录里还留着旧 ID两边对不上DataNode 拒绝注册。解决的常见做法是干脆一点停掉所有进程把 NameNode 和 DataNode 存储目录里的current目录清空再重新格式化、重新启动。# 四台节点都执行 rm -rf /data/hdfs/namenode/* rm -rf /data/hdfs/datanode/* # 在 node1 上格式化并启动 hdfs namenode -format start-dfs.sh格式化会把 HDFS 上的所有数据清空生产环境千万别这么干。实验环境数据丢了无所谓重新跑一遍 WordCount 就行。5.3 现象三访问 OBS 桶报 AccessDeniedhadoop fs -ls obs://桶名/时报AccessDenied或StatusCode: 403。原因是 AK/SK 配置错误或者该 AK/SK 对应的 IAM 用户没有 OBS 的操作权限。还有一种情况是访问了不属于当前区域的桶终端节点和桶区域不匹配同样报错。解决办法第一步检查core-site.xml里fs.obs.access.key和fs.obs.secret.key是否和 credentials.csv 完全一致注意 Secret Key 里的字母大小写和特殊符号。第二步登录 OBS 控制台确认这个 IAM 用户至少拥有OBS OperateAccess策略。第三步确认终端节点是obs.cn-north-4.myhuaweicloud.com如果桶在别的区域把 endpoint 换成对应区域的地址。5.4 现象四集群节点间 Timeout / 节点无法连接WordCount 任务提交后Map 阶段卡住日志出现大量连接超时。原因一般是两种同时发生主机防火墙没关干净或者安全组没放通节点间的数据端口。Hadoop 除了 RPC 端口DataNode 之间传输数据还会用随机端口安全组规则太严格会把这些随机端口全部拦掉。解决办法是把安全组先配成放行 VPC 内网互访或者直接把安全组设为「内网全放通」的实验级策略。实验环境不要纠结最小权限把 22、8020、8088、9870、50070 以及 Spark 的 8080、7077 都放进去能省下大量排查时间。6. 验证跑通WordCount 与 Spark SQL 交互式查询集群装完不等于可以用必须跑两个验证一个证明 HDFS YARN 正常一个证明 OBS 互联和交互式查询没问题。6.1 用 WordCount 验证 Hadoop 集群在 node1 上准备一个测试文本上传到 HDFS然后提交官方自带的 WordCount 示例作业。这是 Hadoop 生态最经典的冒烟测试。hdfs dfs -mkdir -p /wordcount/input echo hello hadoop hello huawei /root/words.txt hdfs dfs -put /root/words.txt /wordcount/input/ hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar \ wordcount /wordcount/input /wordcount/output hdfs dfs -cat /wordcount/output/part-r-00000看到输出类似hadoop 1、hello 2、huawei 1这样的统计结果Hadoop 集群就算跑通了。然后验证 OBS 读写hadoop fs -mkdir -p obs://你的桶名/test hadoop fs -put /root/words.txt obs://你的桶名/test/ hadoop fs -cat obs://你的桶名/test/words.txt能写能读说明 OBS 互联真实可用不只是ls通。6.2 用 Spark SQL 验证交互式查询综合实验四的主题是大数据交互式查询实操用 Spark SQL 最直接。启动spark-sql读取 OBS 上的文本数据建表查询/usr/local/spark/bin/spark-sql --master spark://node1:7077CREATE TEMPORARY VIEW words USING csv OPTIONS (path obs://你的桶名/test/words.txt); SELECT word, count(*) FROM words GROUP BY word;能返回分组统计结果说明 Spark 能正常拉取 OBS 数据并完成计算。这一步跑通整套「ECS OBS Hadoop Spark」的链路就完整了。从那以后我每次搭完集群都强制自己把 WordCount 和一条 OBS 读写走完才收工哪怕时间再紧也不跳过。集群启动起来却不做数据验证等于没装。这组验证命令会浪费你五分钟但省下来的是后面排错几小时的时间。希望帮到你。本文还有配套的精品资源点击获取