測試小結:
1.若是隻須要對數據集進行過濾,篩選則只須要編寫Mapper類,不須要Reduce類,此時要執行下面一條語句:job.setNumReduceTesk(0);
2.若是須要對處理的數據進行分組(group by)、排序(order by)、錶鏈接(join)、排重(distinct)等操做則須要編寫Reducer類,由於這些操做都是基於MapTask的輸出鍵(Key)來完成的;
3.若是既有分組又有排序只能使用兩個MapReduce做業來串接完成,由於分組和排序會涉及到兩次Shuffle過程;算法
分組與排序的本質何在?
分組是基於排序來完成,也就是說在分組以前其實上已經通過排序,從MapTask到ReduceTask的Shuffle的過程所使用的默認排序是升序,排序就是比較值的大小。數組
數字類型:直接根據數值大小進行比較;
字符串類型:根據字典序列(ASCII碼值大小)進行比較;緩存
大數據學習交流羣:217770236 讓我咱們一塊兒學習大數據網絡
Combiner產生緣由:併發
每個map均可能會產生大量的本地輸出,Combiner的做用就是對map端的輸出先作一次合併,以減小在map和reduce節點之間的數據傳輸量,以提升網絡IO性能,是MapReduce的一種優化手段之一。Combiner是繼承自Reducer類。app
Combiner組件:分佈式
1.是在每一個 map task 的本地運行,能收到map輸出的每個key的valuelist,因此能夠作局部彙總處理函數
2.由於map task 的本地進行了局部彙總,就會讓map端的輸出數據大幅精簡,減小shuffle過程的網絡IOoop
3.Combiner其實就是一個reduce組件,與reduce的區別在於:Combiner運行maptask的本地性能
4.Combiner在使用時須要注意,輸入輸出KV數據類型要跟map和reduce的相應數據類型匹配(combiner的輸入是map的輸出;combiner的輸出是reduce的輸入)
5.要注意業務邏輯不能由於Combiner的加入而受影響。
那麼在程序中的使用是:
能夠直接在Runner類中main方法中:
在指定reduce類後,指定Combiner類便可:語句 wcjob.setCombinerClass(WordCountReducer.class);
由於Combiner實際就是reduce組件,因此可使用以前指定的reduce便可。
Job wcjob = Job.getInstance(conf); 因此wcjob是job的實現類。
使用場景:即第五條中所述的狀況;
不能使用場景:在求取平均數時,由於添加的Combiner組件是與reduce組件具備相同的邏輯,會提早求一次平均值後傳給reduce類,致使求取的平均值錯誤。
使用卡賓類須要注意問題:
1.combiner類與普通的Reducer類都同樣,繼承於Reducer類;
2.combiner類的統計算法對於ReduceTask而言必須具備可拆解性,不然不能使用combiner;
3.若是你的conbiner類的算法與Reduce的算法徹底一致,則可直接編寫的Reducer類做爲combiner;
Hadoop中的分佈式緩存:基於磁盤IO進行迭代,消耗較大,可是磁盤存儲數據的性價比更高;主要作離線數據處理; |
Spark是:基於內存進行迭代的,對於實時處理數據和處理稍微小點的數據更具備優點;主要作流式數據處理; |
當內存的容量可以達到很高而且購買內存花費也不高,即性價比和磁盤差距不大時,那麼hadoop就將會面臨被淘汰的危機。 |
hadoop集羣分區:
一、分區是必需要經歷Shuffle過程的,沒有Shuffle過程沒法完成分區操做
二、分區是經過MapTask輸出的key來完成的,默認的分區算法是數組求模法:
數組求模法:
將Map的輸出Key調用hashcode()函數獲得的哈希嗎(hashcode),此哈希嗎是一個數值類型,將此哈希碼數值直接與整數的最大值(Integer.MAXVALUE)取按位與(&)操做,將與操做的結果與ReducerTask
的數量取餘數,將此餘數做爲當前Key落入的Reduce節點的索引;
-------------------------
Integer mod = (Key.hashCode()&Integer.MAXVALUE)%NumReduceTask;
被除數=34567234
NumReduceTask=3
-------結果:
0、一、2 這三個數做爲Reduce節點的索引;
數組求模法是有HashPartitioner類來實現的,也是MapReduce分區的默認算法。
hadoop集羣的性能和效率:
一、數據量須要達到必定的數量級使用hadoop集羣來處理纔是划算的
二、集羣的計算性能取決於任務數量的多少,設置任務數量必須充分考慮到集羣的計算能力(好比:物理節點數量);
a、Map設置的任務數量做爲最小值參考
b、Reduce的任務數默認是1,若是設置了則啓動設置的數量無論MapTask仍是ReduceTask,
無論MapTask仍是ReduceTask,只要任務數量越多則併發能力越強,處理效率會在必定程度上越高;可是,設置設置的任務數量必須參考集羣中的物理節點數量,若是設置的任務數量過多,會致使每一個物理節點上分攤的任務數量過多,處理器併發每一個任務產生的計算開銷越大,任務之間因處理負載致使相互之間的影響很大,任務失敗率上升,計算性能反而降低(由於任務失敗會從新請求,至多從新請求三次),所以在設計MapTask與ReduceTask任務數量時必須權衡利弊,折中考慮...