0

我有一个 Apache Spark 应用程序,到目前为止我一直在使用命令在本地机器上运行/测试:

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$mapCalculateFitness$3d84c37$1(Mapper.java:30)
at org.apache.spark.api.java.JavaPairRDD$$anonfun$pairFunToScalaFun$1.apply(JavaPairRDD.scala:1018)
at 
.
.
.

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

谢谢

4

1 回答 1

4

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

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

于 2016-03-04T20:27:58.437 回答