这个图大概可以描述mapreduce计算模型的执行过程,下面我们就围绕这个图聊几个问题,其中有工作中非常有用的问题:

1. mapper的个数 
结论:mapper的个数是由输入数据的大小决定的,一般不需要我们去设置,如果你想控制mapper的个数,那么需要先了解hadoop是怎么控制mapper的个数。 
如图所示,每个Mapper Tasker对应一个split(切片),要处理的file被FileInputFormat分成了几个切片就会有几个mapper;FileInputFormat怎么获取的切面呢,直接上源码:

public List<InputSplit> getSplits(JobContext job)  {long minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));long maxSize = getMaxSplitSize(job);long splitSize = computeSplitSize(blockSize, minSize, maxSize);long blockSize = file.getBlockSize();long splitSize=computeSplitSize(blockSize,minSize, maxSize);}protected long getFormatMinSplitSize() {return 1;}public static long getMinSplitSize(JobContext job) {return job.getConfiguration().getLong(SPLIT_MINSIZE, 1L);}public static final String SPLIT_MINSIZE = "mapreduce.input.fileinputformat.split.minsize";public static long getMaxSplitSize(JobContext context) {return context.getConfiguration().getLong(SPLIT_MAXSIZE, Long.MAX_VALUE);}public static final String SPLIT_MAXSIZE = "mapreduce.input.fileinputformat.split.maxsize";protected long computeSplitSize(long blockSize, long minSize,long maxSize) {return Math.max(minSize, Math.min(maxSize, blockSize));}

通过源码得出切片数splitSize由三个元素决定:

  1. blockSize block大小,hadoop1默认64M,hadoop2默认128M
  2. minSize 最小值,默认是 1,我可以通过FileInputFormat.setMinInputSplitSize(job, size)方法来修改最小值;
  3. maxSize 最大值,默认是MAX_VALUE = 0x7fffffffffffffffL,可以通过FileInputFormat.setMaxInputSplitSize(job, size)修改最大值 
    最后做计算:Math.max(minSize, Math.min(maxSize, blockSize)) 
    默认情况下:Math.max(1, Math.min(0x7fffffffffffffffL, 128))显然结果为128,也就是说默认情况下有几个block就有几个切片,这也是为了提高mapreduce的运行效率。

2.reducer个数 
结论:reducer个数是由partition个数决定。 
mapper产生的中间数据经过shuffer过程,根据我们的业务把数据分成若干partition,每个partition的数据由对应的一个reducer来处理。mapreduce决定partition的是:Partitioner类中的intgetPartition(KEY key, VALUE value, int numPartitions)方法,我们来看下默认的分区方法:

public class HashPartitioner<K, V> extends Partitioner<K, V> {/** Use {@link Object#hashCode()} to partition. */public int getPartition(K key, V value,int numReduceTasks) {return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;}}

由代码看出默认的分区有两个元素决定:

  • key的hash值
  • numReduceTasks,需要我们通过job.setNumReduceTasks(reduceNum) 方法来设置的reducer个数 
    最终得出partition个数就是我们设置的个数,比如我们设置job.setNumReduceTasks(3) hashcode除以10的余数就是0、1、2三个值,默认之所以用key的hash值是为了把数据均匀的分布到reducer防止数据倾斜。 
    当然了我们可以根据我们自己的业务来继承Partition类重写getPartition方法来决定partition数。

MapReduce之mapper以及reducer的个数决定性因素相关推荐

  1. MapReduce框架Mapper和Reducer类源码分析

    一:Mapper类 在Hadoop的mapper类中,有4个主要的函数,分别是:setup,cleanup,map,run.代码如下: protected void setup(Context con ...

  2. Hadoop Stream Python mapper或reducer添加参数

    在-mapper后面,应该跟的是一个命令而不是一个文件名. 之前写的格式是: -mapper ./mapper_single.py 但其实执行的是./mapper_single.py命令(mapper ...

  3. Hadoop的Mapreduce中Mapper的key和Map的key的区别

    Hadoop的Mapreduce中Mapper的key和Map的key的区别 问题:我们知道Mapreduce 是以键值对的方式进行输入输出的,分为Mapper <k,v,k,v>和Red ...

  4. 027_编写MapReduce的模板类Mapper、Reducer和Driver

    模板类编写好后写MapReduce程序,的模板类编写好以后只需要改参数就行了,代码如下: 1 package org.dragon.hadoop.mr.module; 2 3 import java. ...

  5. MapReduce-流量统计求和-排序-Mapper和Reducer编写

    定义FlowMapper package cn.learn.mapreduce_sort;import org.apache.hadoop.io.LongWritable; import org.ap ...

  6. 【Hadoop】一个例子带你了解MapReduce

    写在前面:博主是一只经过实战开发历练后投身培训事业的"小山猪",昵称取自动画片<狮子王>中的"彭彭",总是以乐观.积极的心态对待周边的事物.本人的技 ...

  7. MapReduce调优总结

    一.调优的目的 充分的利用机器的性能,更快的完成mr程序的计算任务.甚至是在有限的机器条件下,能够支持运行足够多的mr程序. 二.调优的总体概述 从mr程序的内部运行机制,我们可以了解到一个mr程序由 ...

  8. Hadoop 1.x:体系结构,主要组件以及HDFS和MapReduce的工作方式

    Before reading this post, please go through my previous post at "Introduction to Hadoop" t ...

  9. hive 调优(一)coding调优

    本人认为hive是很好的工具,目前支持mr,tez,spark执行引擎,有些大公司原来封装的sparksql,开发py脚本,但是目前hive支持spark引擎(不是很稳定,建议Tez先),所以离线还是 ...

最新文章

  1. 双水泵轮换工作原理图_「物业管理工作」水泵维护保养规程
  2. 市场忽略了糖价的爆发力
  3. 图像处理:图像中噪声分布和概率密度函数的关系
  4. exe的dll加载过程
  5. .NET中使用Redis总结 —— 1.Redis搭建
  6. Oracle使用sqlplus登录用户尽量使用nolog登录
  7. python argparse 和opencv模块的组合使用_[记录]Python2.7使用argparse模块
  8. 「深度解读」为什么连Google也无法阻挡垂直行业SaaS的浪潮
  9. linux 自动发邮件脚本,科学网—用linux脚本自动发送和收取邮件 - 周宇的博文
  10. XidianOJ 1096 数的拆分
  11. 2014-04-08 创新点整理
  12. PCS7组态及简单项目搭建
  13. json转map几种方法
  14. 【测试】使用xtts V4迁移数据
  15. torch模块常用方法总结
  16. 阿里云ACP认证 VPC专项练习
  17. 荣耀v40轻奢版和华为nova8的区别 哪个好
  18. 阅读Decoupled Spatial-Temporal Attention Network for Skeleton-Based Action Recognition
  19. 小木虫为什么会有不好的用户体验?
  20. FBX导入错误 :ImportFBX Errors:

热门文章

  1. html中加法计算器的代码,JavaScript实现简易加法计算器
  2. 不同直播场景的CDN技术简析
  3. 2020年终总结 - 灾难之年,砥砺前行
  4. 徐志摩最美的6句话,刻骨铭心!
  5. 压力测试工具Benchmark
  6. 大众点评 App 搜索基于知识图谱的深度学习排序实践
  7. 接口传参(当参数需要一个json)
  8. 可视化程序设计基础(三)——一个简单的播放器(并不)
  9. [百瑞莲]diy巧克力盒
  10. SpringCloud之Turbine