Hadoop 鍵值對的mapreduce過程剖析
Hadoop的Mapreduce是一個分佈並行處理大資料的程式框架,一個Map/Reduce 作業(job) 通常會把輸入的資料集切分為若干獨立的資料塊,由 map任務(task)以完全並行的方式處理它們。框架會對map的輸出先進行排序, 然後把結果輸入給reduce任務。通常作業的輸入和輸出都會被儲存在檔案系統中。
MapReduce程式是通過鍵值對來操作資料的,其單個輸入輸出形式如下:
map: key1,value1 ----> list(key2,value2)
reduce: (key2,list(value2))----> key3,value3
一、Mapreduce操作的資料也是儲存在檔案系統HDFS上,InputFormat介面定義的就是如何讀取檔案和分割檔案提供分片給mapper,TextInputFormat文字格式輸入 是InputFormat的預設實現類
它主要負責:
1. 把輸入檔案切分成多個邏輯InputSplit例項, 並把每一例項分別分發給一個 Mapper.2.提供RecordReader的實現,這個RecordReader從邏輯InputSplit中獲得輸入記錄, 這些記錄將由Mapper處理
二、在input輸入的進來的(key1,value1)經過mapper處理變成list(key2,value2),可由combiner進行進行一次本地聚合,減少mapper輸出的list(key2,value2)的數量
三、對於mapper的的結果,然後在經過shuffle階段由partitioner定義如何分配(key,value)給reducer作為輸入(key2,list(value2))進行最後的合併,得到輸出結果(key3,value3)
四、與InputFormat對應,如何將mapreduce的結果輸出是由OutputFormat介面來定義的,每個reducer將自己的輸入寫入自己的檔案中,而RecordWriter物件將輸出結果進行格式化的
- 摘自官方文件上的WordCount資料示例部分來分析下mapreduce中(key,value)是如果分解合併的
- 檔案file0: Hello World Bye World
- file1: Hello Hadoop Goodbye Hadoop
- 第一個輸入,預設的採用TextInputFormat的map輸入 (key:一行的位元組偏移 value:就是這行的內容)
- 輸出是:
- < Hello, 1>
- < World, 1>
- < Bye, 1>
- < World, 1>
- 第二個輸入,map輸出是:
- < Hello, 1>
- < Hadoop, 1>
- < Goodbye, 1>
- < Hadoop, 1>
- Map執行之後,會對輸出按照key進行排序,然後把輸出傳遞給本地的combiner(按照作業的配置與Reducer一樣),進行本地聚合,資料不會在節點上傳輸的
- 所以第一個map的輸出會變成:
- < Bye, 1>
- < Hello, 1>
- < World, 2>
- 第二個map的輸出會變成:
- < Goodbye, 1>
- < Hadoop, 2>
- < Hello, 1>
- 然後在經過shuffle階段把map的結果傳給Reducer,將每個key(本例中就是單詞)出現的次數求和,節點間的
- 資料交換就是在shuffle階段的,至於每個(key,value)是如何分配給不同的reduce是通過Partitioner指定的,預設採用的是HashPartitioner。
- 最後這個作業的輸出就是:
- < Bye, 1>
- < Goodbye, 1>
- < Hadoop, 2>
- < Hello, 2>
- < World, 2>