1. 程式人生 > >Hadoop 鍵值對的mapreduce過程剖析

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物件將輸出結果進行格式化的

  1. 摘自官方文件上的WordCount資料示例部分來分析下mapreduce中(key,value)是如果分解合併的  
  2. 檔案file0:  Hello World Bye World   
  3.    file1:  Hello Hadoop Goodbye Hadoop  
  4. 第一個輸入,預設的採用TextInputFormat的map輸入 (key:一行的位元組偏移 value:就是這行的內容)  
  5. 輸出是:  
  6. < Hello, 1>  
  7. < World, 1>  
  8. < Bye, 1>  
  9. < World, 1>  
  10. 第二個輸入,map輸出是:  
  11. < Hello, 1>  
  12. < Hadoop, 1>  
  13. < Goodbye, 1>  
  14. < Hadoop, 1>  
  15. Map執行之後,會對輸出按照key進行排序,然後把輸出傳遞給本地的combiner(按照作業的配置與Reducer一樣),進行本地聚合,資料不會在節點上傳輸的  
  16. 所以第一個map的輸出會變成:  
  17. < Bye, 1>  
  18. < Hello, 1>  
  19. < World, 2>  
  20. 第二個map的輸出會變成:  
  21. < Goodbye, 1>  
  22. < Hadoop, 2>  
  23. < Hello, 1>  
  24. 然後在經過shuffle階段把map的結果傳給Reducer,將每個key(本例中就是單詞)出現的次數求和,節點間的  
  25. 資料交換就是在shuffle階段的,至於每個(key,value)是如何分配給不同的reduce是通過Partitioner指定的,預設採用的是HashPartitioner。  
  26. 最後這個作業的輸出就是:  
  27. < Bye, 1>  
  28. < Goodbye, 1>  
  29. < Hadoop, 2>  
  30. < Hello, 2>  
  31. < World, 2>