1.FileInputFormat切片机制
默认切片机制
- 按照文件内容长度进行切片
- 默认大小等于block大小
- 切片时不考虑数据集整体性,而是逐个针对每个文件单独切片
举例:两个文件
File1.txt 200M
file2.txt 20M
切片信息如下:
File1.txt.split1—— 0~128
File1.txt.split2—— 128-200
File2.txt.split1—— 0-20
切片参数配置
- 切片的计算逻辑:Math.max(minSize, Math.min(maxSize, blockSize))
- 参数设置
mapreduce.input.fileinput.format.split.minsize=1 默认值为1
mapreduce.input.fileinput.format.split.maxsize=Long.MAXValue 默认值Long.MAXValue
FileInputFormat.setMinInputSplitSize(job, 512*1024*1024L); // 最小输入 512M
FileInputFormat.setMaxInputSplitSize(job, 1*1024*1024*1024L); // 最大输入 1G
因此,默认情况下,切片大小为blockSize
- 当minsize < maxsize < blockSize时,则切片大小为maxsize
- 当blockSize < minsize < maxsize时,切片大小为minsize
- 当minSize < blockSize < maxsize时,切片大小为blockSize
2. CombineTextInputFormat切片机制
- 相对于TextInputFormat的切片机制,CombineTextInputFormat可以将多个小文件从逻辑上划分到一个切片中,多个小文件就可以交给一个map task处理
- 优先满足最小切片大小,但不超过最大切片大小
job.setInputFormatClass(CombineTextInputFormat.class);
CombineTextInputFormat.setMaxInputSplitSize(job, 4194304); // 4M
CombineTextInputFormat.setMinInputSplitSize(job, 2097152); // 2M
举例:0.5M+1M+0.3M+5M = 2M+4.8M=2M+4M+0.8M
补充:
InputFormat接口实现类
- FileInputFormat
TextInputFormat、KeyValueInputFormat、NLineInputFormat、SequenceFileInputFormat、FiexedLengthInputFormat
- CombineFileInputFormat
- DBInputFormat
TextInputFormat:默认的InputFormat,每条记录是一行输入,键是LongWritable类型,存储该行在文件中的起始字节偏移量,值是该行记录,不包括任何终止符(回车符和换行符)
KeyValueTextinputFormat:每一行为一条记录,被分隔符分割为key和Value,可以通过参数设置分隔符
Conf.set(KeyValueLineRecordReader.KEY_VALUE_SEPERATOR, " ");
NLineInputFormat:NLineInputFormat在划分切片时将不再按照block大小划分,而是按照NLineInputFormat指定的行数N来划分,切片数=输入的总行数/N,如果上不是整数则+1。key和Value值与TextInputFormat一致
SequenceFileInputFormat:读取sequenceFile文件,以二进制形式读取
FiexedLengthInputFormat:读取固定长度的记录,一般是二进制文件,文本文件不行
DBInputFormat:主要用于处理数据库数据的InputFormat类
自定义InputFormat
- 继承FileInputFormat
- 重写RecordReader,实现一次读取一个完整文件并封装为KV
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/38763.html