数据算法 --hadoop/spark数据处理技巧 --(二次排序问题和TopN问题)
一、二次排序問題。
MR/hadoop兩種方案:
1.讓reducer讀取和緩存給個定鍵的所有值(例如,緩存到一個數組數據結構中,)然后對這些值完成一個reducer中排序。這種方法不具有可伸縮性,因為reducer要接受一個給定鍵的所有值,這種方法可能導致reducer的內存耗盡(OOM)。另一方面,如果值數量很少,就不會導致內存溢出,那么這種方法可行。
2.使用MR框架對reducer的值排序(這樣一來,就不再需要對傳入reducer的值完成排序。)這種方法“會為自然鍵增加部分或整個值來創建一個組合鍵以實現排序目標”(參考 java Code Geeks)。這種方法可伸縮,不會產生內存溢出錯誤。在這里,排序工作基本上由MR框架來完成。
? ?使用MR框架的二次排序設計模式,規約器值到達時就是有序地。(也就是說,不再需要在內存中對值進行排序)。這種技術使用了MR框架的洗牌和排序技術完成規約器值的排序。這種解決方案比1更可取,不再依賴內存完成排序?! ?/p>
思考分析:對返回數據形式進行分析,自定義對象和reducer的分區策略。(當然為了實現排序,要對自定義的對象進行實現comparele接口,重寫compare方法。)
?
spark兩種方案:
1.將一個給定鍵的所有值讀取緩存到一個List數組結構中,然后對這些值完成排序。優缺點同MR方案1.
2.使用Spark框架對規約器值排序(這種做法不需要對傳入規約器的值完成規約器中排序)。這種方法“會為自然建增加部分或整個值來創建一個組合鍵以實現排序目標?!?/p>
?
二。 Top N問題。
列表L的TopN 算法大致描述:L列表的元素是一個scala的tuple結構,通過java的TreeMap將一個tuple添加到其中,然后對TreeMap進>N的if操作,來進行remove操作。
1.唯一鍵。
例子:
在這個問題上,可以使用一個規約器完成對所有數據的接收,所有壓力和負載全部是都在這一個節點上。在這里不糊帶來性能問題,為什么呢。假設有由1000個映射,每個映射器只會生成10個鍵值對,因為,這個規約器只會得到10*1000個記錄,這個數據量還不至于導致性能瓶頸。
2.非唯一鍵
? 例子:
topN設計模式:這里假設所有K不是唯一的,主要步驟:
①。確保所有K是唯一的。要保證K是唯一的(存在不唯一的,直接把相同的K的V相加。),我們要把輸入映射到JavaPairRDD<K,V>對,然后交給reduceByKey().
②。將所有唯一的(K,V)對劃分為M個分區。
?、?。找出個個分區的Top N。
?、堋U页鏊斜镜豻opN的最終top N.
轉載于:https://www.cnblogs.com/dhName/p/11351718.html
總結
以上是生活随笔為你收集整理的数据算法 --hadoop/spark数据处理技巧 --(二次排序问题和TopN问题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 万亿级流量高可用延时服务架构设计
- 下一篇: jdbc的批量操作