ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

华为云四节点Hadoop 3+Spark 3集群部署与OBS互联排错

华为云四节点Hadoop 3+Spark 3集群部署与OBS互联排错

简介:面向高校大数据、云计算课程学习者以及华为云实验备考者的一份实验报告,围绕云主机与云服务两条技术路径组织四个完整实验。报告从弹性云服务器与对象存储的配置入手,讲解访问密钥设置、节点间SSH互通、OpenJDK安装和防火墙关闭等准备工作,并逐步完成Hadoop集群搭建与对象存储互联测试;随后延伸到华为云一站式大数据解决方案的环境准备、Hadoop与Spark集群协同部署,以及基于Spark SQL或Flink SQL的交互式查询与结果分析。压缩包内含1个docx文件,约4.36MB,目录清晰,便于对照实验环节查阅、整理记录与撰写报告。当前已有2541人学习,适合需要理解云上大数据平台部署流程、补全课程实验报告结构或复盘关键操作的学生参考。

1. 四台云主机、九个公钥:先看清这套环境的版本底色

在华为云上做大数据的课程实验,多数人第一反应是“买一台高配机器,装个 Hadoop 就完事”。真动手才发现,原料描述的是四节点拓扑:node1 到 node4,每台一份 OpenJDK、一份 Hadoop、一份 Spark,外面挂一个 OBS 桶做存算分离。翻车的人通常不是卡在装不上,而是卡在顺序上——先装 Spark 再回头改 Hadoop 配置,或者四台机器各自格式化了一遍 NameNode,最后 DataNode 一个都起不来。这套环境的意义不在“跑通一次”,而在于每一步为什么这么排、哪里最容易出问题。适合手上有云账号、准备复现 Hadoop 3 + Spark 3 集群的开发者,也适合课程实验要交报告、但本地机器扛不住四节点的同学。

2. 云上底座先备齐:ECS 规格、OBS 桶与 AK/SK 三件事

装 Hadoop 之前,有四台能互相 ping 通、能无密码登录的云主机,比什么参数调优都重要。这一章的活都是在控制台和命令行之间来回切:买机器、买桶、拿密钥,三件事任何一件埋雷,后面都是几小时的排查。

2.1 ECS 买几台、买什么规格

四台的定位不一样。node1 是主节点,跑 NameNode、ResourceManager、SecondaryNameNode,还要跑 Spark 的 HistoryServer,内存给少了后面提作业会一直卡在 ACCEPTED。我的习惯是 node1 用 4 vCPU / 8 GB,node2 到 node4 用 2 vCPU / 4 GB,系统盘统一 40 GB 起步,DataNode 的数据目录单独挂一块 100 GB 的数据盘更省心。

镜像别图新。Hadoop 3 生态里最稳的搭配是 JDK 8,CentOS 7.9 或者同代的 Linux 发行版都行,选 64 位。买的时候四台必须落在同一个 VPC、同一个子网,并且勾上“自动分配私网 IP”,否则内网地址段对不上,后面 /etc/hosts 写得再对也没用。

四台机器买完,先把内网 IP 抄下来。原料里的四个地址是 192.168.0.10、192.168.0.53、192.168.0.169、192.168.0.77,分别对应 node1 到 node4。内网 IP 比公网 IP 重要得多:集群内部通信全走内网,用公网 IP 不仅慢,流量还计费。

提示:安全组在创建时就顺手放通内网全通(同一安全组互访),再单独放通 22 端口给自己的工作机。别等到 9870 打不开才发现端口没开。

规格定完还有一件事:主机名。云主机默认主机名是 ecs-xxxx 这种带随机后缀的名字,和 node1 对不上。装系统后第一件事就是hostnamectl set-hostname node1,四台各改各的,改完重新登录生效。

2.2 OBS 桶与并行文件系统的区别

原料里出现了两个概念:对象桶和并行文件系统,都在 OBS 服务里,但用途不同。

普通对象桶是扁平结构,按 key 存对象,Hadoop 通过 OBS 的文件系统插件以obs://桶名/路径的形式访问,适合做原始数据落地和 wordcount 的输入输出。并行文件系统对外提供 POSIX 语义的目录树,能被挂载,也能用ofs://协议访问,适合需要 rename、append 这类操作的场景。做实验的时候两个都建一遍最直观,桶名全局唯一、只能小写,别用大写字母和下划线。

