MR读文件过程

Read阶段的流程

根据InputFormat

①切片, getSplit()

②使用输入格式的RR读取数据, createRecordReader()

1.默认的TextInputFormat

场景:  普通的文本格式数据来源

切片:  采用默认的切片策略,以文件为单位,先判断文件是否可切,如果可切,循环以片大小为单位切片!

不可切,整个文件作为1片!

RR :  LineRecordReader(将一行封装为一个key-value)

LongWritable key: 行的偏移量

Text  value:  行的内容

2. NLineInputFormat

场景: 适合一行的内容特别多,在Map阶段map()处理的逻辑非常复杂!根据行数自定义切片的大小!

切片: 可以设置以文件为单位,每N行作为一个切片!

RR :  LineRecordReader(将一行封装为一个key-value)

LongWritable key: 行的偏移量

Text  value:  行的内容

3. KeyValueTextInputFormat

场景:  一行的内容的格式 为 key-value,方便地将key,value拆分封装

切片:  采用默认的切片策略,以文件为单位,先判断文件是否可切,如果可切,循环以片大小为单位切片!

不可切,整个文件作为1片!

RR :  KeyValueRecordReader(将一行封装为一个key-value)

Text key:  行的分隔符之前的部分内容

Text  value:  行的分隔符之后的部分内容

4. CombineTextInputFormat

场景:  输入目录中小文件过多,可以将多个小文件设置到一个切片中!

切片:  ①根据maxSize对每个文件进行逻辑切片,切分为若干part

②将多个part组合,知道超过maxSize,这些part作为一个切片

RR :  LineRecordReader(将一行封装为一个key-value)

LongWritable key: 行的偏移量

Text  value:  行的内容

三、切片和块

切片:  对文件进行逻辑切分,只有在运行MR任务时,才会对文件切分!

切分时,切片的大小不同,每个文件切分的结果也不同!

块:  文件在上传到HDFS时,在HDFS上存储的最小单位,物理存储!

关系: MapTask在读取切片的内容时,需要根据切片的metainfo,获取到当前切片属于文件的哪部分!

再根据此信息去寻找对应的块,读取数据!

默认切片大小等于块大小,主要为了减少在运行MR时,大量的跨机器读取切片内容带来额外的网络IO!

根据默认的策略策略,可以调整切片的大小:

调整切片大小 大于 块大小: 调整minSize

调整切片大小 小于 块大小:  调整maxSize

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容