2016-02-26 68 views
0

我有三個矩陣(A,B和C)作爲單獨的RDD,我需要在工作節點之間將它們劃分爲矩陣塊。我執行的操作需要更新矩陣塊,但我需要在矩陣塊上同步,以便兩個工作節點不會同時更新同一個矩陣塊。我怎樣才能實現這種同步。有沒有鎖定機制?我對Spark(PySpark)很新穎。Spark(PySpark)如何同步多個工作器節點更新RDD

是否有可能控制Spark如何完成分區,即控制哪個塊發送到哪個工作節點?

請幫忙。

回答

1

技術上完全沒關係。在Spark中沒有這樣的共享,可變狀態(人們可能會認爲accumulators就是這種情況,但請不要糾纏於此)。這意味着不存在計算可以修改共享狀態的情況,並且需要任何類型的鎖。

這在JVM上稍微複雜一些,但PySpark架構提供了工作人員之間的完全隔離,所以除非您出門在外,否則您的安全。如果你這樣做,你有責任使用上下文特定的方法處理衝突。

最後,如果您嘗試修改數據(請勿將其與RDD混合),那麼這只是一個編程錯誤。它可能會導致JVM上的一些非常醜陋的事情,但再次對PySpark應該沒有可見的影響(這只是實現問題而不是合同問題)。每個變更都應該使用變換來表示,並且只要沒有另行指定(例如請參閱foldaggregate系列),不應修改現有數據。

+0

所以基本上你說RDD是不可變的,我們只是從另一個RDD創建一個RDD。如果我錯了,請糾正我。但是接下來說我必須計算矩陣A的第i個塊,它是計算矩陣B和C的第j和第k塊,以及計算矩陣B和矩陣M的第m和第n塊C,但我需要確保這兩個計算一個接一個地完成,而不是一次完成。我怎樣才能做到這一點。 – CodeWithPride

+0

RDD是完全不同的故事,但簡化了一些事情。計算A.創建依賴於A和計算B和C的新轉換。 – zero323