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