FileInputFormat是一个处理文件的InputFormat类,当要继承该类时,需要覆盖三个方法:
1.protected boolean isSplitable(JobContext context,Path filename)
判断文件是否可分割,通常是可分割的,以换行符进行分割,但如果文件是压缩的,将不可分割是否分割,可以自行重写FileInputFormat的isSplitable来控制
2.public List<InputSplit> getSplits(JobContext job) throws IOException
getSplits方法会根据输入目录产生InputSplit数组, 每个InputSplit会相应产生一个map任务, map的输入定义在InputSplit中,其中,Split中不包含实际的分片内容,而只是对实际信息的分片信息(即分片的元数据)。具体的说,每个分片中包含当前分片对应的文件路径,当前分片在该文件中起始位置,当前分片的长度以及对应的实际数据所在的节点列表。
3.public RecordReader<K,V> createRecordReader(InputSplit split
,TaskAttemptContext context) throws IOException,InterruptedException
这是InputFormat类的方法,该方法返回RecordReader,来决定如何读取每个分片内容
RecordReader类告诉hadoop以哪种方式从分片中读取一条记录record,每读取一条记录都会调用RecordReader类;系统默认的RecordReader是LineRecordReader,如TextInputFormat;LineRecordReader是用每行的偏移量作为map的key,每行的内容作为map的value;重写该类是要重新定义如何进行读取分片,以什么为key,什么为value
其中比较重要的方法如下:
1.public abstract void initialize(InputSplit split, TaskAttemptContext context) throws IOException, InterruptedException;
初始化工作
2.public Text getCurrentKey()
throws IOException,InterruptedException
获取当前的key
3.public BytesWritable getCurrentValue()
throws IOException, InterruptedException
获取当前的value
4.public float getProgress() throws IOException, InterruptedException
获取当前的处理进度
5.public boolean nextKeyValue() throws IOException
读取下一个key/value,返回读取结果
6.public void close() throws IOException
关闭工作
其中context的nextKeyValue、getCurrentKey、getCurrentValue都是该方法封装的
这个RecordReader将在自定义的inputFormat中的createRecordReader方法中返回