mapreduce的程式設計模型
mapreduce程式設計模型核心為將資料運算流程分為兩個階段:
拆分,讀取原始資料,形成key-value資料(map方法);
聚合,將相同key的資料聚合到一組(reduce方法)。
maptask:
讀資料:讀取源資料,maptask獲取分片資料資訊(型別有:TextInputFormat,文字檔案;SequenceFileInputFormat,序列化檔案;DBInputFomrat,資料庫檔案), 形成key-value資料;
邏輯處理:通過迴圈呼叫Mapper類的map方法讀取每行資料進行處理;
分割槽:通過Partitioner類的getPartition()方法對資料進行分割槽(預設執行HashPartitioner,分發規則:(key的hashcode值&Integer.MAX_VALUE)%numReducetTasks),分割槽規則註明分割槽號相同的資料會被分發給同一reducetask(只要按照規則就會返回相同的分割槽號);
排序:將資料通過key的compareTo()方法比較排序(預設是普通的字典排序);
reducetask:
讀資料:reducetask會通過http方式下載各自處理的“區”的資料到本地磁碟,併合並排序,執行預設的GroupingComparator確定資料key相同的為同一組(我們在自定義的時候寫一個類A繼承WritableComparator,根據需求重寫compare()方法,因為要從磁碟上讀取資料,那麼需要反序列化,需要在A的建構函式中告知WritableComparator反序列化的型別,否則會出錯);;
處理資料:reducetask把相同key的資料值聚合到Reducer類,按照reduce()方法處理邏輯,輸出資料(輸出型別:TextOutputFomat,檔案型別;SequenceFileOutputFomrat,序列化檔案;DBOutputFomrat,資料庫資料檔案);