地域必须和 ECS 一致,原料里所有 endpoint 都是obs.cn-north-4.myhuaweicloud.com这个形态。同地域访问走内网,不计公网流量;跨地域写错 endpoint,连接会一直超时,报错信息还很不直观。

# 验证桶能不能通,先看 endpoint 解析 ping obs.cn-north-4.myhuaweicloud.com # 双栈环境下的地址形态,IPv4/IPv6 都能走 ping obs.dualstack.cn-north-4.myhuaweicloud.com

两条命令的作用只是确认网络层通不通,真正的鉴权在 AK/SK 那一层。如果 ping 得通但 Hadoop 报 403,问题一定在密钥或者桶策略上,不用再怀疑网络。

2.3 AK/SK 与 credentials.csv 怎么放

访问密钥在控制台的“我的凭证 → 访问密钥”里新增,一对 AK/SK 对应一个身份。原料里的 credentials.csv 就是这个环节导出的文件,内容是三列:User Name、Access Key Id、Secret Access Key。

User Name,Access Key Id,Secret Access Key "bigdata-lab","<你的AK>","<你的SK>"

这个文件只在创建密钥时能下载一次,页面关掉就再也拿不到 SK 了,只能删掉重建——这是很多人第一次踩的坑。下载后立刻改权限,别留在下载目录里:

chmod 600 ~/credentials.csv mkdir -p ~/.obs && mv ~/credentials.csv ~/.obs/

权限 600 是硬要求。Hadoop 的 OBS 插件会去读配置文件里的密钥,如果密钥文件本身是 644,同机器上任何用户都能看到,这在共享环境里是实打实的风险。

注意:AK/SK 不要直接写进 core-site.xml 明文里。实验环境图快可以写,但养成习惯用 credential provider 存,配置文件里只留占位符,后面第 4 章会给具体写法。

三件事办完,底座就有了:四台能互访的 ECS、一个同地域的 OBS 桶、一对能用的 AK/SK。接下来才是真正花时间的部分。

3. 四节点互通:hosts 映射、防火墙、免密登录的动手顺序

Hadoop 的启动脚本本质是一堆 ssh 调用:start-dfs.sh在 node1 上执行,但它要靠 ssh 去每台机器起 DataNode。所以免密登录不通,集群永远起不全。这一章的顺序不能乱——先改主机名和 hosts,再关防火墙,最后配密钥。

3.1 主机名与 /etc/hosts 映射

四台机器互相认识,靠的是 /etc/hosts 里的静态映射,不是 DNS。原料里的映射是这样:

# 四台机器都要有完全相同的这段内容 192.168.0.10 node1 192.168.0.53 node2 192.168.0.169 node3 192.168.0.77 node4

一次性写法,在 node1 上追加后 scp 到其余三台,比手敲四遍靠谱:

cat >> /etc/hosts <<'EOF' 192.168.0.10 node1 192.168.0.53 node2 192.168.0.169 node3 192.168.0.77 node4 EOF for h in node2 node3 node4; do scp /etc/hosts root@$h:/etc/; done

<<'EOF'里的单引号不能省,省了变量会被当前 shell 提前展开。scp 那条循环要求你当前已经能用密码登录目标机,或者提前做过一次 ssh-copy-id。

改完立刻验证:ping -c 2 node2、getent hosts node3。getent 的结果比 ping 更准,它直接读的是 hosts 解析链,如果这里返回空,说明文件写错了行或者主机名拼错。

3.2 关闭防火墙与安全组放行

云主机上跑集群,防火墙是第一个要处理的东西。DataNode 之间要互相传块,端口是动态的,一个个放行不现实。

systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

前两条关 firewalld 并禁止开机自启,后两条处理 SELinux,setenforce 0只对当前会话生效,改配置文件才是永久的。四台都要执行,一台漏了就会出现“三台正常、一台 DataNode 起不来”的经典现象。

云上的安全组是另一层防火墙,在控制台配。实验环境最简单的做法是让四台机器同属一个安全组,组内互访全通;再单独加一条入方向规则放通 22 端口给自己的出口 IP。常见坑是安全组默认只开 22 和 3389,9870、8088 这些 Web UI 端口全部不通,浏览器一直转圈。

