1 RecordReader介绍
RecordReader作用就是把数据切分成key/value的形式 然后作为输入传给Mapper
所有方法:
- linitialize:初始化RecordReader 只能调用一次
- nextKeyValue:读取下一个key/value键值对
- getCurrentKey:当前的key
- getCurrentValue:当前Value
- getProcess:获取当前进度
- colse:关闭RecordReader
2 RecordReader运行流程
2.1 MapTask会构造一个NewTrackingRecordReader对象
2.2 在执行Mapper#run方法之前会调用RecordReader的initalize方法
2.3 这个初始化方法里,会调用InputFormat.createRecordReader
默认的InputFormat就是TextInputFormat 所以这里就回到用TextInputFormat createRecordReader,返回LineRecordRead
2.4 初始化方法的执行流程
- jiangInputSplit转换成FileSplit
- 获取每一行能读取的最大长度默认是Integer.MAX_VALUE
- 获取当前FileSplit的开始位置
- 获取当前FileSplit的结束位置
- 获取当前FileSplit的文件路径
2.5 进入Mapper.run 方法
判断是否有下一个key/value,如果 有则传入当前的key和value的map方法
2.6 LineRecordReader是将当前开始位置的offset作为key,当前行的值作为value传入给map方法
2.7 close
3 常见的RecordReader
太多了 说一些常见的吧
3.1 LineRecordRader
将文本开始的偏移量作为key
整行文本作为value
3.2 CombineFileRecordReader
处理CombineInputSplit里的每一个chunk的RecordReader,
CombineInputSplit包含不同的小文件chunk信息
但是具体读取每一个文件的数据,是由单独的RecordReader来读取的,CombineFileRecordReader只负责操作chunk数据
3.3 DBRecordReader
从数据库中读取数据
keyValueRecordReader:根据指定的分隔符去切分每一行数据,
没有指定分隔符,key就是整行文本,value就是空
RecordWriter
既然数据依靠RecordReader读取给map,那么同样的也就需要RecordWirter将Reducer中的数据写出去