Java Apache Spark作业在本地运行,但在Google云集群上抛出空指针
我有一个Apache Spark应用程序,到目前为止,我一直在使用以下命令在本地计算机上运行/测试:Java Apache Spark作业在本地运行,但在Google云集群上抛出空指针,java,apache-spark,google-cloud-dataproc,Java,Apache Spark,Google Cloud Dataproc,我有一个Apache Spark应用程序,到目前为止,我一直在使用以下命令在本地计算机上运行/测试: spark --class "main.SomeMainClass" --master local[4] jarfile.jar 但是,当我向Google Cloud Dataproc引擎提交这项相同的作业时,它抛出了NullPointerException,如下所示: Caused by: java.lang.NullPointerException at geneticClasses.Fi
spark --class "main.SomeMainClass" --master local[4] jarfile.jar
但是,当我向Google Cloud Dataproc引擎提交这项相同的作业时,它抛出了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
位于驱动程序节点上,所有方法都是静态的。我是否需要将其序列化
,以便将其与其他代码一起发送到工作节点
谢谢您说
FitnessCalculator
只有静态方法,并且它在本地模式下工作。我猜您在驱动程序中设置了一些静态对象(初始化为null
),然后尝试在FitnessCalculator.java:30
的Spark任务中使用。不幸的是,这行不通
对静态字段的更改不会分发给Spark workers。它在
local
模式下工作的原因是,工作程序与驱动程序在同一个JVM(Java虚拟机)中运行,因此他们碰巧可以访问新值。您说FitnessCalculator
只有静态方法,并且它在本地模式下工作。我猜您在驱动程序中设置了一些静态对象(初始化为null
),然后尝试在FitnessCalculator.java:30
的Spark任务中使用。不幸的是,这行不通
对静态字段的更改不会分发给Spark workers。它在
local
模式下工作的原因是工作程序与驱动程序在同一个JVM(Java虚拟机)中运行,因此他们碰巧可以访问新值。我不确定我们是否有足够的信息。你能发布相关代码吗?我希望我能,但这是我的BSc最后一年的项目,由于剽窃或共谋,我不能把我的任何代码放在网上。我担心您可能没有足够的信息来了解问题所在,您说FitnessCalculator
只有静态方法,并且它在local
模式下工作。我猜您在驱动程序中设置了一些静态对象(初始化为null
),然后尝试在FitnessCalculator.java:30
的Spark任务中使用。这是行不通的。好吧,我想当我现在考虑它时,它是有意义的,因为您不能从worker访问位于驱动程序节点上的静态方法和字段。我更改了代码,所以我序列化FitnessCalculator并将其与其他代码一起发送到worker节点,它解决了上述问题。谢谢你。我会给下一个有这个问题的人一个答案。我不确定我们是否有足够的信息。你能发布相关代码吗?我希望我能,但这是我的BSc最后一年的项目,由于剽窃或共谋,我不能把我的任何代码放在网上。我担心您可能没有足够的信息来了解问题所在,您说FitnessCalculator
只有静态方法,并且它在local
模式下工作。我猜您在驱动程序中设置了一些静态对象(初始化为null
),然后尝试在FitnessCalculator.java:30
的Spark任务中使用。这是行不通的。好吧,我想当我现在考虑它时,它是有意义的,因为您不能从worker访问位于驱动程序节点上的静态方法和字段。我更改了代码,所以我序列化FitnessCalculator并将其与其他代码一起发送到worker节点,它解决了上述问题。谢谢你。我会给下一个有这个问题的人一个答案。