3.3 ssh-keygen 与 authorized_keys 合并分发

免密登录的原理很朴素:你有私钥,对方机器的 authorized_keys 里有你的公钥,就能进。四台机器两两互信,最省事的做法是把四台的公钥汇总成一个文件,再分发下去。

# 每台机器上执行,生成一对空口令密钥 ssh-keygen -t rsa -b 4096 -N "" -f ~/.ssh/id_rsa # 每台机器打印自己的公钥,收集到一个文本里 cat ~/.ssh/id_rsa.pub

原料里就是把 node1 到 node4 四段ssh-rsa AAAA...拼在同一个文本中,然后覆盖到每台的~/.ssh/authorized_keys。这个思路是对的,比ssh-copy-id一台台推更省事,尤其四台机器同时干活的时候。

# 假设汇总文件叫 all_keys.pub,放在 node1 上 for h in node2 node3 node4; do scp all_keys.pub root@$h:/root/.ssh/; done # 四台分别执行 cat ~/.ssh/all_keys.pub > ~/.ssh/authorized_keys chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys

用>而不是>>是为了覆盖,避免多次执行后同一个公钥在文件里堆上十几遍。权限必须是 700 和 600,ssh 对这两个数字很挑,目录给了 755 或者文件给了 644,都会静默拒绝登录,日志里只留一句“Authentication refused”,不细看根本找不到原因。

3.4 逐个验证,别只测一台

配完立刻测,四台全测,不要只测 node1 到 node2 就以为完事。

for h in node1 node2 node3 node4; do echo "--- $h ---" ssh -o BatchMode=yes $h hostname done

-o BatchMode=yes是关键参数,它禁止 ssh 交互式提问,有密码提示就会直接失败退出,不会被一个“yes/no”卡住让脚本看起来像成功了。输出四行主机名,才算真通。

第一次 ssh 会问 fingerprint,用-o StrictHostKeyChecking=no可以跳过,但只建议在实验环境用。如果某台一直要密码,去/var/log/secure看拒绝原因,九成是权限或公钥没写进去。

4. Hadoop 与 Spark 集群落地:从 OpenJDK 到 OBS 互联

前面都是铺垫,这章开始装东西。四台机器的目录结构保持一致,后面同步配置才不用改路径。我习惯把所有组件放在/opt/module下,解压时把版本号去掉,用软链指向实际目录,升级时少改一堆配置。

4.1 OpenJDK 安装与 JAVA_HOME 定位

JDK 用发行版自带的 OpenJDK 8 最省事,在线装,不用自己传包。

yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel # devel 包装完才有 jps、jstat 这些排查工具 readlink -f $(which java)

第二条命令是很多人忽略的一步。which java返回的是/usr/bin/java,那是个软链,真正的 JAVA_HOME 是它指向的目录,形如/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.xxx。直接写/usr/lib/jvm/java-1.8.0-openjdk有时能用有时不能,取决于发行版有没有建同名软链,用readlink -f拿到真路径最稳。

java-1.8.0-openjdk-devel必须装,只装java-1.8.0-openjdk的话jps命令不存在,后面查进程会非常难受——这是纯粹的排查工具缺失,和集群能否启动无关,但少了它你会误以为进程没起来。

4.2 Hadoop 解压、环境变量与四个 XML

装包、解压、建软链,四台都做一遍:

mkdir -p /opt/module && cd /opt/module tar -zxvf hadoop-3.x.tar.gz ln -s /opt/module/hadoop-3.x /opt/module/hadoop # 环境变量统一放 profile.d,比改 /etc/profile 好维护 cat > /etc/profile.d/bigdata.sh <<'EOF' export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk export HADOOP_HOME=/opt/module/hadoop export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop export YARN_CONF_DIR=$HADOOP_CONF_DIR export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin EOF source /etc/profile.d/bigdata.sh

HADOOP_CONF_DIR这个变量在客户端场景下比什么都重要。它没设,hadoop fs会去找默认配置目录,结果连到一个不存在的 NameNode;设了,任何目录下执行命令都能读到集群配置。

