取消
顯示的結果
而不是尋找
你的意思是:

我如何處理任務不是序列化異常?

cfregly
貢獻者
9回複9

cfregly
貢獻者

如果你看到這個錯誤:

org.apache.spark。火花Exception: Job aborted due to stage failure: Task not serializable: java.io.NotSerializableException: ...

上述錯誤可以當你intialize觸發一個變量在司機(主),然後嚐試使用它的工人。在這種情況下,火花流將嚐試序列化的對象發送到工人,和失敗如果沒有可序列化的對象。考慮下麵的代碼片段:

NotSerializable NotSerializable = new NotSerializable ();JavaRDD <字符串>抽樣= sc.textFile (“/ tmp / myfile”);

抽樣。地圖(s - > notSerializable.doSomething (s)) .collect ();

這將引發錯誤。這裏有一些建議來解決這個錯誤:

  • 使類可序列化的
  • lambda函數中聲明的實例隻通過地圖。
  • 使NotSerializable對象作為靜態和每台機器上創建它一次。
  • 叫抽樣。forEachPartition和創建NotSerializable對象如下:
抽樣。forEachPartition (iter - > {NotSerializable NotSerializable = new NotSerializable ();

/ /……現在流程iter});

enjoyear
新的貢獻者二世

    我不能讓類可序列化的,我不想一次又一次地在lambda函數創建實例。所以,

    1。如何讓NotSerializable對象作為靜態和創建一次每台機器嗎?

    2。如果要求抽樣。forEachPartition,我怎麼能有返回值嗎?

    User16765128951
    因素二世

    還要注意,在磚的雲,變量在一個細胞可能是廣播,這樣他們可以從工人節點訪問。如果你不需要使用該變量在一個工人轉換節點,另一個修複是聲明變量@TransformersPorryient scala筆記本:

    @transient val myNonSerializableObjectThatIDoNotUseInATransformation = ....

    User16765128951
    因素二世

    你好,

    你可以使用單例模式來創建一個對象一旦每台機器。這是在維基百科上解釋得很好:

    https://en.wikipedia.org/wiki/Singleton_pattern

    如果你想返回值,您可以使用mapPartitions轉換而不是forEachPartition行動。

    歡迎來到磚社區:讓學習、網絡和一起慶祝

    加入我們的快速增長的數據專業人員和專家的80 k +社區成員,準備發現,幫助和合作而做出有意義的聯係。

    點擊在這裏注冊今天,加入!

    參與令人興奮的技術討論,加入一個組與你的同事和滿足我們的成員。

    Baidu
    map