1. 输入格式InputFormat
InputFormat作为Hadoop作业的所有输入格式的抽象基类,描述了作业的输入需要满足的规范细节。该抽象类内部定义了如下两个抽象方法:
public abstract List<InputSplit> getSplits(JobContext context) throws IOException, InterruptedException;
该方法的主要作用就是将所有的输入文件分割成逻辑上的多个分片InputSplit。这分片仅仅是逻辑上的,并不是真正的将文件分割成多个数据块。每个InputSplit通过输入文件路径、开始位置和偏移量三个信息来唯一的标识。
public abstract RecordReader<K,V> createRecordReader(InputSplit split,TaskAttemptContext context) throws IOException,InterruptedException;
该方法的主要作用就是为指定的InputSplit创建记录读取器,通过创建的记录读取器从输入分片中读取键值对,然后将键值对交给Map来处理。
InputFormat的直接子类之一
FileInputFormat类也是一个抽象类,它是所有不同类型的文件的输入格式的基类。在该类中,它只提供了对于InputFormat的getSplit抽象方法的实现。它没有提供createRecordReader的实现是因为不同格式的文件的读取策略是不同的。
FileInputFormat所在的包为org.apache.hadoop.mapreduce.lib.input中,具体的getSplit方法的实现可以去这个包中查看。
TextInputFormat:FileInputFormat抽象类的默认实现
该类主要重写了FileInputFormat中的createRecordReader和isSplit方法。
createRecordReader的实现是通过创建LineRecordReader行记录读取器,该读取器用于从文件中读取一行,并将行的偏移量作为键,行的文本内容作为值。
2. 输入分片InputSplit
InputSplit是一个单独的Map要处理的数据单元。输入分片的数据类型一般都是字节型。输入分片经过相应的RecordReader处理后,转化成记录视图的形式,然后交给Map处理。一般一条记录以一个键值对的形式展现。
3. 记录读取器 RecordReader
抽象基类RecordReader所在的包为org.apache.hadoop.mapreduce。该类中包含6个抽象方法:
public abstract void initialize(InputSplit split,TaskAttemptContext context) throws....;初始化方法,该方法只会在初始化时执行一次;
public abstract boolean nextKeyValue() throws...;取得分片中的下一个键值对,如果读取到就返回true,否则返回false;
public abstract KEYIN getCurrentKey() throws...;取得当前读取到的键值对中的键对象;
public abstract VALUEIN getCurrentValue() throws...;取得当前读取到的键值对中的值对象;
public abstract float getProgress() throws...;取得当前数据读取的进度,该方法会返回一个0.0到1.0之间的浮点数;
public abstract void close() throws...;主要用于关闭recordreader,从而清理掉它所占用的资源。