我的代码在本地模式下工作,但是在用yarn(客户端或群集模式)时,它将停止此错误:
Exception in thread "main" org.apache.spark.SparkException: Job aborted due to stage failure: Task 1 in stage 0.0 failed 4 times, most recent failure: Lost task 1.3 in stage 0.0 (TID 6, hadoopdatanode, executor 1): java.io.IOException: java.lang.NullPointerException
at org.apache.spark.util.Utils$.tryOrIOException(Utils.scala:1353)
at org.apache.spark.rdd.ParallelCollectionPartition.readObject(ParallelCollectionRDD.scala:70)
我不明白为什么它在本地模式下起作用,但在纱线上却不起作用。问题来自rdd.foreach中sparkContext的声明。 我需要在executeAlgorithm内有一个sparContext,并且因为sparcontext无法序列化,所以我必须将其放入rdd.foreach
这是我的主要对象:
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setAppName("scTest")
val sparkContext = new SparkContext(sparkConf)
val sparkSession = org.apache.spark.sql.SparkSession.builder
.appName("sparkSessionTest")
.getOrCreate
val IDList = List("ID1","ID2","ID3")
val IDListRDD = sparkContext.parallelize(IDList)
IDListRDD.foreach(idString => {
val sc = SparkContext.getOrCreate(sparkConf)
executeAlgorithm(idString,sc)
})
提前谢谢
答案 0 :(得分:1)
rdd.foreach{}
块通常应该在集群中某个位置的执行程序中执行。但是,在本地模式下,驱动程序和执行程序共享同一个JVM实例,以访问堆内存中存在的其他类/实例。
导致不可预期的行为。因此,您不能,也不应从执行者节点调用驱动程序的对象,例如SparkContext,RDD,DataFrames等。有关更多信息,请告知以下链接:
Apache Spark : When not to use mapPartition and foreachPartition?
Caused by: java.lang.NullPointerException at org.apache.spark.sql.Dataset