MapReduce的基礎知識
1、什么是MapReduce
1. Hadoop MapReduce 是一個 分布式計算框架,用于輕松編寫分布式應用程序,這些應用程序以可靠,容錯的方式并行處理大型硬件集群(數千個節點)上的大量數據(多TB數據集)
2. MapReduce 是一種面向海量數據處理的一種指導思想,也是一種用于對大規模數據進行分布式計算的編程模型。
2、Map Reduce的優缺點
2.1 優點
? MapReduce易于編程: 它簡單的實現一些接口,就可以完成一個分布式程序
? 良好的擴展性: 當你的計算資源不能得到滿足的時候,你可以通過簡單的增加機器來擴展它的計算能力。
? 高容錯性: MapReduce設計的初衷就是使程序能夠部署在廉價的PC機器上,這就要求它具有很高的容錯性。比如其中一臺機器掛了,它可以把上面的計算任務轉移到另外一個節點上運行,不至于這個任務運行失敗,而且這個過程不需要人工參與,而完全是由Hadoop內部完成的。
? 適合PB級以上海量數據的離線處理: 可以實現上千臺服務器集群并發工作,提供數據處理能力。
2.2 缺點
? 實時計算性能差: MapReduce 主要應用于離線作業,無法做到秒級或者是亞秒級別的數據響應。
? 不能進行流式計算: 流式計算的輸入數據是動態的,而MapReduce的輸入數據集是靜態的,不能動態變化。這是因為MapReduce自身的設計特點決定了數據源必須是靜態的。
? 不擅長DAG(有向無環圖)計算 多個應用程序存在依賴關系,后一個應用程序的輸入為前一個的輸出。在這種情況下,MapReduce并不是不能做,而是使用后,每個MapReduce作業的輸出結果都會寫入到磁盤,會造成大量的磁盤IO,導致性能非常的低下。
3、 MapReduce進程
一個完整的MapReduce程序在分布式運行時有三類實例進程: (1)MrAppMaster:負責整個程序的過程調度及狀態協調。 (2)MapTask:負責Map階段的整個數據處理流程。 (3)ReduceTask:負責Reduce階段的整個數據處理流程。
4、MapReduce編程規范
? 用戶編寫的程序代碼分成三個部分: Mapper、Reducer和Driver(客戶端提交作業驅動程序)
? 用戶自定義的Mapper和Reducer都要繼承各自的父類。
Mapper階段:
1. 用戶自定義的Mapper要繼承自己的父類
2. Mapper的輸入數據是KV對的形式(KV的類型可自定義)
3. Mapper中的業務邏輯寫在map()方法中
4. Mapper的輸出數據是KV對的形式(KV的類型可自定義)
5. map()方法(MapTask進程)對每一個<K,V>調用一次
Reducer階段:
1. 用戶自定義的Reducer要繼承自己的父類
2. Reducer的輸入數據類型對應Mapper的輸出數據類型,也是KV
3. Reducer的業務邏輯寫在reduce()方法中
4. ReduceTask進程對每一組相同k的<k,v>組調用一次reduce()方法
Driver: 描述的是提交Job對象需要的各種必要的信息。
MapReduce內置了很多默認屬性,比如: 排序(key的字典序)、分組(reduce階段key相同的為一組,一組調用一次reduce處理)等,這些都和數據的K有關,所以說kv的類型數據確定是及其重要的。
5、常用數據序列化類型
Java類型 | Hadoop Writable類型 |
Boolean | BooleanWritable |
Byte | ByteWritable |
Int | IntWritable |
Float | FloatWritable |
Long | LongWritable |
Double | DoubleWritable |
String | Text |
Map | MapWritable |
Array | ArrayWritable |
Null | NullWritable |