關於MapReduce程式開發的一些總結
mapreduce在程式設計的時候,基本上一個固化的模式,沒有太多可靈活改變的地方,除了以下幾處:
1 輸入資料介面:InputFormat
FileInputFormat(檔案型別資料讀取的通用抽象類) DBInputFormat (資料庫資料讀取的通用抽象類)
預設使用的實現類是: TextInputFormat job.setInputFormatClass(TextInputFormat.class)
TextInputFormat的功能邏輯是:一次讀一行文字,然後將該行的起始偏移量作為key,行內容作為value返回
2、邏輯處理介面: Mapper
完全需要使用者自己去實現其中 map() setup() clean()
3.map輸出的結果在shuffle階段會被partition以及sort,此處有兩個介面可自定義:
Partitioner
有預設實現 HashPartitioner,邏輯是 根據key和numReduces來返回一個分割槽號; key.hashCode()&Integer.MAXVALUE % numReduces
Comparable
當我們用自定義的物件作為key來輸出時,就必須要實現WritableComparable介面,override其中的compareTo()方法
4. reduce端的資料分組比較介面 : Groupingcomparator
reduceTask拿到輸入資料(一個partition的所有資料)後,首先需要對資料進行分組,其分組的預設原則是key相同,然後對每一組kv資料呼叫一次reduce()方法,並且將這一組kv中的第一個kv的key作為引數傳給reduce的key,將這一組資料的value的迭代器傳給reduce()的values引數
利用上述這個機制,我們可以實現一個高效的分組取最大值的邏輯:
自定義一個bean物件用來封裝我們的資料,然後改寫其compareTo方法產生倒序排序的效果
然後自定義一個Groupingcomparator,將bean物件的分組邏輯改成按照我們的業務分組id來分組(比如訂單號)
這樣,我們要取的最大值就是reduce()方法中傳進來key
5、邏輯處理介面:Reducer
完全需要使用者自己去實現其中 reduce() setup() clean()
6. 輸出資料介面: OutputFormat
有一系列子類 FileOutputformat DBoutputFormat …
預設實現類是TextOutputFormat,功能邏輯是: 將每一個KV對向目標文字檔案中輸出為一行