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 虚拟机)中,因此他们恰好可以访问新值。
我有一个 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 虚拟机)中,因此他们恰好可以访问新值。