1、上文的補充jvm
一、setup方法通常是用來初始化和加載資源的,主要也是由於編寫mr程序所使用jvm和跑mr所使用的jvm並非同一個,它們之間數據也不能共享,因此須要在setup裏進行load。排序
二、上文提到了能夠自定義類型,當你須要使用這個自定義類型來作key時,你能夠指定一個Comparator,固然也能夠是自定義的Comparator。繼承
例如:資源
public class MyKey implements WritableComparable<MyKey> {源碼
...it
static {
WritableComparator.define(MyKey.class, new MyComparator());
}table
}class
三、在shuffle階段是如何進行分組的?默認分組是經過key的值來進行比較的,也就是equals方法,當咱們自定義key的時候,並須要按照key中某個屬性來進行分組時,就須要實現自定義分組,並經過setGroupingComparatorClass來進行設置。遍歷
四、protected void reduce(MyKey key,Iterable<MyValue> values,Context context),其中MyKey由key1和key2組成,分組時按照key1進行分組。在分組完成後進入reduce方法後,是由key來找尋value,仍是由value來尋找key呢,我猜想是後者(沒看源碼不能保證)。因此咱們在遍歷values時,每一個value可能對應不一樣的key。程序
2、自定義排序和分組
自定義排序和分組都是繼承WritableComparator,並重寫compare方法,只不過設置時一個是在自定義key時來進行註冊(WritableComparator.define),一個是run裏來設置(setGroupingComparatorClass)