MapReduce处理的基本原则之一是将输入数据分割成块,这些快可以在多台计算机上并行处理。
FSDataInputStream类扩展了java中的DataInputStream类,以达到随机读的特性,避免了从同开始读到分片的位置,从而提高了效率。
输入格式:InputFormat类定义了如何分割和读取输入文件,其中一个子类是FileInputFormat抽象类。
当开启Hadoop作业时,FileInputFormat会得到一个路径参数,这个路径内包含了所需要处理的文件,FileInputFormat会读取这个文件夹内的所有文件(译注:默认不包括子文件夹内的),然后它会把这些文件拆分成一个或多个的InputSplit。你可以通过JobConf对象的setInputFormat()方法来设定应用到你的作业输入文件上的输入格式。下表给出了一些标准的输入格式:
输入格式
描述
键类型
值类型
TextInputFormat
默认格式,读取文件的行
行的字节偏移量 (LongWriable)
行的内容(Text)
KeyValueInputFormat
把行解析为键值对
第一个tab字符前的所有字符(Text)
行剩下的内容(Text)
SequenceFileInputFormat
Hadoop定义的高性能二进制格式
用户自定义
用户自定义
数据格式类的继承关系如图:
输入块(InputSplit):一个输入块描述了构成MapReduce程序中单个map任务的一个单元。默认的大小为64M
记录读取器(RecordReader):InputSplit定义了如何切分工作,但是没有描述如何去访问它。 RecordReader类则是实际的用来加载数据并把数据转换为适合mapper读取的键值对。