簡體   English   中英

為什么Spark應用程序可以在spark-shell中運行,但是在Eclipse中顯示“ org.apache.spark.SparkException:任務不可序列化”失敗?

[英]Why does Spark application work in spark-shell but fail with “org.apache.spark.SparkException: Task not serializable” in Eclipse?

為了將文件(由|分隔)保存到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類的定義如下:

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

我已經使用spark-shell完成了一些功能測試,並且我的代碼工作正常,可以正確生成DataFrame。 但是,當我將程序執行到eclipse時,它將引發下一個錯誤:

在此處輸入圖片說明

我正在使用並運行eclipse的scala類中是否缺少某些東西。 還是我的功能在spark-shell上正常運行但在eclipse應用程序中無法正常運行的原因可能是什么?

問候。

我已經使用spark-shell完成了一些功能測試,並且我的代碼工作正常,可以正確生成DataFrame。

這是因為spark-shell會為您創建一個SparkContext實例。 然后, spark-shell確保對SparkContext引用不是來自“敏感位置”。

但是,當我將程序執行到eclipse時,它將引發下一個錯誤:

在Spark應用程序中的某個位置,您擁有對org.apache.spark.SparkContext的引用,該引用不可序列化,因此可以阻止Spark計算被序列化並通過電線發送給執行者。

作為@T。 Gawęda在評論中提到:

我認為ArchivoProcesar是一個嵌套類,並且嵌套類具有對外部類的引用,該外部類具有SparkContext類型的SparkContext

因此,盡管從復制的代碼spark-shell到Eclipse 添加一些額外的線,你不顯示以為他們沒有必要的,這正好是完全相反。 找到您創建和引用SparkContext所有地方,您將找到問題的根本原因。

我可以看到Spark處理發生在main方法使用的ValidacionInsumos類內。 我認為影響方法是LeerInsumosAValidar map變換的LeerInsumosAValidar ,這是您應該尋求答案的地方。

您的案例類必須具有公共作用域。 您不能在類中包含ArchivoProcesar

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM