我通過理解地圖和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?
在此先感謝。任何幫助將不勝感激。
讓靜態變量沒有意義。因爲每次你的地圖對象都會被創建。另外,如果某些人如何能夠在一臺機器上實現並行性,那麼我應該同步靜態變量。此外,FlatMapFunction使你覆蓋「public Iterable call(Iterator itr)」 –
另外,你可以讓我知道懶惰的集合或可能泄漏到磁盤的情況下內存(如果達到它的最大內存緩衝區限制)? –