美文网首页
Hadoop 文件分片 split的源码分析

Hadoop 文件分片 split的源码分析

作者: 大雄的学习笔记 | 来源:发表于2020-07-09 18:23 被阅读0次
  • block概念
    block是hdfs中的物理分区,默认一个block的大小是128MB,当上传到hdfs的文件超过128MB后,会把超过的部分进行切边存储到其他的block。

  • split概念
    split是一个逻辑的分片,在进行map-reduce的之前,将文件按照一定的规则进行分片,把每个分片分发到不同的maptask。对于hdfs上的文件操作默认的分片大小是128MB,对本地的文件操作默认的分片大小是32MB。

  • splitSize的计算逻辑
    FileInputFormat.getSplits方法中splitSize的计算代码

//miniSize是取formatMinSplitSize、minSplitSize两者的最大值。
long minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));
//获取maxSplitSize 
long maxSize = getMaxSplitSize(job);
//获取blockSize,在hdfs文件系统中默认是128MB,在本地测试环境默认是32MB
long blockSize = file.getBlockSize();
//根据minSize、maxSize、blockSize三个值来计算splitSize
long splitSize = computeSplitSize(blockSize, minSize, maxSize);

formatMinSplitSize默认是1

protected long getFormatMinSplitSize() {
    return 1;
}

minSplitSize默认是1,也可手动配置

public static final String SPLIT_MINSIZE = "mapreduce.input.fileinputformat.split.minsize";
public static long getMinSplitSize(JobContext job) {
    return job.getConfiguration().getLong(SPLIT_MINSIZE, 1L);
}

maxSplitSize默认是Long.MAX_VALUE,也可手动配置

public static final String SPLIT_MAXSIZE ="mapreduce.input.fileinputformat.split.maxsize";
public static long getMaxSplitSize(JobContext context) {
    return context.getConfiguration().getLong(SPLIT_MAXSIZE, 
                                              Long.MAX_VALUE);
}

计算规则

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

Math.max(1,Math.min(Long.MAX_VALUE,128)) = 128
在HDFS中的计算结果默认是128MB
在本地跑测试结果是32MB

相关文章

网友评论

      本文标题:Hadoop 文件分片 split的源码分析

      本文链接:https://www.haomeiwen.com/subject/ijmscktx.html