2015-04-15 52 views
5

有跡象表明,Spark中的連接是使用/基於cogroup函數/ primitive/transform實現的。因此,讓我首先關注cogroup--它返回的結果是RDD,它基本上由cogrouped RDD的所有元素組成。換句話說 - 對於每個齒形RDD中的每個鍵,至少有一個齒形RDD中的一個元素。Spark中的連接和cogroup

這意味着,當較小時,流傳輸例如JavaPairDstreamRDD不斷加入更大的批處理RDD,這將導致爲結果的多個實例分配RAM(cogrouped)RDD aka本質上是大批量RDD和更多... 顯然,當DStream RDD獲得時RAM會返回放棄和他們做定期,但仍似乎在RAM消費

不必要的秒殺我有兩個問題:

  1. 反正是有控制的協同組的過程更加「精確」如告訴它在每個給定密鑰中包含每個cogrouped RDD中至少有一個元素的cogrouped RDD only元素。基於目前的協同組API如果協同組是真的有這樣的大錘,其次是基於協同組那麼即使他們可以到最後看到的最終結果方面呈現出更漂亮的圖片的加入,這是不可能

  2. 用戶是否意味着在引擎蓋下仍然存在相同的殘酷內存消耗

回答

5

這並沒有那麼糟糕。它很大程度上取決於您的分區的粒度。 Cogroup將首先通過密鑰在磁盤中對不同的執行程序節點進行洗牌。對於每個密鑰,是的,對於這兩個RDD,具有該密鑰的所有元素的所有元素將被加載到RAM中並提供給您。但是並不是所有的密鑰都需要在任何給定的時間在RAM中,所以除非你的數據真的傾斜了,否則你不會受到太大的影響。

+0

cogrouping幫助之前將使用與相同分區程序的重新分區嗎? –

+0

我有超過5個JavaPairRDD,包含一個主對REDD。我想結合這些所有基礎的masterRDD。我怎樣才能做到這一點 ? – junsid

+0

如何將'cogroup'用於大數據集,比如當我使用'collect()'它會拋出內存異常'rdd1 = rdd2.cogroup(rdd3).collect'。你可以幫助解決這個問題[https://stackoverflow.com/questions/47180307/how-to-use-cogroup-for-large-datasets]。可以分區幫助我是新來的任何幫助來解決這個問題。 – Vignesh