2017-06-03 73 views
1

我有一個火花應用程序,其中我需要從執行程序的數據驅動程序,我正在使用collect()。但是,我也遇到了toLocalIterator()。據我在互聯網上閱讀了toLocalIterator(),它返回一個迭代器,而不是立即發送整個RDD,所以它具有更好的內存性能,但速度如何?當涉及到執行/計算時間時,collect()toLocalIterator()之間的性能如何?這是更快的火花,collect()或toLocalIterator()

+0

RDD.toLocalIterator方法可以用更有效的方式編寫來完成這項工作。它使用runJob來評估每個步驟中只有一個分區。所以,在這種情況下,LocalIterator()會更快 –

回答

1

引述the documentation notes

這導致多火花的作業,如果輸入RDD是寬轉換的結果(例如,具有不同的partitioners加入),以避免重新計算輸入RDD應緩存第一。

這意味着,在最壞的情況下(沒有緩存的話)也可以是正的分區倍collect更加昂貴。即使數據爲cached,在大型數據集上啓動多個Spark作業的開銷可能很大。然而,較低的內存佔用量可以部分彌補這一缺陷,並在特定配置上加深。

總的來說,這兩種方法效率低下,應該避免在大型數據集上使用。

0

對於toLocalIterator,它用於將散佈在羣集中的RDD中的數據收集到一個節點中,該程序正在運行該節點,並對同一節點中的所有數據執行一些操作。它與collect方法類似,但不是返回一個List,而是返回一個Iterator。

因此,在使用foreach將函數應用於RDD之後,可以調用toLocalIterator來獲取RDD的所有內容的迭代器並對其進行處理。但是,請記住,如果RDD非常大,則可能會遇到內存問題。如果您想在執行所需操作後再將其轉換爲RDD,請使用SparkContext將其並行化。