四个 XML 里,core-site.xml 定的是“集群入口在哪”:

<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://node1:8020</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop/data/tmp</value> </property> <property> <name>fs.trash.interval</name> <value>1440</value> </property> </configuration>

fs.defaultFS必须写主机名而不是 IP,四台配置一字不差。hadoop.tmp.dir从默认的 /tmp 挪出来,是因为 /tmp 在部分系统上有定时清理策略,重启机器后集群状态全丢。fs.trash.interval是回收站,1440 表示删除的文件保留一天,误删时能捞回来,属于实验环境里成本最低的后悔药。

hdfs-site.xml 定副本和目录:

<configuration> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:///opt/module/hadoop/data/namenode</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:///opt/module/hadoop/data/datanode</value> </property> <property> <name>dfs.namenode.http-address</name> <value>node1:9870</value> </property> </configuration>

四台机器副本数给 3 也行,实验环境给 2 更省磁盘,反正丢一块盘还能读回来。两个目录必须用file://前缀,漏了前缀在某些版本上会被当成相对路径,NameNode 起来后找不到元数据。

yarn-site.xml 决定计算资源怎么分:

<configuration> <property> <name>yarn.resourcemanager.hostname</name> <value>node1</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>6144</value> </property> <property> <name>yarn.nodemanager.resource.cpu-vcores</name> <value>4</value> </property> </configuration>

4 GB 内存的机器,NodeManager 给 6144 MB 是超配的,实际会被系统用量压住。这个值要根据机器真实内存算,一般留 1 GB 给系统,其余的给 YARN,给多了会在提交任务时抛“物理内存不足”。

mapred-site.xml 把 MapReduce 交给 YARN:

<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>yarn.app.mapreduce.am.env</name> <value>HADOOP_MAPRED_HOME=/opt/module/hadoop</value> </property> <property> <name>mapreduce.map.env</name> <value>HADOOP_MAPRED_HOME=/opt/module/hadoop</value> </property> <property> <name>mapreduce.reduce.env</name> <value>HADOOP_MAPRED_HOME=/opt/module/hadoop</value> </property> </configuration>

后面三个 env 属性在容器化执行时是必须的,缺了它们,作业能提交、能进入 RUNNING,但容器启动阶段就挂掉,错误信息藏在 NodeManager 日志里,非常难查。

最后一个文件是 workers。Hadoop 3 叫workers,2.x 叫slaves,写错名字的表现是启动脚本只起本机一个 DataNode:

# /opt/module/hadoop/etc/hadoop/workers node1 node2 node3 node4

四行主机名,一行一个,末尾不能有多余空行带来的隐藏字符。改完把整个etc/hadoop目录 scp 到其余三台,保证配置完全一致。

4.3 NameNode 格式化与启动顺序

格式化只做一次,而且只在 node1 上做:

hdfs namenode -format

这一步会在 name.dir 里生成current/VERSION,里面有个 clusterID。后面所有 DataNode 靠这个 ID 认主。如果你手滑格式化了第二次,NameNode 会重新生成一个 ID,原来的 DataNode 全部对不上,表现就是 NameNode 正常、DataNode 一个都不注册。

启动用分步的,不用start-all.sh:

start-dfs.sh start-yarn.sh

start-all.sh把两者混在一起,日志输出也混在一起,出问题不好定位。分步起,起完在 node1 上jps,应该看到 NameNode、SecondaryNameNode、ResourceManager;其余三台应该看到 DataNode、NodeManager。

注意:jps 只显示当前用户的 Java 进程。用 root 启动、用其他用户看,会以为进程全没了。

4.4 OBS 互联:插件、endpoint 与密钥的三处对齐

Hadoop 要访问 OBS,需要两样东西:一个 OBS 文件系统插件 jar,放在$HADOOP_HOME/share/hadoop/common/lib/下,四台都要放;一份 core-site.xml 里的插件声明。

<configuration> <property> <name>fs.obs.impl</name> <value>org.apache.hadoop.fs.obs.OBSFileSystem</value> </property> <property> <name>fs.obs.endpoint</name> <value>obs.cn-north-4.myhuaweicloud.com</value> </property> <property> <name>fs.obs.access.key</name> <value>${AK}</value> </property> <property> <name>fs.obs.secret.key</name> <value>${SK}</value> </property> </configuration>

