博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MapReducer之Mapper中的Split切片原理(即影响MapTask数目的原因)
阅读量:7034 次
发布时间:2019-06-28

本文共 1638 字,大约阅读时间需要 5 分钟。

hot3.png

今天看到有朋友问到了MapTask的相关问题,我觉得有必要发个博客结合源码整个解析一下.

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

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

004430_5azu_2470834.png

如图所示,默认的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

 

 

 

转载于:https://my.oschina.net/u/2470834/blog/639689

你可能感兴趣的文章
poi 操作excel
查看>>
去哪网第一题
查看>>
wufabuquan
查看>>
CentOS 6.5 安装Nginx 1.7.4
查看>>
commander.js 制作简易的 MINA CLI 脚手架
查看>>
召回率与精确率
查看>>
HDU 1573~3579 X问题&Hello Kiki[同余方程]
查看>>
[SDOI2017]数字表格
查看>>
[八省联考2018]劈配
查看>>
antlr.collections.AST.getLine()I异常
查看>>
霍夫曼树
查看>>
使用Go语句生成数值表
查看>>
抛出类类型的异常
查看>>
(visual)c++ 内存分配
查看>>
bootstrap 有些控件需要调用锚点,会与angular 路由 冲突
查看>>
oracle decode函数
查看>>
Fixed Effect
查看>>
jQuery的选择器
查看>>
HDU 2141 Can you find it?
查看>>
学习笔记---C++析构函数心得
查看>>