@
片大小的计算
long splitSize = computeSplitSize(blockSize, minSize, maxSize);
protected long computeSplitSize(long blockSize, long minSize, long maxSize) {
return Math.max(minSize, Math.min(maxSize, blockSize));
}
blockSize
: 块大小
minSize
: minSize从mapreduce.input.fileinputformat.split.minsize
和1之间对比,取最大值
maxSize
: 读取mapreduce.input.fileinputformat.split.maxsize
,如果没有设置,则使用Long.MaxValue
作为默认值
默认的片大小就是文件的块大小
文件的块大小默认为128M,默认每片就是128M!
- 调节片大小 > 块大小:配置
mapreduce.input.fileinputformat.split.minsize
> 128M - 调节片大小 < 块大小:配置
mapreduce.input.fileinputformat.split.maxsize
< 128M
理论上来说:如果文件的数据量是一定的话,
- 片越大,切片数量少,启动的MapTask少,Map阶段运算慢!
- 片越小,切片数量多,启动的MapTask多,Map阶段运算快!
片和块的关系
片(InputSplit)
:
- 在计算MR程序时,才会切片。片在运行程序时,临时将文件从逻辑上划分为若干部分
- 使用的输入格式不同,切片的方式不同,切片的数量也不同
- 每片的数据最终也是以块的形式存储在HDFS
块(Block)
:
在向HDFS写文件时,文件中的内容以块为单位存储!块是实际的物理存在!
建议: 片大小最好等于块大小!
因为将片大小设置和块大小一致,可以最大限度减少因为切片带来的磁盘IO和网络IO