职责1:对数据进行切片,然后jobClient就会向HDFS提交切片信息
职责2:map端通过其获得对应的RecordReader去读取切片
它是一个接口,只定义了两个方法。
InputSplit[] getSplits(JobConf job, int numSplits) throws IOException;
RecordReader<K, V> getRecordReader(InputSplit split, JobConf job, Reporter reporter) throws IOException;
InputFormat有多个实现类,例如FileInputFormat,CombineFileInputFormat...
他们实现了不同的数据切片策略,对应着不同的InputFormat的实现和RecordReader实现。
InputSplit也只有两个接口函数:
long getLength() throws IOException;
String[] getLocations() throws IOException;
只有这两个函数的原因是对于任务调配只需要关心其位置与长度。至于如何读取
不同的InputFormat对应不同的实现,如FileInputFormat对应的FileSplit就有如下
的信息:
private Path file; // Split所在的文件
private long start; // Split的起始位置
private long length; // Split的长度,getLength()会返回它
private String[] hosts; // Split所在的机器名称,getLocations()会返回它