簡體   English   中英

Spark RDD.aggregate vs RDD.reduceByKey?

[英]Spark RDD.aggregate vs RDD.reduceByKey?

我有和RDD [String]每行包含一個單詞。 目前規模很小,10-20k線,但目標是將其擴展到數億行。 我遇到的問題是,即使對於這個小數據集,執行map / reduceByKey操作的時間也要長得驚人。 我執行以下操作:

val wordcount = filtered.map(w => (w,1)).reduceByKey(_ + _)

對於16780線,在2 GHz i7 8 GB RAM機器上需要12321 ms。 我發現有一種叫做聚合的方法可能更有效,因此速度更快:

aggregate[U: ClassTag](zeroValue: U)(seqOp: (U, T) => U, combOp: (U, U) => U): U

在我的案例中,我無法弄清楚如何實現這一點。 我假設它應該是類似的東西

aggregate(collection.immutable.Map)(??)

所以我的問題是

1)使用aggregate而不是reduceByKey是否有意義

2)如果確實如此,它將如何實施?

我想,最快的是countByValue

返回此RDD中每個唯一值的計數作為(值,計數)對的映射。 最終組合步驟在主服務器上本地發生,相當於運行單個reduce任務。

用法很簡單:

val wordcount = filtered.countByValue

這個方法的實現應該回答第二個問題:)

順便說一句, reduceByKey不應該花那么長時間。 看起來預計算(即過濾)占用了這12秒的大部分時間。 要驗證它,請在計數之前persist RDD:

val persisted = filtered.persist
val wordcount = persisted.countByValue

countByValue是最快的方法,但是它的實現使用哈希映射並合並它們,所以如果你有大量的數據,這種方法可能無法很好地擴展(特別是當你考慮內存已經有多少問題時)。 你可能想要使用map reduce中的標准計數方法來映射該行,將1作為對映射,然后使用reduceBykey如下所示:

val wordCount = filtered.map((_,1)).reduceByKey(_+_).collect()

你也可以考慮使用countByValueApprox一般在處理數據時這個大的近似通常是足夠好的,而且到目前為止最有效的方法(盡管它仍然使用哈希映射,因此使用許多獨特的單詞你仍然可能失敗)。 如果你不能運行countByValue ,你可以考慮使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM