天天看點

Hadoop系列之MapReduce 鍵值對(22)

MapReduce 鍵值對

Apache Hadoop 主要用于資料分析,我們利用資料分析裡面的統計和邏輯技術來描述,說明和評估資料。Hadoop 可以用來處理機構化,非結構化和半結構化資料。在使用 Hadoop 的時候,當模式是靜态的時候,我們可以直接使用模式的列,如果模式是非靜态的,就不能用列的,因為沒有列的概念了,隻能使用鍵和值來處理資料。鍵和值并非是資料的固有屬性,它隻是在對資料做分析時人為選擇的一種政策。

MapReduce 是 Hadoop 的核心元件,主要用于資料處理。Hadoop MapReduce 是一種軟體架構,利用這個架構很容易就能開發出處理存儲在 HDFS 的大資料量的應用程式。MapReduce 把處理過程分成兩個階段:Map 階段和 Reduce 階段。每個階段的輸入資料和輸出資料都是以鍵值對的形式出現。

Hadoop系列之MapReduce 鍵值對(22)

MapReduce 鍵值對的生成

讓我們來了解一下 MapReduce 架構是怎麼生成鍵值對的。MapReduce 過程中,在資料傳輸給 mapper 之前,資料首先被轉換成鍵值對,因為 mapper 隻能處理鍵值對形式的資料。

Hadoop MapReduce 生成鍵值對的過程如下:

InputSplit:這個是資料的邏輯表示形式。單個獨立的 Mapper 處理的資料就是由 InputSplit 提供的。

RecordReader:它和 InputSplit 互動,并且把資料分片轉換成适合 Mapper 讀取的記錄,這裡的記錄其實就是資料的鍵值對形式。預設情況下,RecordReader 使用 TextInputFormat 把資料轉換成鍵值對。RecordReader 和 InputSplit 的互動直到檔案讀取完成才停止。

在 MapReduce 架構裡面,map 函數處理某個鍵值對并發出一定數量的鍵值對,Reduce 函數處理按相同鍵分組的值,并發出另一組鍵值對作為輸出。map 的輸出類型應該和 reduce 的輸入類型一緻。比如:

  • Map: (K1, V1) -> list (K2, V2)
  • Reduce: {(K2, list (V2 }) -> list (K3, V3)

K2,V2 資料類型是要保持一緻的。

Hadoop 中生成鍵值對需要依賴什麼?

Hadoop 中鍵值對的生成取決于資料集和所需的輸出。通常,鍵值對在4個位置指定:Map 輸入、Map 輸出、Reduce 輸入和 Reduce 輸出。

Map 輸入

map 輸入預設把資料檔案的行數作為鍵(key),資料行對應的内容作為值。可以對 InputFormat 進行定制化開發,可以修改這個預設設定。

Map 輸出

Map 主要負責過濾資料,并為資料基于鍵分組提供基礎。

Key:它可能是字段、文本、對象,Reducer 端會根據 Key 對資料做分組和聚合。

Value:它可能是字段、文本、對象。它會被單獨的 reduce 函數處理。

Reduce 輸入

Map 的輸出作為 Reduce的輸入,也就是說,Reduce 的輸入資料和 Map 輸出資料是一樣的。

Reduce 輸出

這個取決于所需要的輸出是怎麼樣的。

MapReduce 鍵值對舉例

假如有個存儲在 HDFS 的檔案的内容如下:

John is Mark Joey is John
           
Key 是 0Value 是  John is Mark Joey is John