先講結論:如果你的RDD很大,千萬不要隨便Collect.原文出處為http://databricks.gitbooks.io/databricks-spark-knowledge-base/content/best_practices/dont_call_collect_on_a_very_large_rdd.html.只說Collect會將所有元素複製到單一台機器上,但是沒說清楚為什麼會發生這種現象.
在[Spark]RDD的不可變性中,有提到RDD在不同的階段會產生不同的RDD物件,直到我們做了reduce後資料才從RDD中計算結果,吐回一個Int給我們.雖然我們說Spark是分散式計算,但是”分散式“這件事其實是RDD物件本身的特性,當我們把資料透過reduce變成Int後,那個Int物件其實是沒有分散的(Int物件是Scala下面的特性).所以要查清楚為什麼Collect後資料會吐回一台機器上,就要來看Collect後是什麼東西:
先延續之前的例子:
到numMap為止都還是RDD物件,那我們將他collect一下:
scala> val numColl = numMap.collect()
numColl: Array[Int] = Array(11, 12, 13, 14, 15, 16, 17, 18, 19)
很清楚看到Collect這個動作執行後,資料就從RDD中拆開來變成了一個Int Array,Array本身也是Scala原有的物件,不支援分散式,也難怪如果RDD太大Collect後會炸機器了.
其他類似的功能還包括了
countByKey
countByValue
collectAsMap
沒有留言:
張貼留言