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