Spark on YARN集群模式下Driver线程抛NullPointerException原因咨询
我来帮你拆解下在EMR 5.4.0搭配Spark 2.1.0这个环境里,Driver线程抛出NullPointerException(NPE)的几个常见具体原因——结合你日志里提到的「Waiting for spark context initialization...」,大概率和SparkContext初始化阶段的问题挂钩:
SparkContext初始化依赖的配置/资源为空
比如你代码里从SparkConf获取自定义配置参数时,用了get()而不是getOrDefault(),如果这个参数在EMR集群配置里没设置,就会返回null,后续操作这个对象直接触发NPE。另外,EMR 5.4.0如果YARN资源配置不合理(比如NodeManager内存不足,导致SparkContext无法申请到足够资源),也会间接让初始化过程中某些内部对象变成null。依赖包冲突或缺失
Spark 2.1.0依赖的Hadoop版本是2.7.3,而EMR 5.4.0正好自带这个版本的Hadoop。如果你的作业打包时引入了其他版本的Hadoop相关jar包,或者漏了某些Spark核心依赖,会导致Driver初始化时类加载失败,进而出现空指针。比如HadoopConfiguration这类核心对象初始化失败为null,后续调用它的方法就会抛NPE。Driver端代码未处理空引用
Driver线程负责作业的初始化逻辑,比如读取配置、创建RDD前的对象准备。如果你的代码里有类似SomeObject obj = null; obj.doSomething();的写法,或者调用Spark API时传了null参数(比如创建SparkSession时传入null的SparkConf),都会直接触发NPE。另外,如果你在Driver端操作外部资源(比如S3文件、数据库连接),如果连接失败返回null,后续操作也会出问题。EMR集群服务状态异常
EMR 5.4.0启动Spark作业时,ApplicationMaster会负责拉起Driver线程。如果集群里的YARN ResourceManager、HDFS NameNode这类核心服务状态不稳定,Driver初始化SparkContext时就无法获取到集群元数据,导致内部对象为null。比如日志里显示正在等待SparkContext初始化,此时如果集群返回的资源信息是null,就会触发NPE。
排查建议
- 先检查Driver端代码,尤其是SparkContext/SparkSession初始化前后的逻辑,加日志打印关键对象是否为null;
- 去EMR控制台的日志页面拉取Driver的完整堆栈信息(你贴的日志只显示了开头,完整堆栈能定位到具体代码行);
- 检查作业依赖包,避免和EMR自带的Spark/Hadoop版本冲突,尽量用EMR提供的依赖或
--packages方式引入; - 验证EMR集群配置,比如核心节点的内存、CPU是否满足作业需求,YARN队列配置是否正常。
内容的提问来源于stack exchange,提问作者Suanmeiguo

