在纱线簇上分布sparkContext错误

时间:2019-02-27 13:01:47

标签: scala apache-spark

我的代码在本地模式下工作,但是在用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)    

    })

提前谢谢

1 个答案:

答案 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