切片机制
作者:互联网
InputFormat抽象类中的方法
- getSplits:对文件进行切片
- createRecordReader:将文件数据转换成key-value的格式
InputFormat中的默认使用的子类是FileInputFormat
FileInputFormat中的核心实现子类有四个
TextInputFormat:默认实现子类
读取的文件数据机制(类型:LongWritable Text):
以文件每一行的偏移量为key,每一行的数据为value进行key-value转换的
切片机制:
1. 有三个参数,minSize,maxSize,blockSize
Math.max(minSize, Math.min(maxSize, blockSize));
2. 先求出maxSize和blockSize的最大值,然后将求出的最小值和minsize求最大值,最大值就是切片的大小
3. maxsize和minsize是可以调整大小的,大小一调整,切片的大小就调整了
4. 如果处理的数据是多个文件,一个文件最少一个块
5. 两个文件数据,a 100M b 300M blocksize 128M
4个切片
a 单独一个切片
b 三个切片
切片机制再理解:
1. 获取输入的所有文件状态FileStatus
2. 如果有多个文件,每一个文件单独切片 5
3. 每一个文件单独切片之前,都会先判断一下文件是否能被切割(压缩包一般不能被切割的)
4. 如果文件能被切割,那么就会按照公式进行切片
Math.max(minSize, Math.min(maxSize, blockSize));
举例:三个文件 a.txt 10M b.txt 100M c.txt 200M minsize 1 maxsize:Long_MAX_VALUE blocksize 128M
一共分成4片
举例
- 10片
- 将minSize调为300M
CombinerTextInputFormat
作用:
专门用来进行大量的小文件的处理
读取的文件数据机制(类型:LongWritable Text):
以文件每一行的偏移量为key,每一行的数据为value进行key-value转换的,同TextInputFormat
切片机制:
1. 先指定一个小文件的最大值
2. 逻辑切片:
对每一个文件按照设定值进行切割,如果小文件不大于指定值,那么是一块,
如果大于指定值但是小于指定值的两倍,平均切割成两个块,
如果大于指定值并且大于指定值的两倍,先按照最大值切成一个块,剩余值看看多大
3. 物理切片:
将分割好的块,前一个和后一个块累加,如果大于指定值,物理上分为一个切片
import org.apache.hadoop.mapreduce.lib.input.CombineTextInputFormat;
# 设置实现切片的子类:CombineTextInputFormat, 在设置输入路径前设置
job.setInputFormatClass(CombineTextInputFormat.class);
FileInputFormat.setInputPaths(job, new Path(""));
# 设置指定切片值
CombineTextInputFormat.setMaxInputSplitSize(job, 70*1024*1024);
举例
举例:设置指定值是10M,求5个文件大小为如下5M,11M,21M,8M,15M,求最终的切片值。
解:
先逻辑切片:5M 5.5M 5.5M 10M 5.5M 5.5M 8M 7.5M 7.5M
再物理切片:10.5M 15.5M 11M 15.5M 7.5M
KeyValueInputFormat
读取的文件数据机制(类型:LongWritable Text):
以文件每一行的偏移量为key,每一行的数据为value进行key-value转换的,同TextInputFormat
切片机制:
不是按照文件切片,按照指定的行数进行切片
NLineInputFormat
标签:文件,子类,指定,value,切片,key,机制 来源: https://www.cnblogs.com/jsqup/p/16519502.html