谈谈对MapTask任务分配和Shuffle的理解
一、切片与MapTask的关系
1、概述
大家要注意区分切片与切块的区别:
- 切块Block是HDFS物理上把数据分成一块一块的,默认是128M;
- 数据切片:只是在逻辑上对输入进行分片,并不会在磁盘上分成片进行存储;而是分成片对数据进行处理。
物理上HDFS会把数据进行切块存储,但是当进行数据处理时,取出来的一块数据是整体是比较大的,需要对数据进行切片处理。如果切片设置为100M,那么一个数据块128M会被分成两个切片。
而MapTask的任务数量既与切片的个数有关又与文件个数有关。
2、MapTask的决定因素
- 文件的大小:当切片为128M时,如果文件块的大于128M就会被分成2个split甚至多个。
- 文件的个数:FileinputFormat按照文件分割split,并且只会分割大文件,即那些大小超过HDFS块的大小的文件。如果HDFS中dfs.block.size设置为128,而输入的文件有100个,则划分后的split个数至少为100个。
- splitsize的大小:分片是按照splitsize的大小进行分割的,一个split的大小在没有设置的情况下,默认等于hdfs block的大小,但是程序可以通过两个参数进行设置,对splitsize进行调节。
InputSplit=Math.max(minSize, Math.min(maxSize, blockSize)
其中:
minSize=mapred.min.split.size
maxSize=mapred.max.split.size
我们可以在MapReduce程序的驱动部分添加如下代码:
TextInputFormat.setMinInputSplitSize(job,1024L); // 设置最小分片大小。
TextInputFormat.setMaxInputSplitSize(job,1024×1024×10L); // 设置最大分片大小。
3、总结
因此我们可以得出如下结论:MapTask的数量=小于split的文件个数+大于split的文件的个数/切片大小。
二、Shuffle的理解
1、概述
Shuffle:简单来说,就是将分布在集群中多个节点上的同一key的“键值对”信息,拉取到同一节点上;Shuffle过程中,各个节点上的相同key都会先写入到本地磁盘文件中,然后其他节点需要通过网络传输来去各个节点的磁盘拉取文件中相同key的值。而相同的key都被拉取到同一节点进行聚合操作时,还有可能因为内存不够,进而溢写到磁盘文件中。因此在Shuffle过程中,可能会发生大量的磁盘文件读取的IO操作,以及数据的网络传输操作。

2、通过一张图来解析一个Job的声明周期
如上图所以,一个job的声明周期如下所述:
- 首先对数据进行split,切成不同的分片
- 对不同的分片记性MapTask操作
- 进入Shuffle过程,对相同的key值拉取到同一节点的分区中;
- 进行Reduce聚合操作,将相同的key值进行统计;
- 将Reduce结果放入到一个结果文件中。
谈谈对MapTask任务分配和Shuffle的理解的更多相关文章
- 谈谈我对Java中CallBack的理解
谈谈我对Java中CallBack的理解 http://www.cnblogs.com/codingmyworld/archive/2011/07/22/2113514.html CallBack是回 ...
- 转载 CSDN 谈谈我对证券公司一些部门的理解(前、中、后台)
谈谈我对证券公司一些部门的理解(前.中.后台) 2018年02月08日 15:11:07 unirong 阅读数:2165 文中对各大部门的分析都是从作者多年经历总结出来的有感之谈,尤其是前台的6 ...
- 谈谈我对证券公司一些部门的理解(前、中、后台)[z]
[z]https://blog.csdn.net/UniRong/article/details/79289947 文中对各大部门的分析都是从作者多年经历总结出来的有感之谈,尤其是前台的6大部门(经纪 ...
- [每日一题]面试官问:谈谈你对ES6的proxy的理解?
[每日一题]面试官问:谈谈你对ES6的proxy的理解? 关注「松宝写代码」,精选好文,每日一题 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...
- 谈谈Android 6.0运行时权限理解
前言 谷歌在2015年8月份时候,发布了Android 6.0版本,代号叫做“棉花糖”(Marshmallow ),其中的很大的一部分变化,是在用户权限授权上,或许是感觉之前默认授权的不合理,现在6. ...
- 谈谈你对Java异常处理机制的理解
先谈谈我的理解:异常处理机制可以说是让我们编写的程序运行起来更加的健壮,无论是在程序调试.运行期间发生的异常情况的捕获,都提供的有效的补救动作,任何业务逻辑都会存在异常情况,这时只需要记录这些异常情况 ...
- 【搞定面试官】谈谈你对JDK中Executor的理解?
## 前言 随着当今处理器计算能力愈发强大,可用的核心数量越来越多,各个应用对其实现更高吞吐量的需求的不断增长,多线程 API 变得非常流行.在此背景下,Java自JDK1.5 提供了自己的多线程框架 ...
- 谈谈我对 js原型链的理解
想要学习 “原型链” 必须要认识什么是 “原型” 和 “原型链” 先理解一下普通的继承和原型的区别,下面写一段js代码来帮助理解: var Animal = function(){ // 动物抽象类 ...
- 谈谈对C#中反射的一些理解和认识(下)
在上一篇中我们列举了一些反射的常规的使用,这一篇我们将介绍一些关于关于反射的高级属性,这些包括创建对反射的性能的总结以及如何优化反射性能,以及通过InvokeMember的方法如何去调用反射等等,通过 ...
随机推荐
- 3_02_MSSQL课程_Ado.Net_连接池_连接字符串
连接池技术:是一种对象池技术. 连接对象频繁的开启和关闭操作. innerConnection 先从池子里面拿,如果没有创建新的!!连接池有大小,最大/最小. 提高了连接对象的重用. Asp.ne ...
- python打印日志log
整理一个python打印日志的配置文件,是我喜欢的格式. # coding:utf-8 # 2019/11/7 09:19 # huihui # ref: import logging LOG_FOR ...
- dequeueReusableCellWithIdentifier 与 dequeueReusableCellWithIdentifier:forIndexPath 区别
参考:http://stackoverflow.com/questions/25826383/when-to-use-dequeuereusablecellwithidentifier-vs-dequ ...
- 网络请求中的URL中传bool型数据
如果在URL中要拼接bool的数据,OC这边不能使用BOOL型.因为使用NSString的拼接字符串类方法中,会将BOOL型数据转化为0或者1. 解决办法: NSString *overdue_str ...
- C++中%d,%s,%x,%f,%.100f,%的意思
C++中%d,%s,%x,%f,%.100f,%的意思 标准格式化输出:格式字符有d,o,x,u,c,s,f,e,g等. 格式说明:由“%”和格式字符组成,如%d.%f等. %c用来输出一个字符; % ...
- pycharm安装报错Non-zero exit co?
pycharm安装第三方库时报错Non-zero exit co? 原因:版本找不到 解决思路: 1.用pip install pandas报错,尝试用python -m pip install -- ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:按钮大小
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 二、js中基础知识
该篇文章主要是强化一下自己javaScript的基础,让写代码变得更轻松些.基础好的请忽略. JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解 ...
- Day9 - J - 吉哥系列故事——恨7不成妻 HDU - 4507
单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了214和77这两个数,发现: 2+1+4=7 7+7=7*2 77=7 ...
- Java 8 Stream 的终极技巧——Collectors 操作
1. 前言 昨天在 Collection移除元素操作 相关的文章中提到了 Collectors .相信很多同学对这个比较感兴趣,那我们今天就来研究一下 Collectors . 2. Collecto ...