2016-07-30 54 views
0

正如我們所知,我們可以使用mapPartition等爲每個分區執行設置工作,但是我有很多分區要在每個執行程序中進行處理,並且每個分區都會執行精確的設置工作。我想知道是否可以執行執行程序的設置工作而不是分區,以便同一個執行程序中的分區不必重複安裝工作。Spark:爲執行程序而不是分區設置工作

回答

0

兩種方式

  1. 使用broadcast variable。這主要是爲了將一些大型結構複製到每個執行者,所以我不確定它適用於您的用例。我只是提到它,因爲如果它適用於你的用例,這很容易得到正確的。

  2. 使用lazy值來完成所有設置工作,然後在RDD轉換中使用該值。由於價值在轉型之前不再需要,所以只有到達執行者時纔會觸發評估。然後,憑藉lazy,每個JVM實例只會執行一次,因此每個執行程序只執行一次。

    我在當前的項目中使用這種技術,所以我應該添加一個免責聲明:您必須非常仔細地編寫代碼以避免序列化錯誤...關於不可序列化的東西非常容易在你的設置代碼中。

編輯

我由於某種原因,我錯過了你還沒有標記爲「斯卡拉」,但只有「Java」的事實抱歉。我認爲我給出的建議仍然有效,但您必須努力工作才能在那裏獲得懶惰 - although that appears to not be too difficult now that Java 8 has lambdas

+0

謝謝亞歷克。我會給它一個 – weipengHU

+0

我想用廣播變量,但是我需要廣播的對象不是可序列化的對象 – weipengHU

相關問題