fs.obs.impl是协议前缀到实现类的映射,没这行,hadoop fs -ls obs://...会直接报“No FileSystem for scheme obs”。endpoint 必须是桶所在区域的地址,不带桶名,也不带 https:// 前缀。

密钥别写明文,用 credential provider 存起来:

hadoop credential create fs.obs.access.key -value <你的AK> \ -provider jceks://hdfs@node1:8020/user/root/obs.jceks hadoop credential create fs.obs.secret.key -value <你的SK> \ -provider jceks://hdfs@node1:8020/user/root/obs.jceks

然后在 core-site.xml 里加上hadoop.security.credential.provider.path,值就是上面那个 jceks 路径。这样配置文件可以随便传,密钥跟着 HDFS 走。实验环境嫌麻烦直接写明文也行,但要知道明文等于把钥匙贴在门上。

验证方式很直接:

hadoop fs -ls obs://<桶名>/ hadoop fs -put /etc/hostname obs://<桶名>/test/ hadoop fs -cat obs://<桶名>/test/hostname

三条命令分别覆盖列目录、写对象、读对象,权限正确的话都能过。报 403 一般是 AK/SK 对不上或者桶策略没放行,报超时基本都是 endpoint 区域写错。

4.5 Spark 解压与 on YARN 的 spark-env.sh

Spark 装起来比 Hadoop 轻,解压配环境变量就够,不需要单独起集群进程,直接跑在 YARN 上。

cd /opt/module tar -zxvf spark-3.x-bin-hadoop3.tgz ln -s /opt/module/spark-3.x-bin-hadoop3 /opt/module/spark cp $SPARK_HOME/conf/spark-env.sh.template $SPARK_HOME/conf/spark-env.sh

spark-env.sh 里最关键的三行:

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk export HADOOP_CONF_DIR=/opt/module/hadoop/etc/hadoop export SPARK_DIST_CLASSPATH=$(hadoop classpath)

SPARK_DIST_CLASSPATH决定 Spark 能不能读到 HDFS 和 OBS 的实现类。这行不写,Spark 本地模式跑得好好的,一提交到 YARN 就报找不到 OBSFileSystem。$(hadoop classpath)是命令替换,前提是 hadoop 已经在 PATH 里。

再补一个 spark-defaults.conf,把事件日志落到 HDFS,方便事后翻黑匣子:

spark.master yarn spark.eventLog.enabled true spark.eventLog.dir hdfs://node1:8020/spark-logs spark.yarn.historyServer.address node1:18080

日志目录要提前建:hdfs dfs -mkdir -p /spark-logs。事件日志开着会占空间,但作业挂掉之后能回放 DAG 和每个 stage 的耗时,比盯着控制台输出猜有用得多。配置同步到四台,Spark 这层就齐了。

5. 常见问题排查:五类让集群起不来的现象

装的过程中遇到的问题,九成集中在下面五类。每一条我都按“现象、原因、解决”的顺序记,照着对号入座能省不少时间。

5.1 现象:ssh 依旧提示输密码

现象很明确:for循环里四台机器,前三台秒回主机名,第四台卡在root@node4's password:。

原因基本在权限和文件内容上。~/.ssh目录不是 700、authorized_keys不是 600,ssh 会直接忽略这个文件,连错误提示都不给。另一种是公钥合并时用了>>追加,同一个 key 在文件里出现多次,某些版本对重复行处理异常。

解决:四台统一执行chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys,然后用wc -l看行数是否等于 4。还不行就ssh -vvv node4看详细握手过程,日志里会明确写出读的哪个文件、为什么拒。

5.2 现象:NameNode 起来了,DataNode 一个都没有

jps在 node1 上能看到 NameNode,在 node2 到 node4 上什么都没有,9870 页面的 Datanodes 标签是 0。

原因是重复格式化。第二次hdfs namenode -format会重写current/VERSION里的 clusterID,DataNode 本地保存的还是旧 ID,启动时校验失败直接退出。

解决:先stop-dfs.sh,然后清空四台的dfs.datanode.data.dir和 node1 的dfs.namenode.name.dir,重新格式化一次,再启动。格式化之前确认四台的 hdfs-site.xml 路径完全一致,别有一台路径写错。

