Spark代码中的“任务不可序列化”错误

时间:2015-04-09 09:17:54

标签: scala apache-spark

我从以下代码中收到Task not serializable错误。

   var inputRDD = sc.textFile(inputPath).flatMap(line => line.split(":")).map{word => (word)} 
   var i = 1
   var characters:Array[String] = new Array[String](3)
   characters = Array("a","i","m")    
   for (i <- 1 to 4){
     inputRDD.foreach { word =>
          sc.broadcast(replacement)
          val result = word.replaceAll(replacement, "b")
          println(word,result)
          replacement = characters(i)        
      }
     }

我在网上找不到任何帮助。我需要一些帮助。 感谢

2 个答案:

答案 0 :(得分:1)

此代码尝试在RDD的闭包内使用SparkContext(sc)。 sparkContext不可序列化,并不意味着在其使用中序列化。

我不清楚这段代码试图实现什么,但需要更改它以从任何闭包中删除sparkContext的使用。

答案 1 :(得分:0)

@maasg已经回答了你的问题。但代码是错误的,我认为你需要一些帮助才能使它运行起来。我不知道您是否通读了http://spark.apache.org/docs/latest/programming-guide.html

你的错误:

    第一行中的
  • map{word => (word)}什么也没做。它只是将每个单词映射到自身。
  • 第二行的i未使用。 for循环声明了一个新变量。您不需要预先声明循环变量。
  • 未使用characters的初始值并立即替换。为什么不从最终值开始呢?然后,所有var都可以是val s。 val更容易使用,因为它们不会改变价值观。
  • foreach内,您尝试为replacement创建一个未声明的广播变量。必须在驱动程序上运行的代码中调用sc.broadcastforeach的主体将在执行程序中运行)。 sc.broadcast返回一个广播变量,然后您可以在执行程序上运行的代码中使用该变量。相反,你只需从地面上的返回变量开始。
  • broadcast仅对大值(例如&gt; 10kB)很重要。暂时不要担心。
  • 您尝试将3元素数组(characters)从1索引到4。有效索引从0到2。
  • foreach不能用于修改RDD。 RDD是不可变的。您需要使用map代替从原始RDD创建新的修改过的RDD。

我对您尝试做的事情的猜测是加载文件,拆分冒号并用{{替换三个字母(aim) 1}}。以下是如何做到这一点:

b