標籤:
public abstract class InputFormat<K, V> {
public abstract
List<InputSplit> getSplits(JobContext context
) throws IOException, InterruptedException;
public abstract
RecordReader<K,V> createRecordReader(InputSplit split,
TaskAttemptContext context
) throws IOException,
InterruptedException;
}
public abstract class FileInputFormat<K, V> extends InputFormat<K, V> {
public class TextInputFormat extends FileInputFormat<LongWritable, Text> {
getSplits方法,獲得對輸入檔案的切分數量,每一個split對應一個map。
建立RecordReader,該RecordReader接收切分好的split,實現nextKeyValue、getCurrentKey、getCurrentValue。
如下所示,每個map類都會繼承Mapper類,在Mapper類中,run方法會調用InputFormat中的RecordReader來獲得key、value
public class Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT> {
/**
* Expert users can override this method for more complete control over the
* execution of the Mapper.
* @param context
* @throws IOException
*/
public void run(Context context) throws IOException, InterruptedException {
setup(context);
try {
while (context.nextKeyValue()) {
map(context.getCurrentKey(), context.getCurrentValue(), context);
}
} finally {
cleanup(context);
}
}
}
InputFormat到key-value產生流程