MapReduce優化——Combiner與Partitioner
Combiner和Partitioner是用來優化MapReduce的。可以提高MapReduce的執行效率。
Combiner
叢集上的可用頻寬限制了MapReduce作業的數量,因此儘量避免map和reduce任務之間的資料傳輸是有利的。Hadoop允許使用者針對map任務的輸出指定一個combiner(就像mapper,reducer)。combiner函式的輸出作為reduce函式的輸入。由於combiner術語優化方案,所以Hadoop無法確定對map任務輸出記錄呼叫多少次combiner(如果需要)。換言之,不管呼叫多次combiner,reducer的輸出結果都是一樣的。
首先通過下面的示意圖直觀的瞭解一下Combiner的位置和作用。
從下圖可以看出,Combiner介於 Mapper和Reducer之間,combine作為 Map任務的一部分,執行完 map 函式後緊接著執行combine,而reduce 必須在所有的 Map 任務完成後才能進行。 而且還可以看出combine的過程與reduce的過程類似,都是對相同的單詞key合併其詞頻,很多情況下可以直接使用reduce函式來完成Combiner過程。
Combiner解析:
1. ombiner可以看做區域性的Reducer(local reducer)。
2. Combiner作用是合併相同的key對應的value。
3. 在Mapper階段,不管Combiner被呼叫多少次,都不應改變 Reduce的輸出結果。
4. Combiner通常與Reducer的邏輯是一樣的,一般情況下不需要單獨編寫Combiner,直接使用Reducer的實現就可以了。
5. Combiner在Job中是如下設定的。 job.setCombinerClass(Reducer.class);//Combiner一般情況下,預設使用Reducer的實現
Combiner的優點
- 能夠減少Map Task輸出的資料量(即磁碟IO)。對spill,merge檔案都可以進行壓縮。
中間結果非常大導致IO成為瓶頸時壓縮非常有用,可以通過mapreduce.map.output.compress(default:false)設定為true進行壓縮,資料會被壓縮寫入磁碟,讀資料讀的是壓縮資料需要解壓,在實際經驗中Hive在Hadoop的執行的瓶頸一般都是IO而不是CPU,壓縮一般可以10倍的減少IO操作,壓縮的方式Gzip,Lzo,BZip2,Lzma等,其中Lzo是一種比較平衡選擇,mapreduce.map.output.compress.codec(default:org.apache.hadoop.io.compress.DefaultCodec)引數設定。但這個過程會消耗CPU,適合IO瓶頸比較大。 - 能夠減少Reduce-Map網路傳輸的資料量(網路IO)。Map Task 輸出越少,Reduce從Map結果中拉取的資料量就越少,自然就減少了網路傳輸的資料量。
Combiner的使用場景
- 並不是所有的場景都可以使用Combiner,必須滿足結果可以累加。
- 適合於Sum()求和,並不適合Average()求平均數。
例如,求0、20、10、25和15的平均數,直接使用Reduce求平均數Average(0,20,10,25,15),得到的結果是14, 如果先使用Combiner分別對不同Mapper結果求平均數,Average(0,20,10)=10,Average(25,15)=20,再使用Reducer求平均數Average(10,20),得到的結果為15,很明顯求平均數並不適合使用Combiner。
Partitioner
Partitioner 處於 Mapper階段,當Mapper處理好資料後,這些資料需要經過Partitioner進行分割槽,來選擇不同的Reducer處理,從而將Mapper的輸出結果均勻的分佈在Reducer上面執行。
對於map輸出的每一個鍵值對,系統都會給定一個partition,partition值預設通過計算key的hash值後對Reduce task的數量取模獲得。如果一個鍵值對的partition值為1,意味著這個鍵值對會交給第一個Reducer處理。
Partitioner解析:
Partitioner決定了Map Task 輸出的每條資料交給哪個Reduce Task 來處理。Partitioner 有兩個功能:
1) 均衡負載。它儘量將工作均勻地分配給不同的 Reduce。
2)效率。它的分配速度一定要非常快。Partitioner 的預設實現:hash(key) mod R,這裡的R代表Reduce Task 的數目,意思就是對key進行hash處理然後取模。很多情況下,使用者需要自定義 Partitioner,比如“hash(hostname(URL)) mod R”,它確保相同域名下的網頁交給同一個 Reduce Task 來處理。 使用者自定義Partitioner,需要繼承Partitioner類,實現它提供的一個方法。
public class WordCountPartitioner extends Partitioner<Text, IntWritable> { @Override public int getPartition(Text key, IntWritable value, int numPartitions) { // TODO Auto-generated method stub int a = key.hashCode()%numPartitions; if(a>=0) return a; else return 0; } } 前兩個引數分別為Map的key和value。args 為 Reduce 的個數,使用者可以自己設定。
自定義partitioner
每一個Reduce的輸出都是有序的,但是將所有Reduce的輸出合併到一起卻並非是全域性有序的,如果要做到全域性有序,我們該怎麼做呢?最簡單的方式,只設置一個Reduce task,但是這樣完全發揮不出叢集的優勢,而且能應對的資料量也很受限。最佳的方式是自己定義一個Partitioner,用輸入資料的最大值除以系統Reduce task數量的商作為分割邊界,也就是說分割資料的邊界為此商的1倍、2倍至numPartitions-1倍,這樣就能保證執行partition後的資料是整體有序的。
解決資料傾斜:另一種需要我們自己定義一個Partitioner的情況是各個Reduce task處理的鍵值對數量極不平衡。對於某些資料集,由於很多不同的key的hash值都一樣,導致這些鍵值對都被分給同一個Reducer處理,而其他的Reducer處理的鍵值對很少,從而拖延整個任務的進度。當然,編寫自己的Partitioner必須要保證具有相同key值的鍵值對分發到同一個Reducer。
自定義的Key包含了好幾個欄位,比如自定義key是一個物件,包括type1,type2,type3,只需要根據type1去分發資料,其他欄位用作二次排序。
相關推薦
MapReduce優化——Combiner與Partitioner
Combiner和Partitioner是用來優化MapReduce的。可以提高MapReduce的執行效率。 Combiner 叢集上的可用頻寬限制了MapReduce作業的數量,因此儘量避免map和reduce任務之間的資料傳輸是有利的。Hadoop
【筆記】Mapreduce資料傾斜與優化
一、資料傾斜 資料分佈: 正常的資料分佈理論上都是傾斜的,就是我們所說的20-80原理:80%的財富集中在20%的人手中, 80%的使用者只使用20%的功能 , 20%的使用者貢獻了80%的訪問量 。 1.產生原因: Mapreduce程式在執行的時候,
MapReduce優化例項(自定義Partition Combiner)
本文轉載自 MapReduce優化例項 1.案例介紹 我們使用簡單的成績資料集,統計出0~20、20~50、50~100這三個年齡段的男、女學生的最高分數 2.資料集 姓名 年齡 性別 成績 Alic
hbase優化操作與建議
global locks 讀寫 wke filesize 默認 apach 鏈接 連接 一、服務端調優 1、參數配置 1)、hbase.regionserver.handler.count:該設置決定了處理RPC的線程數量,默認值是10,通常可以調大,
數據庫優化思路與方向
每隔一秒 order 驗證 自動 上線 mysql group by hand 連接 一、基礎優化mysql> show status like 'valus'connections //鏈接參數uptime //上線時間slow_queries /
redmine在linux上的mysql性能優化方法與問題排查方案
mon 5.5 rdquo prot 針對 home erl 如何 數據信息 iredmine的linux服務器mysql性能優化方法與問題排查方案 問題定位: 客戶端工具: 1. 瀏覽器inspect-tool的network timing工具
Hadoop學習之路(十八)MapReduce框架Combiner分區
類型 規則 比較 一個 學習 過程 key-value body 註意 對combiner的理解 combiner其實屬於優化方案,由於帶寬限制,應該盡量map和reduce之間的數據傳輸數量。它在Map端把同一個key的鍵值對合並在一起並計算,計算規則與reduce一致
2018-07-30期 MapReduce分區(Partitioner)編程案例
employ stat ros 所有 app iter csv partition contex 1、EmpSalaryBean 對象package cn.sjq.mr.part;import java.io.DataInput;import java.io.DataOut
Mapreduce的分區—Partitioner
nds sub etc long on() hash rri 業務 exception 1. 需求將流量匯總統計結果按照手機歸屬地不同省份輸出到不同文件中。2. 分析Mapreduce中會將map輸出的kv對,按照相同key分組,然後分發給不同的reducetask。默認的
Mapreduce的combiner
輸出結果 父類 設置 .class 提高 邏輯 每一個 job mapred 每一個map都可能會產生大量的本地輸出,Combiner的作用就是對map端的輸出先做一次合並,以減少在map和reduce節點之間的數據傳輸量,以提高網絡IO性能,是MapReduce的一種優化
MapReduce優化參數
程序 產生 失敗 總量 manage 生效 輸入 使用 進入 1. 資源相關參數//以下參數是在用戶自己的MapReduce應用程序中配置就可以生效(1) mapreduce.map.memory.mb: 一個Map Task可使用的內存上限(單位:MB),默認為1024。
OpenCV學習筆記(31)KAZE 演算法原理與原始碼分析(五)KAZE的原始碼優化及與SIFT的比較
KAZE系列筆記: 1. OpenCV學習筆記(27)KAZE 演算法原理與原始碼分析(一)非線性擴散濾波 2. OpenCV學習筆記(28)KAZE 演算法原理與原始碼分析(二)非線性尺度空間構建 3. Op
MapReduce常見演算法 與自定義排序及Hadoop序列化
MapReduce常見演算法 •單詞計數 •資料去重 •排序 •Top K •選擇 以求最值為例,從100萬資料中選出一行最小值 •投影 以求處理手機上網日誌為例,從其11個欄位選出了五個欄位(列)來顯示我們的手機上網流量 •分組 相當於分割槽,以求處理手機上網日誌為例,喊手機號和非手
晚期(執行期)優化——Java與C/C++編譯器比較
文章目錄 單從編譯和執行上講為什麼說C/C++編譯器比Java編譯器快? 因為Java中的即時編譯器是要佔用使用者程式的執行時間的。 Java是一門型別安全的語言,會進行很多的檢查行為。如陣列是否越界、檢查空指標等 雖然java中沒有vir
MapReduce優化_1
** 1、配置調優 ** 調優總的原則給shuffle過程儘量多提供記憶體空間,在map端,可以通過避免多次溢位寫磁碟來獲得最佳效能(相關配置io.sort.*,io.sort.mb),在reduce端,中間資料全部駐留在記憶體時,就能獲得最佳效能,但是預設情況下,這是不可能發生的,
Hadoop技術內幕:深入解析MapReduce架構設計與實現原理 (大資料技術叢書).epub
【下載地址】 《Hadoop技術內幕:深入解析MapReduce架構設計與實現原理》內容簡介:“Hadoop技術內幕”共兩冊,分別從原始碼的角度對“Common+HDFS”和“MapReduce的架構設計和實現原理”進行了極為詳細的分析。《Hadoop技術內幕:深入解析M
氣泡排序的實現和優化及其與插入,選擇排序的比較
備註:這裡使用的插入排序和選擇排序都是經過優化後的詳細優化請檢視上一條部落格,編譯器使用DEV-C++ 氣泡排序演算法的運作如下:(從後往前) 1.比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。 2.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數
Hadoop權威指南---MapReduce的型別與格式
目錄 package org.apache.hadoop.mapreduce; import java.io.IOException; import org.apache.hadoop.c
Hadoop學習記錄(七、MapReduce檔案分解與合成)
1.將若干個小檔案打包成順序檔案 public class SmallFilesToSequenceFileConverter extends Configured implements Tool { static class SequenceFileMapper
Mapreduce三大元件之一Partitioner——實現自定義分割槽
MapReduce中資料流動 (1)最簡單的過程: map - reduce (2)定製了partitioner以將map的結果送往指定reducer的過程: map - partition - reduce (3)增加了在本地先進性一次reduce(優化)