Hadoop FileInputFormat 默认切片机制

FileInputFormat

默认的切片机制

  1. 简单地按照文件的内容长度进行切片
  2. 切片大小,默认等于 block 大小**(Local模式默认32M,集群模式默认128M)**
  3. 切片时不考虑数据集整体,而是逐个针对每一个文件单独切片

FileInputFormat默认切割机制

源码分析

参考:Hadoop MapReduce Splits 切片源码分析及切片机制

计算切片大小 computeSplitSize

默认情况下,切片大小=blocksize

protected long computeSplitSize(long blockSize, long minSize, long maxSize) {
    return Math.max(minSize, Math.min(maxSize, blockSize));
}

SPLIT_SLOP

每次切片时,都要判断切完剩下的部分是否大于块的 1.1 倍, 不大于 1.1 倍就划分一块切片

private static final double SPLIT_SLOP = 1.1;   // 10% slop
while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) {
    int blkIndex = getBlockIndex(blkLocations, length-bytesRemaining);
    splits.add(makeSplit(path, length-bytesRemaining, splitSize, blkLocations[blkIndex].getHosts(),blkLocations[blkIndex].getCachedHosts()));
    bytesRemaining -= splitSize;
}

通过分析源码,在 FileInputFormat 中,计算切片大小的逻辑:Math.max(minSize,
Math.min(maxSize, blockSize));

切片主要由这几个值来运算决定

mapreduce.input.fileinputformat.split.minsize=1 //默认值为 1 
mapreduce.input.fileinputformat.split.maxsize= Long.MAXValue //默认值

因此,默认情况下,切片大小=blocksize。
maxsize(切片最大值):参数如果调得比 blocksize 小,则会让切片变小,就等于
配置的这个参数的值。
minsize(切片最小值):参数调的比 blockSize 大,则可以让切片变得比 blocksize 还大

猜你喜欢

转载自blog.csdn.net/yljphp/article/details/89069951