2016-01-25 68 views
2

我是Spark中的新成員。Apache Spark和不可序列化的應用程序上下文

我想使用Spark和map-reduce方法並行化我的計算。 但是,我將這個計算放到Map階段的PairFunction實現中,需要一些要初始化的上下文。這個上下文包含來自第三方jar的多個單例對象,並且這些對象不是可序列化的,所以我不能在工作節點上傳播它們,並且不能在我的PairFunction中使用它們。

所以我的問題是:我可以以某種方式並行化需要使用Apache Spark不可序列化的上下文的作業嗎?還有其他解決方案嗎?也許我可以告訴Spark在每個工作節點上初始化所需的上下文?

+0

你的問題對我來說有點含糊。我會試着根據我對它的理解來回答。 Spark有兩個主要的執行環境:代碼以正常(非分佈式)方式運行的驅動程序。這是您可以初始化上下文並打開spark上下文的地方。分佈式代碼將在工作人員上執行。 –

+0

我的問題是關於應該通過工作人員執行的分佈式代碼。問題是這段代碼必須使用不可序列化的第三方對象。所以我不能在主服務器上實例化它們,然後通過網絡傳遞給工作人員。我想知道是否有任何解決方法。 – Doob

+0

如果您的代碼將被運送給工人,它應該被序列化。沒有解決辦法。如果你不需要這些對象在工人內部,你可以聲明它們是暫時的。 –

回答

1

您可以嘗試使用mapPartitionforeachPartition初始化執行程序中的第三方jar。

rdd.foreachPartition { iter => 
    //initialize here 
    val object = new XXX() 
    iter.foreach { p => 
    //then you can use object here 
    } 
} 
+0

謝謝。你能否解釋一下,這些rdd方法到底在做什麼?我打開了spark javadoc,並且沒有太多細節:「foreachPartition - 將函數f應用於此RDD的每個分區。」就是這樣。 – Doob

+0

'foreachPartition'爲每個分區執行一個函數。通過迭代器參數提供對分區中包含的數據項的訪問。 Spark將嘗試初始化驅動程序(主)上的變量,然後序列化該對象以將其發送給工作人員,如果該對象不可序列化,則該操作將失敗。 –

相關問題