首先,通过任务的控制台log,可以看到,首先任务在执行的时候,
先连接集群的resourceManager。
然后计算出split的个数
下一步才提交任务
而在mr任务提交之后 。InputFormat 接口决定了输入文件如何被 Hadoop 分块(split up)与接受。
InputFormat 能够从一个 job 中得到一个 split 集合(InputSplit[])(p: 一个split包含一个或者多个完整的block),然后再为这个 split 集合配上一个合适的RecordReader(getRecordReader)来读取每个split中的数据。
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;
}
getSplits(JobContext context) 方法负责将一个大数据逻辑分成许多片。
createRecordReader(InputSplit split,TaskAttemptContext context) 方法根据 InputSplit 定义的方法,返回一个能够读取分片记录的 RecorderReader。(如默认的LineRecorderReader)
而createRecordReader() 提供了前面说的 RecorderReader 的实现, 将Key-Value 对从 InputSplit 中正确读出来,比LineRecorderReader,它是以偏移值为Key,每行的数据为 Value,这使所有 createRecorderReader() 返回 LineRecorderReader 的 InputFormat 都是以偏移值为Key,每行数据为 Value 的形式读取输入分片的。
自己可以 在实现了inputFormat的类中,定义继承了recorderReader的类。
可以实现数据与 < k ,v>对的转换过程。 至此 数据–> < k,v >对
map 读取 < k , v >-> 写入环形缓冲区域 ,然后溢出写入文件 ->分区 ->排序 ->combiner(非必要,看代码设置。如:求平均值等。则不应设置)-》生成中间结果
(partioner 过程是实现分区的时候,combiner过程是分区之后 写入文件之前)
前面通过分区决定了map的结果由那个reduce任务来进行处理
reduce任务要进行分组把相同 k 的 < k ,v > 对 交给一个reduce。
最后输出。最终通过outputformat写入到文件系统中。
以上是自己对于mapreduce任务执行流程的一点理解。不足的地方欢迎指出,谢谢!