MapReducer中Mapper的切片原理是什么

18次阅读
没有评论

这篇文章将为大家详细讲解有关 MapReducer 中 Mapper 的切片原理是什么,文章内容质量较高,因此丸趣 TV 小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

一、首先,我们看到 Map 运行的时候不同文件启动了不同数量的 map 任务,但是 JOB 中又没有设置 map 数量的配置,其实 map 运行时 MRAppMaster 请求 RM 资源运行的 MapTask 是由 map 前的文件切片所决定的(虽然 split 默认等于 blocksize 但是决不等同于 blocksize)

二、原理:分发到各个节点的 mapTask 对文件处理时是按照一个个切片执行的

MapReducer 中 Mapper 的切片原理是什么

如图所示,默认的 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 的切片原理是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。