2016-12-01 86 views
7

我通過理解地圖和mapPartitions之間的差異,&很清楚何時在各種情況下使用它們。Spark RDD-地圖vs mapPartitions

但我下面介紹的問題更多基於GC活動&內存(RAM)。請閱讀下面的問題: -

=>我寫了一個map函數來將Row轉換爲String。因此,RDD [org.apache.spark.sql.Row]的輸入將被映射到RDD [String]。但是通過這種方法,將爲RDD的每一行創建地圖對象。因此創建如此大量的對象可能會增加GC活動。

=>爲了解決上述問題,我想到了使用mapPartitions。所以,這些對象的數量就等於分區的數量。 mapPartitions將Iterator作爲輸入並接受返回值和java.lang.Iterable。但是像Array,List等Iterable大部分都在內存中。那麼,如果我有大量數據,那麼通過這種方式創建Iterable可能會導致內存不足?或者是否有其他應該在這裏使用的集合(java或scala)(在內存開始填充時溢出到磁盤)?或者如果RDD完全在內存中,我們是否應該只使用mapPartition?

在此先感謝。任何幫助將不勝感激。

回答

1

如果你仔細想想JavaRDD.mapPartitions需要FlatMapFunction(或類似DoubleFlatMapFunction一些變體)預計將返回Iterator沒有Iterable。如果底層收藏是懶惰的,那麼你沒有什麼可擔心的。

RDD.mapPartitions需要從IteratorIterator的功能。

我一般如果您使用的參考數據,你可以用map代替mapPartitions並使用靜態成員來存儲數據。這將有相同的腳印,並且會更容易編寫。

+0

讓靜態變量沒有意義。因爲每次你的地圖對象都會被創建。另外,如果某些人如何能夠在一臺機器上實現並行性,那麼我應該同步靜態變量。此外,FlatMapFunction使你覆蓋「public Iterable call(Iterator itr)」 –

+1

另外,你可以讓我知道懶惰的集合或可能泄漏到磁盤的情況下內存(如果達到它的最大內存緩衝區限制)? –