本文主要講述hadoop中MapReduce數據處理的過程。
MapReduce處理流程
過程簡析:
? MapReduce的作業流程大致可分為4個步驟:input、maper、shuffle、reducer。下面以這四個階段為基礎來對MapReduce進行說明。
1.input
? input為MapReduce從HDFS中讀取數據階段,在input階段,主要會對要讀入的數據進行InputFormat和InputSplit處理,然后通過RecordReader,將符合要求數據提供Mapper使用。
? 其中:
? ? InputFormat:決定讀取數據的格式,可以是文件或數據庫等。
? ? InputSplit:將輸入文件進行邏輯分片,一個InputSplit分配一個獨立Map任務。
? 注: a.Split的個數將決定Map的數量,大量的Mapper Task的創建開銷是巨大的。所以應盡量避免小文件。InputSplit可以通過調用CombineFileInputFormat將若干個Split打包成一個Split。
? b.通常一個split就是一個block(FileInputFormat僅僅拆分比block大的文件),這樣做的好處是使得Map可以在存儲有當前數據的節點上運行本地的任務,而不需要通過網絡進行跨節點的任務調度。
2.maper
? maper的主要功能是對輸入的數據,根據需求進行處理,并將處理結果寫入本地磁盤。maper階段可以細分為:map、partition、buffer、spill、merge五個階段。
? 2.1 map
? mapReduce框架會對inputSplit中的每個鍵值對調用一次map,經map處理后,會得到一個新的(key,value)鍵值對。根據需求,需重寫map函數。
? 2.2 partition:分區
? partition的作用就是根據map輸出的key和value以及reduce的數量來決定當前這對輸出數據最終由哪個reduce task來處理。默認的處理方式:對key hash后再對reduce task數量取模。也可根據要求,重寫Partitioner函數。
? 2.3 buffer:內存緩沖區
? 當數據經map、partition處理之后,產生的結果不會直接寫入本地磁盤,而是寫入一個環形內存緩沖區。每個map都會對應一個內存緩沖區。默認100M。
? 注:寫入內存緩沖去的內容不僅包括map解析出的鍵值對,還包括Partitioner操作得到的分區元數據。
? 2.4 spill 溢寫
? 當內存緩沖區內的數據達到閾值80M(可設)時,將啟動一獨立線程來將緩沖區數據寫入本地磁盤,此過程成為溢寫。此時并不影響往剩余20M的內存緩沖區里繼續寫入數據。
? 在執行spill的過程中,還會執行sort和combiner過程(combiner可選)。先對需要spill的數據進行排序,然后如果配置了combiner,則還會執行數據的合并。(combiner可以有效減小寫入本地磁盤的數據量)。
? 2.5 merge
? 當本節點的map任務處理完成后,本地磁盤中可能會存在很多的溢寫文件。所以需要將多份溢寫文件合并成一份,在次過程中,如果開啟combiner,會再次對文件中相同的key值進行數據合并。