5.3 现象:9870 和 8088 打不开,浏览器一直转圈

机器上jps一切正常,curl localhost:9870在 node1 本机也能返回,但外面访问不了。

原因是两层防火墙只关了一层。firewalld 关了,安全组没放行;或者 NameNode 的 http-address 绑在了 127.0.0.1,只监听本机。

解决:先在控制台给安全组加入方向规则,放通 9870、8088、18080(按需),源地址填自己的出口 IP。再确认dfs.namenode.http-address写的是node1:9870而不是localhost:9870。改完配置要重启对应进程才生效。

5.4 现象:YARN 作业卡在 ACCEPTED 不动

yarn application -list显示状态 ACCEPTED,卡十几分钟没变化,日志里没有任何报错。

原因是队列资源不够,或者 NodeManager 报上来的可用内存是 0。yarn.nodemanager.resource.memory-mb配得比机器实际内存还大,NodeManager 启动时会自己降级,降完可用资源就归零了。

解决:打开 8088 页面看 Cluster 的 Memory Total。如果是 0 或者很小,往下调yarn.nodemanager.resource.memory-mb,4 GB 的机器给 3072 比较稳。改完重启 NodeManager,再提交一次。

5.5 现象:访问 OBS 报 InvalidAccessKeyId 或 403

命令hadoop fs -ls obs://xxx/直接抛异常,提示密钥无效或者拒绝访问。

原因有三种:AK/SK 复制时多了空格或引号;endpoint 用的是别的区域;桶的策略没有授权给这对密钥对应的账号。

解决:先在控制台用同一对密钥做一次对象上传,排除密钥本身的问题。再核对 core-site.xml 里的 endpoint 和桶所在地域是否一致。credential provider 方式存的密钥,用hadoop credential list -provider jceks://hdfs@node1:8020/user/root/obs.jceks确认条目真的写进去了。

6. 装完怎么验证:一次 wordcount 加一句 spark-sql 才算通

装完不等于跑通。我的验证顺序是三层:进程层、存储层、计算层,一层不过就停在那层查,别跳。

先看进程。四台分别jps,node1 上必须有 NameNode、SecondaryNameNode、ResourceManager,其余三台必须有 DataNode、NodeManager。缺哪个就去$HADOOP_HOME/logs找对应角色的日志,日志文件名带角色名和日期,比翻控制台输出快得多。

再看存储:

hdfs dfsadmin -report yarn node -list

第一条输出 Live datanodes 的数量和每台的容量,四台全在才算正常;第二条看 NodeNodes 是不是 4,状态是不是 RUNNING。这两条命令给的信息比 Web UI 更直接。

计算层用 wordcount 验:

hadoop fs -mkdir -p /input hadoop fs -put $HADOOP_HOME/etc/hadoop/*.xml /input hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar \ wordcount /input /output hadoop fs -cat /output/part-r-00000 | head

能出词频结果,说明 HDFS 读写、YARN 调度、MapReduce 执行三段都通了。如果卡在 map 0% reduce 0%,先看yarn application -list是不是 ACCEPTED,再回到 5.4 那条。

最后一层是交互式查询,这也是原料里综合实验四要做的事:

spark-sql --master yarn --conf spark.sql.warehouse.dir=/user/root/warehouse

进去之后建外部表指向 OBS 上的数据,跑一句聚合:

CREATE EXTERNAL TABLE logs (line STRING) STORED AS TEXTFILE LOCATION 'obs://<桶名>/input/'; SELECT count(*) FROM logs;

能返回行数,说明 Spark 读到了 OBS、插件类加载正常、YARN 容器也分到了资源。这一步过不去,先查SPARK_DIST_CLASSPATH有没有设,再看 spark-defaults.conf 里spark.master是不是 yarn。

从那以后我每次搭完集群,都强制走一遍「jps → dfsadmin -report → wordcount → spark-sql count(*)」这四步,不管前面装得多顺。看起来多花十分钟,实际上省掉的是后面查“为什么作业不跑”的两小时。希望这套流程能帮到你。

本文还有配套的精品资源,点击获取

返回列表