您的位置:首页 > 其它

继承FileInputFormat类和RecordReader类

2015-06-17 10:00 411 查看
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方法中返回
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: