为什么Spark应用程序在spark-shell中工作但是失败了" org.apache.spark.SparkException:任务不可序列化"在Eclipse中?

时间:2017-06-28 01:37:24

标签: eclipse scala apache-spark apache-spark-sql

为了将文件(由|分隔)保存到DataFrame中,我开发了下一个代码:

obs5

我用于创建DataFrame的case类定义如下:

val file = sc.textFile("path/file/")
val rddFile = file.map(a => a.split("\\|")).map(x => ArchivoProcesar(x(0), x(1), x(2), x(3))

val dfInsumos = rddFile.toDF()

我已经使用 spark-shell 完成了一些功能测试,我的代码运行正常,正确生成了DataFrame。但是当我将程序执行到eclipse时,它会抛出下一个错误:

enter image description here

我的scala类中是否缺少了我正在使用和运行eclipse的东西。或者是什么原因导致我的函数在 spark-shell 中正常工作,而不是在我的eclipse应用程序中?

的问候。

2 个答案:

答案 0 :(得分:1)

  

我已经使用spark-shell完成了一些功能测试,我的代码运行正常,正确生成了DataFrame。

那是因为spark-shell负责为您创建SparkContext的实例。 spark-shell然后确保SparkContext的引用不是来自“敏感地点”。

  

但是当我将程序执行到eclipse时,它会抛出下一个错误:

在Spark应用程序的某个地方,您持有对{strong> 序列化的org.apache.spark.SparkContext的引用,因此将Spark计算从序列化中恢​​复并通过线路发送给执行程序。

正如@T. Gawęda在评论中提到的那样:

  

我认为ArchivoProcesar是一个嵌套类,并且作为嵌套类,它具有对具有类型SparkContext

类型属性的外部类的引用

因此,在将代码从spark-shell复制到Eclipse时,你已经添加了一些额外的行,你没有想到它们是不必要的,而恰恰相反。找到您创建和引用SparkContext的任何地方,您将找到问题的根本原因。

我可以看到Spark处理发生在ValidacionInsumos方法使用的main类中。我认为影响方法是LeerInsumosAValidar进行map转换,这就是你应该寻求答案的地方。

答案 1 :(得分:0)

您的案例类必须具有公共范围。你不能在一个类

中拥有ArchivoProcesar