1、Mapper的key排序方式默認為快速排序,合併切片文件時用的是歸併排序,繼承Mapper類
* 驅動類關聯map:job.setMapperClass(WordcountMapper.class);

2、Reducer需要繼承Reducer類,重寫reduce(key, values, context)方法
* 驅動類關聯reducer:job.setReducerClass(WordcountReducer.class);

3、Combiner需要繼承Reducer類,用於彙總集合等操作,求平均值時不要用,主要是用於提高效率,優化
* 驅動類關聯Combiner:job.setCombinerClass(WordCountCombiner.class);

4、Partitioner分區(默認分區方式為HashPartitioner實現類)
自定義分區,繼承Partitioner,重寫getPartition(key, value, numPartitions),前2個參數為mapper的輸出,numPartitions是分區數

設置分區數的三種情況:
1)如果設置的分區數為1則不進行分區操作,直接彙總到一個文件中

2)如果設置的分區數大於實際分區數時,會多出空白文件,但不會異常

3)如果設置的分區數小於實際分區數時,拋出IO異常

5、SORT排序(默認用字典排序):
1)GroupingComparator分組-輔助排序:分組類需要繼承WritableComparator,重寫compare()方法,並且必須要寫一個無參構造方法 
* 驅動類關聯GroupingComparator: job.setGroupingComparatorClass(OrderSortGroupingComparator.class);

2)BEAN多次排序(二次排序):分組排序(輔助排序),主要作用是將BEAN對象進行屬性排序(BEAN的某1個或某幾個屬性相同)
BEAN需要實現WritableComparable接口,實現compareTo()比較方法、readFields()反序列化方法、write()序列化方法

3)部分排序:多個文件,每一個文件內容都是排序的

4)全排序:最終輸出是一個文件時並且內容是排序的為全排序


6、Reduce端多表合併(數據傾斜)
1)定義表的綜合屬性Bean實現Writable接口的序列化方法:write() 反序列化方法:readFields()
2)通過Mapper的map()讀取不同的表文件,並將表屬性與值區分開來放入BEAN對象中,輸出後由reducer繼續處理
3)通過TableReduce的reduce()將表屬性合併後輸出
4)缺點是數據量大時,reduce處理壓力增大(這就是所謂的數據傾斜)


7、Mapper端多表合併(解決數據傾斜問題)
1)只在Mapper端合併,Reducer端不參與合併
2)Mapper實現setup(Context context)方法,將一對多中的一方的屬性名稱與屬性拆分,保存到HashMap中供map()進一步處理
3)map()將setup()中處理的一方數據與處理的多方數據合併,並寫出
4)主類Driver.class中加載緩存數據   file:///d:/cache/pd.txt
job.addCacheFile(new URI("file:///d:/cache/pd.txt"));

job.addCacheFile(new URI(args[2]));
5)map端join的邏輯不需要reduce階段,設置reducetask數量為0
job.setNumReduceTasks(0);


8、自定義InputFormat--RecordReader(主要是處理小文件合併的問題)
1)在Mapper之前處理的類
2)繼承FileInputFormat類,重寫是否切割文件的isSplitable()與createRecordReader()方法
3)在createRecordReader()中自定義RecordReader,實現小文件的合併操作
最重要的實現方法:nextKeyValue(),用於以IO流方式讀取小文件,合併小文件後的IO流輸出給Mapper處理
4)處理完畢後交予Mapper處理,一個文件處理一次setup()與map()
5)處理流程是: 
a) Mapper.setup(),提供文件分割路徑
b) 自定義InputFormat.createRecordReader(),合併小文件IO流
c) Mapper.map() ,輸出最終結果文件
6)設置輸出文件的格式為sequencefile,默認是TextFileOutputFormat.class
job.setOutputFormatClass(SequenceFileOutputFormat.class);


9、自定義OutputFormat--RecordWriter(主要實現過濾文件內容,輸出到不同文件中)
1)自定義輸出實現方法:FileOutputFormat.getRecordWriter()
2)在RecordWriter類中主要處理文件輸出規則,過濾文件內容
3)在Driver類中設置自定義輸出類:job.setOutputFormatClass(FilterOutputformat.class);