You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非Hadoop集群机器运行spark-submit遇类缺失等问题求助

Spark on Yarn集群模式NoClassDefFoundError问题排查与解答

问题场景

在Windows(部署路径C:\HadoopClient)和Linux(部署路径~)环境下,为分析师搭建桌面版Spark客户端,将用户提供的Apache Hadoop预构建版Spark集成到现有Hadoop客户端中。执行基础SparkPi提交命令:

spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster Spark/examples/jars/spark-examples_2.12-3.1.1.jar

时,出现java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FSDataInputStream错误。已确认JAVA_HOME、HADOOP_HOME、SPARK_HOME等环境变量及PATH配置正确,SPARK_DIST_CLASSPATH包含hadoop classpath的输出内容。查看集群节点的launch_container.sh发现,作业CLASSPATH混入了本地机器的SPARK_DIST_CLASSPATH内容,而org/apache/hadoop/fs/FSDataInputStream所在的hadoop-common-3.1.2.jar确实存在于集群节点/usr/lib/hadoop目录下且包含目标类,但Yarn仍无法加载。


疑问解答

1. 明明在CLASSPATH中,Yarn为何找不到hadoop-common-3.1.2.jar?

  • 本地SPARK_DIST_CLASSPATH包含的是本地Hadoop Jar的绝对路径(如Windows下的C:\HadoopClient\...或Linux本地的~/...),这些路径在集群节点上不存在,导致CLASSPATH解析失败,甚至覆盖了集群本地/usr/lib/hadoop路径的加载优先级。
  • Yarn容器的CLASSPATH加载顺序存在问题:如果无效的本地路径排在集群Hadoop Jar路径之前,JVM会优先尝试加载不存在的路径,后续有效路径的Jar可能被忽略。
  • 集群Yarn配置缺失:若yarn.application.classpath未配置/usr/lib/hadoop/*或/usr/lib/hadoop/common/*,即使Jar存在于节点本地,容器也无法自动识别加载。

2. 本地SPARK_DIST_CLASSPATH出现在Yarn作业的CLASSPATH中,是无用冗余还是配置错误?

这属于配置错误:

  • Spark在Yarn集群模式下,客户端的SPARK_DIST_CLASSPATH是本地环境配置,集群容器不需要依赖本地的Hadoop类路径。当设置SPARK_DIST_CLASSPATH包含hadoop classpath时,客户端会将本地Hadoop类路径传递给Yarn,导致集群容器CLASSPATH混入无效本地路径。
  • 正确做法:Yarn集群模式下,无需在客户端设置SPARK_DIST_CLASSPATH包含Hadoop类路径,集群节点Yarn会自动加载本地Hadoop类路径。如需额外配置,应通过Spark的spark.yarn.jars或集群级Yarn配置统一管理。

3. 使用适配Hadoop3.1.2的预构建Spark时,spark-submit为何不将hadoop-common-3.1.2.jar发送至集群?

  • Spark预构建包中,Hadoop相关Jar默认标记为provided依赖(即假设集群环境已提供这些Jar),因此spark-submit不会主动将其上传到集群的__spark_libs__目录。
  • 报错JNI错误和NoClassDefFoundError: org/apache/hadoop/conf/Configuration,说明集群Hadoop环境与Spark预构建包依赖的版本不兼容,或Yarn容器未正确加载本地Hadoop类路径。即使本地Spark的jars目录下有该Jar,集群模式下客户端不会上传provided级别的依赖。
  • 解决思路:确认集群Hadoop版本与Spark预构建包适配版本完全一致;检查yarn.application.classpath配置,确保包含Hadoop common模块的Jar路径;若必须上传Hadoop Jar,可通过spark-submit --jars参数手动指定,或修改spark.jars.packages配置强制引入。

内容的提问来源于stack exchange,提问作者Alexey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 10:50:23