Hive on Tez Mapper 数量计算

在Hive 中执行一个query时,我们可以发现Hive 的执行引擎在使用 Tez 与 MR时,两者生成mapper数量差异较大。主要原因在于 Tez 中对 inputSplit 做了 grouping 操作,将多个 inputSplit 组合成更少的 groups,然后为每个 group 生成一个 mapper 任务,而不是为每个inputSplit 生成一个mapper 任务。下面我们通过日志分析一下这中间的整个过程。

1.MR模式

在 mr 模式下,生成的container数为116个:

对应日志条目为:

Normal
0

false
false
false

EN-US
ZH-CN
X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin-top:0in;
mso-para-margin-right:0in;
mso-para-margin-bottom:8.0pt;
mso-para-margin-left:0in;
line-height:107%;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;}

Input size for job job_1566964005095_0003 = 31733311148. Number of splits = 116

在MR中,使用的是Hadoop中的FileInputFormat,所以若是一个文件大于一个block的大小,则会切分为多个InputSplit;若是一个文件小于一个block大小,则为一个InputSplit。
在这个例子中,总文件个数为14个,每个均为2.1GB,一共29.4GB大小。生成的InputSplit数为116个,也就是说,每个block(这个场景下InputSplit 大小为一个block大小)的大小大约为256MB。

Normal
0

false
false
false

EN-US
ZH-CN
X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin-top:0in;
mso-para-margin-right:0in;
mso-para-margin-bottom:8.0pt;
mso-para-margin-left:0in;
line-height:107%;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;}

2.Tez模式

而在Tez模式下,生成的map任务为32个:




  Normal
