MapReduce 計算模式

聲明:本文摘錄自《大數據日知錄——架構與算法》一書。算法

較常見的計算模式有4類,實際應用中大部分ETL任務均可以歸結爲這些計算模式或者變體。網絡

1.求和模式架構

  a.數值求和app

  好比咱們熟悉的單詞計數,即便該模式的一個應用。求最大最小值,求平均值皆屬此類。ide

  b.記錄求和大數據

  非數值內容的累加,造成隊列。好比將包含某個key的網頁添加到一個列表當中。設計

 

2.過濾模式排序

  不對數據進行轉換,只是從大量數據中篩選。接口

  a.簡單過濾隊列

  這類應用不須要對數據進行聚合(緣由不復雜),因此無需reduce階段。

  b.Top 10

  和簡單過濾的差別在於:簡單過濾的條件判斷只涉及當前記錄,而Top k計算模式須要在記錄之間進行比較,並得到全局最大的子集。

  思路:map =>local top k =>reduce =>overall top k

 

3.組織數據模式

  a.數據分片

  重點在partitioner策略的設計上,經過改變partitioner來將相同標準的數據通過Shuffle過程放到一塊兒,由同一個reducer 來輸出。

  問題來了,這該如何實現呢?

  考慮到partitioner是能夠自定義的(這TM不廢話麼),那麼,咱們能夠在partitioner內部實現對數據的分析,而後將其輸出到不一樣的partition中。

  b.全局排序

  能夠直接利用內置排序過程,也就是說,mapper只須要將要排序的字段做爲key,記錄內容做爲value輸出便可。

  reducer其實也不須要作額外的任務,由於sort過程已經排好序了。(有一個問題,假如我對排序算法不滿意怎麼辦?一個辦法是自定義key,也就是自定義一個WritableComparable接口的類,而且根據需求實現裏面的compareTo方法)

  若是有不止一個reducer怎麼辦?若是不作額外的處理,排序結果就會成爲局部排序。

  有辦法:Partitioner,能夠將處於不一樣區間的key放在不一樣的Partition,相同區間的Key放在同一Partition。

4.Join模式

  a.Reduce-Side Join

  這個過程對於筆者而言比較複雜,因此這個主題會耗費較多文字。

  在選定外鍵以後,全部相同外鍵的數據分配到了同一個Reducer。須要注意的是如何區分來自不一樣數據集合的記錄?一個顯而易見的辦法是在Mapper階段動動手腳:給記錄作標記,放在Value中。

  而後,將reducer的Value list根據集合的不一樣整合成2個列表(或者哈希表,其實就是一個查詢效率的問題,想怎麼搞就怎麼搞),而後再將這些數據進行Join。

  多說一句:整個過程須要通過數輪磁盤的讀寫,shuffle階段的網絡傳輸,以及Reduce階段的排序,因此計算效率比較低。(意思就是Mapper幾乎什麼事都沒幹,卻由於IO的問題而致使時間效率低)

  b.Map-Side Join

  好了,效率低的解決辦法來了;不過有前提條件:數據集合一個大一個小,而且小的那個徹底能夠放入內存。

  讀者朋友,讀到這裏你應該想明白Map-side Join是怎麼回事了吧!

 

這個問題到此告一段落!

相關文章
相關標籤/搜索