在之前的Hadoop是什麼中已經說過MapReduce採用了分而治之的思想,MapReduce主要分爲兩部分,一部分是Map——分,一部分是Reduce——合
MapReduce全過程的數據都是以鍵值對的形式存在的
首先,我們假設我們有一個文件,文件中存了以下內容
hive spark hive hbase
hadoop hive spark
sqoop flume scala
這裏涉及到一個偏移量(一個字符或空格爲1位)
第一行的偏移量爲0,內容爲“hive spark hive hbase”
第二行的偏移量爲21,內容爲“hadoop hive spark”
第三行的偏移量爲39,內容爲“sqoop flume scala”
- Map
- 輸入
MapReduce處理的數據是從HDFS中讀出來的
以偏移量爲key,內容value,則存在:
(0,“hive spark hive hbase”)
(21,“hadoop hive spark”)
(39,“sqoop flume scala”)- 輸出
將輸入的value中的詞以空格爲分割逐個取出來做key,1做value存起來
(hive,1)
(spark,1)
(hive,1)
(hbase,1)
(hadoop,1)
注意:有多少行,Map就要循環做幾次
- shuffle(之後會詳細說,這裏簡單解釋)
- 輸入
map的輸出- 輸出
相同的key的value進行合併
這裏合併不是進行累加或別的運算,而是合併到一個集合中
(hive,[1,1,1])
(spark,[1,1])
(hbase,[1])
(hadoop,[1])
。。。。。。
- reduce
- 輸入
shuffle的輸出- 輸出
根據業務將value進行合併
例如當前的業務就會將value進行累加
MapReduce處理數據五步走
整個MapReduce程序,所有數據以(key,value)形式流動
- 第一步:input
正常情況下不需要寫代碼
僅僅在MapReduce程序運行的時候指定一個路徑即可
- 第二步:map(核心)
map(key,value,output,context)
key:每行數據的偏移量——基本沒用
value:每行數據的內容——真正需要處理的內容
- 第三步:shuffle
不需要寫代碼
- 第四步:reduce(核心)
reduce(key,value,output,context)
key:業務需求中的key
value:要聚合的值
- 第五步:output
正常情況下不需要寫代碼
僅僅在MapReduce程序運行的時候指定一個路徑即可
- 工作原理