MapReducer中Mapper的切片原理是什么

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

岳塘网站建设公司创新互联建站,岳塘网站设计制作,有大型网站制作公司丰富经验。已为岳塘近1000家提供企业网站建设服务。企业网站搭建\外贸网站制作要多少钱,请找那个售后服务好的岳塘做网站的公司定做!

一、首先,我们看到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

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


标题名称:MapReducer中Mapper的切片原理是什么
转载注明:http://myzitong.com/article/ijjjee.html