这篇文章将为大家详细讲解有关 MapReducer 中 Mapper 的切片原理是什么,文章内容质量较高,因此丸趣 TV 小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
一、首先,我们看到 Map 运行的时候不同文件启动了不同数量的 map 任务,但是 JOB 中又没有设置 map 数量的配置,其实 map 运行时 MRAppMaster 请求 RM 资源运行的 MapTask 是由 map 前的文件切片所决定的(虽然 split 默认等于 blocksize 但是决不等同于 blocksize)
二、原理:分发到各个节点的 mapTask 对文件处理时是按照一个个切片执行的
如图所示,默认的 InputFormat 为 TextInputFormat 而 TextInputFormat 继承于 FileInputFormat
@InterfaceAudience.Public
@InterfaceStability.Stable
public class TextInputFormat extends FileInputFormat LongWritable, Text
我们再来看看 FileInputFormat 是怎么对文件进行切片的
在 FileInputformat 中有 issplit()方法 (该方法设置是否对文件进行分割) 和 getsplits 方法,getsplits 中调用
computeSplitSize() 方法通过 return Math.max(minSize, Math.min(goalSize, blockSize))来获取 splits 这个源码看附件图片. 所以我们想要改变 split 大小 (即改变 mapTask) 数目的时候需要在配置文件中添加参数
mapreduce.input.fileinputformat.split.minsize 和
mapreduce.input.fileinputformat.split.maxsize
来改变 splits
源码中的 isSplitable():
protected boolean isSplitable(FileSystem fs, Path filename) {
return true;
}
默认为切割文件,如果自定义 InputFormat 的话可以继承 FileInputFormat 覆盖 isSplitable 方法返回 false
源码中的 getsplits 主要代码段:
public InputSplit[] getSplits(JobConf job, int numSplits)
throws IOException {
……
long blockSize = file.getBlockSize();
long splitSize = computeSplitSize(goalSize, minSize, blockSize);
}
如图, 调用了 computeSplitSize()方法来获取 splitsize
最后, 看一下 computeSplitSize 源码:
protected long computeSplitSize(long goalSize, long minSize,
long blockSize) {
return Math.max(minSize, Math.min(goalSize, blockSize));
}
所以从中可以看出来 Math.max(minSize, Math.min(goalSize, blockSize));
决定了 splitsize 的大小
配置文件中可以配置:
mapreduce.input.fileinputformat.split.minsize 和
mapreduce.input.fileinputformat.split.maxsize
来改变 splits, 从而改变 mapTask 的数目:
MapTask 数目 =filesize/splitsize+1
关于 MapReducer 中 Mapper 的切片原理是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。