0 false
false
false EN-US
ZH-CN
X-NONE /* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin-top:0in;
mso-para-margin-right:0in;
mso-para-margin-bottom:8.0pt;
mso-para-margin-left:0in;
line-height:107%;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;} aaarticlea/png;base64,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" alt="" />

生成split groups的相关日志如下:
|mapred.FileInputFormat|: Total input files to process : 14
|io.HiveInputFormat|: number of splits 476
 
|tez.HiveSplitGenerator|: Number of input splits: 476. 3 available slots, 1.7 waves. Input format is: org.apache.hadoop.hive.ql.io.HiveInputFormat
...
|tez.SplitGrouper|: # Src groups for split generation: 2
|tez.SplitGrouper|: Estimated number of tasks: 5 for bucket 1
 
|grouper.TezSplitGrouper|: Grouping splits in Tez
|grouper.TezSplitGrouper|: Desired splits: 5 too small.  Desired splitLength: 6346662229 Max splitLength: 1073741824 New desired splits: 30 Total length: 31733311148 Original splits: 476
|grouper.TezSplitGrouper|: Desired numSplits: 30 lengthPerGroup: 1057777038 numLocations: 1 numSplitsPerLocation: 476 numSplitsInGroup: 15 totalLength: 31733311148 numOriginalSplits: 476 . Grouping by length: true count: false nodeLocalOnly: false
|grouper.TezSplitGrouper|: Doing rack local after iteration: 32 splitsProcessed: 466 numFullGroupsInRound: 0 totalGroups: 31 lengthPerGroup: 793332736 numSplitsInGroup: 11
|grouper.TezSplitGrouper|: Number of splits desired: 30 created: 32 splitsProcessed: 476
|tez.SplitGrouper|: Original split count is 476 grouped split count is 32, for bucket: 1
|tez.HiveSplitGenerator|: Number of split groups: 32
 
Avaiable Slots
首先可以看到,需要处理的文件数为14,初始splits数目为476(即意味着在这个场景下,一个block的大小约为64MB)。对应日志条目如下:
|mapred.FileInputFormat|: Total input files to process : 14
|io.HiveInputFormat|: number of splits 476
 

获取到splits的个数为476个后,Driver开始计算可用的slots(container)数,这里计算得到3个slots,并打印了默认的waves值为1.7。

在此场景中,集群一共资源为 8 vcore,12G 内存,capacity-scheduler中指定的user limit factor 为0.5,也就是说:当前用户能使用的资源最多为 6G 内存。在Tez Driver中,申请的container 资源的单位为:
Default Resources=<memory:1536, vCores:1>

所以理论上可以申请到的container 数目为4(6G/1536MB = 4)个,而由于 Application Master 占用了一个container,所以最终available slots为3个。
在计算出了可用的slots为3个后,Tez 使用split-waves 乘数(由tez.grouping.split-waves指定,默认为1.7)指定“预估”的Map 任务数目为:3 × 1.7 = 5  个tasks。对应日志条目如下:
|tez.HiveSplitGenerator|: Number of input splits: 476. 3 available slots, 1.7 waves. Input format is: org.apache.hadoop.hive.ql.io.HiveInputFormat
|tez.SplitGrouper|: Estimated number of tasks: 5 for bucket 1
 
Grouping Input Splits
在Tez分配任务时,不会像mr那样为每个split生成一个map任务,而是会将多个split进行grouping,让map任务更高效地的完成。首先Tez会根据计算得到的 estimated number of tasks = 5,将splits聚合为5个Split Group,生成5个mapper执行任务。
但是这里还需要考虑另一个值:lengthPerGroup。Tez会检查lengthPerGroup是否在 tez.grouping.min-size (默认为50MB)以及 tez.grouping.max-size(默认为1GB) 定义范围内。如果超过了max-size,则指定lengthPerGroup为max-size,如果小于min-size,则指定lengthPerGroup为min-size。
在这个场景下,数据总大小为 31733311148 bytes(29.5GB左右,也是原数据大小),预估为5个Group, 则每个Group的 splitLength为6346662229 bytes(5.9GB 左右),超过了 Max splitLength = 1073741824 bytes( 1GB),所以重新按 splitLength = 1GB 来算,计算出所需的numSplits 数为 30 个,每个Split Group的大小为1GB。
在计算出了每个Split Group的大小为1GB后,由于原Split总数目为476,所以需要将这476个inputSplit进行grouping,使得每个Group的大小大约为1GB左右。按此方法计算,预期的splits数目应为30个(但是仅是通过总数据大小/lengthPerGroup得出,尚未考虑inputSplits如何合并的问题,不一定为最终生成的map tasks数目)。且最终可计算得出每个group中可以包含15个原split,也就是numSplitsInGroup = 15。相关日志条目如下:
|grouper.TezSplitGrouper|: Grouping splits in Tez
|grouper.TezSplitGrouper|: Desired splits: 5 too small.  Desired splitLength: 6346662229 Max splitLength: 1073741824 New desired splits: 30 Total length: 31733311148 Original splits: 476
|grouper.TezSplitGrouper|: Desired numSplits: 30 lengthPerGroup: 1057777038 numLocations: 1 numSplitsPerLocation: 476 numSplitsInGroup: 15 totalLength: 31733311148 numOriginalSplits: 476 . Grouping by length: true count: false nodeLocalOnly: false
 
原splits总数目为 476,在对splits进行grouping时,每个group中将会包含15个inputSplits,所以最终可以计算出的group数目为 476/15 = 32 个,也就是最终生成的mapper数量。
|tez.SplitGrouper|: Original split count is 476 grouped split count is 32, for bucket: 1
|tez.HiveSplitGenerator|: Number of split groups: 32
 
所以在Tez中,inputSplit 数目虽然是476个,但是最终仅生成了32个map任务用于处理所有的 475个inputSplits,减少了过多mapper任务会带来的额外开销。

Split Waves
这里为什么要定义一个split waves值呢?使用此值之后会让Driver申请更多的container,比如此场景中本来仅有3个slots可用,但是会根据这个乘数再多申请2个container资源。但是这样做的原因是什么呢?
 1.首先它可以让分配资源更灵活:比如集群之后添加了计算节点、其他任务完成后释放了资源等。所以即使刚开始会有部分map任务在等待资源,它们在后续也会很快被分配到资源执行任务 
  2. 将数据分配给更多的map任务可以提高并行度,减少每个map任务中处理的数据量,并缓解由于少部分map任务执行较慢,而导致的整体任务变慢的情况

Hive on Tez 中 Map 任务的数量计算的更多相关文章

  1. hive优化,控制map、reduce数量

    一.调整hive作业中的map数 1.通常情况下,作业会通过input的目录产生一个或者多个map任务.主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小(目前为1 ...

  2. 【Hadoop】三句话告诉你 mapreduce 中MAP进程的数量怎么控制?

    1.果断先上结论 1.如果想增加map个数,则设置mapred.map.tasks 为一个较大的值. 2.如果想减小map个数,则设置mapred.min.split.size 为一个较大的值. 3. ...

  3. hadoop中map和reduce的数量设置问题

    转载http://my.oschina.net/Chanthon/blog/150500 map和reduce是hadoop的核心功能,hadoop正是通过多个map和reduce的并行运行来实现任务 ...

  4. hadoop中map和reduce的数量设置

    hadoop中map和reduce的数量设置,有以下几种方式来设置 一.mapred-default.xml 这个文件包含主要的你的站点定制的Hadoop.尽管文件名以mapred开头,通过它可以控制 ...

  5. hive on tez

    hive运行模式 hive on mapreduce 离线计算(默认) hive on tez  YARN之上支持DAG作业的计算框架 hive on spark 内存计算 hive on tez T ...

  6. Hadoop map和reduce数量估算

    Hadoop在运行一个mapreduce job之前,需要估算这个job的maptask数和reducetask数.首先分析一下job的maptask数,当一个job提交时,jobclient首先分析 ...

  7. hive on tez配置

    1.Tez简介 Tez是Hontonworks开源的支持DAG作业的计算框架,它可以将多个有依赖的作业转换为一个作业从而大幅提升MapReduce作业的性能.Tez并不直接面向最终用户--事实上它允许 ...

  8. Etl之HiveSql调优(设置map reduce 的数量)

    前言: 最近发现hivesql的执行速度特别慢,前面我们已经说明了left和union的优化,下面咱们分析一下增加或者减少reduce的数量来提升hsql的速度. 参考:http://www.cnbl ...

  9. 如何确定 Hadoop map和reduce的个数--map和reduce数量之间的关系是什么?

    1.map和reduce的数量过多会导致什么情况?2.Reduce可以通过什么设置来增加任务个数?3.一个task的map数量由谁来决定?4.一个task的reduce数量由谁来决定? 一般情况下,在 ...

随机推荐

  1. .net持续集成sonarqube篇之sonarqube基本操作(二)

    系列目录 Activity界面操作 Activity界面主要是对多次构建管理界面,主要是帮助管理员快速了解项目每次构建与以往构建相比问题是增加了还是减少了等指标.由于目前我们仅进行了一次构建,因此没有 ...

  2. Java提供的几种线程池

    线程池,顾名思义,放线程的池子嘛,这个池子可以存放多少线程取决于你自己采用什么样的线程池,你的硬件资源,以及并发线程的数量.JDK提供了下面的四种线程池: 固定线程数的线程池 最简单的 在Java中创 ...

  3. JS制作简易的考试答题管理系统

    答题卡系统: 网站运行效果 代码区域: HTML 代码: <style type="text/css"> body { font-size: 30px; backgro ...

  4. java 第一章

    1.java四要素  public static void main 2.java 的历史 and soso 3.知道java的格式和要求 4.知道如何配置环境变量 5.java的编写:  a.大括号 ...

  5. python 的几种数据类型

    列表  列表是 Python  的主力数据类型.当提到 " 列表 " 时,您脑海中可 能会闪现" 必须进一步声明大小的数组,只能包含同一类对象 "  等想法.千 ...

  6. .net core(c#)拟合圆测试

    说明 很多时候,我们需要运动物体的转弯半径去描述其机器性能.但在大多数的现实条件下,我们只能够获取到运动物体的 GPS 位置点集,并不能直接得到转弯半径或者圆心位置.为此,我们可以利用拟合圆的方式得到 ...

  7. linux集群实施与部署-----Nginx

    ( 1 ) 配置基本环境 //安装虚拟工具 #cd /media/VMware\ Tools/ #cp VMwareTools--.tar.gz/tmp/ #cd /tmp/ #tar-xvzf VM ...

  8. MySQL操作命令梳理(1)

    一.索引 1.创建索引 索引的创建可以在CREATE TABLE语句中进行,也可以单独用CREATE INDEX或ALTER TABLE来给表增加索引.以下命令语句分别展示了如何创建主键索引(PRIM ...

  9. iOS基础面试题汇总

    目录 1. #import 跟#include.@class有什么区别?#import<> 跟 #import""又什么区别? 都可以完整包含某个文件的内容,但是#im ...

  10. kylin Retrieving hive dependency...

    由于公司环境配置hive默认连接hiveserver2 ,不管hive cli 还是beeline cli都默认使用beeline cli,连接hive需要输入账号密码; 启动kylin 时会Retr ...