YARN模式必须先跑通Hadoop,否则spark-submit会卡在“Connecting to ResourceManager”;需确保ResourceManager和NodeManager正常运行、网络连通、HADOOP_CONF_DIR配置正确、SPARK_DIST_CLASSPATH注入Hadoop类路径,并将Spark JAR包上传至HDFS供NodeManager访问。

YARN 模式必须先跑通 Hadoop,否则 spark-submit 会卡在 “Connecting to ResourceManager”
Spark on YARN 不是独立集群,它完全依赖 YARN 的资源调度能力。如果 Hadoop 的 ResourceManager 和 NodeManager 没起来,或者网络不通,spark-submit --master yarn 会 hang 住,日志里只显示连接超时,不报具体错。
- 确认
yarn-daemon.sh start resourcemanager和每个 Worker 上的yarn-daemon.sh start nodemanager都成功执行(jps看进程) -
yarn node -list必须返回至少一个ACTIVE状态的 NodeManager,否则 Spark 无处申请 container - Hadoop 配置目录路径要和 Spark 对得上:
HADOOP_CONF_DIR必须指向含yarn-site.xml、core-site.xml、hdfs-site.xml的真实目录,不能只写/etc/hadoop这种软链未生效的路径 - 所有节点(包括提交机)都要能
telnet master 8032(RM 的 client port),防火墙或 SELinux 关闭不到位是常见原因
spark-env.sh 里这三行漏掉任何一行,yarn-client 模式直接失败
很多人只配了 JAVA_HOME,但 Spark on YARN 启动 Driver 和 Executor 时,需要明确告诉它去哪里找 Hadoop 配置和 YARN 配置。缺一不可。
-
export HADOOP_CONF_DIR=/opt/hadoop/etc/hadoop—— 指向 Hadoop 的配置目录,不是 Spark 自己的conf -
export YARN_CONF_DIR=/opt/hadoop/etc/hadoop—— 实际上和上面一样,但某些 Spark 版本(如 2.2)会优先读这个,显式写更稳 -
export SPARK_DIST_CLASSPATH=$(hadoop classpath)—— 这行最关键:它把 Hadoop 的所有 JAR 路径注入 Spark classpath,否则会报ClassNotFoundException: org.apache.hadoop.yarn.client.api.YarnClient
提交任务时用 --deploy-mode client 还是 cluster?看日志输出位置
区别不在性能,而在 Driver 进程在哪跑、日志往哪打。别被“client 更快”误导,实际场景中选错会导致调试困难。
-
--deploy-mode client:Driver 在你提交命令的机器上运行,stdout直接打印到终端,适合调试;但该机器必须装了 Python(如果用 PySpark)、有 Hadoop 客户端、且能访问 HDFS(比如 event log 路径) -
--deploy-mode cluster:Driver 在 YARN 分配的 container 中启动,日志只能通过yarn logs -applicationId <id>查,但提交机无依赖,适合生产脚本 - 注意:
spark-shell默认只支持client模式,强行加--deploy-mode cluster会报错Cluster deploy mode is not applicable to spark-shell
spark-defaults.conf 里 spark.yarn.jars 必须指向 HDFS 上的 JAR 包,不能本地路径
Spark on YARN 要求所有 Spark 的 core JAR 包对每个 NodeManager 可见。YARN 不会自动分发 $SPARK_HOME/jars/ 到各节点,所以必须提前上传并配置。
- 先执行:
hdfs dfs -mkdir -p /spark/jars,再hdfs dfs -put $SPARK_HOME/jars/*.jar /spark/jars/ - 然后在
spark-defaults.conf写:spark.yarn.jars hdfs://master:9000/spark/jars/*(注意协议、host、port 要和core-site.xml里的fs.defaultFS一致) - 如果写成
file:///opt/spark/jars/*,NodeManager 找不到 JAR,报错Failed to locate Spark assembly - Spark 3.x 开始支持
spark.yarn.archive代替spark.yarn.jars,但 2.2 不支持,别乱试
SPARK_DIST_CLASSPATH 动态生成和 spark.yarn.jars 的 HDFS 路径一致性——这两处出问题,连最简单的 spark-submit --master yarn --class org.apache.spark.examples.SparkPi $SPARK_HOME/examples/jars/spark-examples_*.jar 10 都跑不起来。


















