2016-08-10 23 views
0

我有一個問題,我不明白。CogroupBy是否只涉及一名工人?

我有兩個文件,一個是272個對象,另一個是748922個對象。 我想爲第一個集合中的每個對象添加第二個集合,所以272 * 748922 ...

我需要它,因爲第一個集合的每個對象都有自己的計算,而且相對於第二個集合。

因此,我在每條記錄上添加一個關鍵tmp = 1,然後我分組seconc集合,並將它的值(789222 hashmaps向量)合併到第一個集合中的每個記錄中。

問題是我的印象是隻有一名工人蔘與其中。 有沒有辦法讓更多的工人蔘與這個行動?

因爲我明白這是一個大的計算,但對於50名工人是什麼... 尤其是當你考慮一個事實,即第二收集15,7莫...

一個模式來理解狀態:

Pcoll 1:[{:tmp 1 [更多數據...]} {:tmp 1 [更多數據...]} ...](272個元素)
Pcoll 2:[{ tmp 1:數據(... 75000個元素的向量...)}](1個元素)

Pcoll結果:[{:tmp [more data ...]:data(vector of 750 000 elemen TS)} ...(272元)

我用TMP加入,並添加:數據Pcoll 1

的每一個元素這是幾乎沒有在我的腦海,爲什麼這麼慢?

謝謝!

回答

1

從我所瞭解的情況來看,這聽起來像是兩個系列中的所有元素都有相同的關鍵。這意味着CoGroupByKey的結果是單個元素,其中包含單個CoGBKResult中的所有數據。單個元素的處理不能跨越多個工作者,因爲元素不能被分割。

如果你使用不同的鍵,你最終會得到多個元素,並且每個元素的處理最終可能會在不同的worker上。

另一個聽起來可能更適合您的使用案例的選項是side-input。這些允許您將第二個PCollection設置爲可供所有工作人員使用的一些數據 - 無論是作爲單個列表還是作爲地圖 - 然後在處理PColl1中的每個元素時針對該數據運行查找。

+0

感謝您的回答。這很難解釋,因爲我使用Clojure包裝。我加入了:tmp,所以結果與SQL相似:Pcoll1的每個元素都包含以下內容:Pcoll2的唯一元素的數據。我只想將第二個Pcoll的數據添加到Pcoll1的所有獨特元素。如果Java中有一個意思,我會很高興!我用視覺效果更新了我的帖子。底下,我知道自定義連接的Java代碼首先被group-by:tmp所以是1對1操作。我也可以加入4個領域來傳播工作,但我感覺它不會工作^^ –

+0

我認爲第三段(side-inputs)可能更適合您正在執行的加入。你看過那些嗎? –

+0

謝謝我把它解釋得很差,因爲我不知道它存在。希望在Clojure包裝中有這個選項。我會測試它,看看它是否工作! –