MapReduce 鍵值對
Apache Hadoop 主要用于資料分析,我們利用資料分析裡面的統計和邏輯技術來描述,說明和評估資料。Hadoop 可以用來處理機構化,非結構化和半結構化資料。在使用 Hadoop 的時候,當模式是靜态的時候,我們可以直接使用模式的列,如果模式是非靜态的,就不能用列的,因為沒有列的概念了,隻能使用鍵和值來處理資料。鍵和值并非是資料的固有屬性,它隻是在對資料做分析時人為選擇的一種政策。
MapReduce 是 Hadoop 的核心元件,主要用于資料處理。Hadoop MapReduce 是一種軟體架構,利用這個架構很容易就能開發出處理存儲在 HDFS 的大資料量的應用程式。MapReduce 把處理過程分成兩個階段:Map 階段和 Reduce 階段。每個階段的輸入資料和輸出資料都是以鍵值對的形式出現。
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