【问题标题】:Why does Spark application work in spark-shell but fail with "org.apache.spark.SparkException: Task not serializable" in Eclipse?为什么 Spark 应用程序在 spark-shell 中工作,但在 Eclipse 中因“org.apache.spark.SparkException:Task not serializable”而失败?
【发布时间】:2019-01-10 03:02:21
【问题描述】:

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

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()

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

case class ArchivoProcesar(nombre_insumo: String, tipo_rep: String, validado: String, Cargado: String)

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

我正在使用和运行 eclipse 的 scala 类中是否缺少某些东西。或者我的函数在 spark-shell 上正常工作但在我的 eclipse 应用程序中不能正常工作的原因是什么?

问候。

【问题讨论】:

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


【解决方案1】:

我使用 spark-shell 做了一些功能测试,我的代码运行良好,正确生成了 DataFrame。

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

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

在您的 Spark 应用程序中的某处,您持有对org.apache.spark.SparkContext 的引用,该引用不可可序列化,因此阻止您的 Spark 计算被序列化并通过线路发送到执行程序。

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

我认为ArchivoProcesar 是一个嵌套类,作为嵌套类,它引用了具有SparkContext 类型属性的外部类

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

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

【讨论】:

  • 添加这个建议会很棒。从我这边投票:)
【解决方案2】:

您的案例类必须具有公共范围。类中不能有 ArchivoProcesar

【讨论】:

  • 可能对作者有帮助,但没有解释,源问题不在嵌套案例类中
猜你喜欢
  • 2015-12-19
  • 2016-01-13
  • 2016-11-11
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
  • 2018-01-20
相关资源
最近更新 更多