Apache Spark 作业在本地运行,但在 Google 云集群上抛出空指针

Apache Spark job runs locally but throwing null pointer on Google Cloud Cluster

我有一个 Apache Spark 应用程序,直到现在我一直在 running/testing 在本地计算机上使用命令:

spark --class "main.SomeMainClass" --master local[4] jarfile.jar

一切运行正常,但是当我将同样的作业提交给 Google Cloud Dataproc Engine 时,它​​抛出 NullPointerException 如下:

Caused by: java.lang.NullPointerException
at geneticClasses.FitnessCalculator.calculateFitness(FitnessCalculator.java:30)
at geneticClasses.StringIndividualMapReduce.calculateFitness(StringIndividualMapReduce.java:91)
at mapreduce.Mapper.lambda$mapCalculateFitnessd84c37(Mapper.java:30)
at org.apache.spark.api.java.JavaPairRDD$$anonfun$pairFunToScalaFun.apply(JavaPairRDD.scala:1018)
at 
.
.
.

此错误是在 map 阶段从工作节点抛出的。除了本地模式只是将工作节点模拟为单独的线程之外,本地模式和实际集群之间有什么区别? FitnessCalculator 位于驱动程序节点上,所有方法都是静态的。我是否需要制作它 Serializable 以便它可以与其他代码一起发送到工作节点?

谢谢

你说 FitnessCalculator 只有静态方法,并且它在本地模式下工作。我的猜测是您在驱动程序中设置了一些静态对象(初始化为 null),然后尝试在 FitnessCalculator.java:30 的 Spark 任务中使用。不幸的是,这行不通。

静态字段的更改不会分发给 Spark 工作人员。它在 local 模式下工作的原因是工作人员 运行 在与驱动程序相同的 JVM(Java 虚拟机)中,因此他们恰好可以访问新值。