当前位置: 首页 > news >正文

Hive on Tez 中 Map 任务的数量计算

Hive on Tez Mapper 数量计算

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

 

1.MR模式

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

 

 

对应日志条目为:

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

 

2.Tez模式

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



生成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开始计算可用的slotscontainer)数,这里计算得到3slots,并打印了默认的waves值为1.7

在此场景中,集群一共资源为 8 vcore12G 内存,capacity-scheduler中指定的user limit factor 0.5,也就是说:当前用户能使用的资源最多为 6G 内存。在Tez Driver中,申请的container 资源的单位为:
Default Resources=<memory:1536, vCores:1>
 
 
所以理论上可以申请到的container 数目为46G/1536MB = 4)个,而由于 Application Master 占用了一个container,所以最终available slots3个。

在计算出了可用的slots3个后,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聚合为5Split Group,生成5mapper执行任务。

但是这里还需要考虑另一个值:lengthPerGroupTez会检查lengthPerGroup是否在 tez.grouping.min-size (默认为50MB)以及 tez.grouping.max-size(默认为1GB 定义范围内。如果超过了max-size,则指定lengthPerGroupmax-size,如果小于min-size,则指定lengthPerGroupmin-size

在这个场景下,数据总大小为 31733311148 bytes29.5GB左右,也是原数据大小),预估为5Group 则每个Group splitLength6346662229 bytes5.9GB 左右),超过了 Max splitLength = 1073741824 bytes 1GB),所以重新按 splitLength = 1GB 来算,计算出所需的numSplits 数为 30 个,每个Split Group的大小为1GB

在计算出了每个Split Group的大小为1GB后,由于原Split总数目为476,所以需要将这476inputSplit进行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中将会包含15inputSplits,所以最终可以计算出的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个,但是最终仅生成了32map任务用于处理所有的 475inputSplits,减少了过多mapper任务会带来的额外开销。

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

 

转载于:https://www.cnblogs.com/zackstang/p/11435039.html

相关文章:

  • countUp.js-数字滚动效果(简单基础使用)
  • Windows 搭建 nginx rtmp服务器
  • MySQL的sql_mode模式说明及设置
  • my read law / notarization / gongzheng
  • 我要成为怎么样的人
  • 虚拟机enp0s8网卡无法联网和开放linux端口
  • ANT下载和配置 IDEA
  • 目标检测: R-CNN原理
  • win10下cmake 编译tensorflow1.11.0
  • 目标检测: Fast R-CNN原理
  • webserver SVN / Subversion
  • VS开发C++控制台应用程序(示例)
  • WPF调用C++生成的dll文件(示例)
  • ffmpeg命令参数详解
  • Spring 注入多列和单列
  • Google 是如何开发 Web 框架的
  • css系列之关于字体的事
  • ECMAScript入门(七)--Module语法
  • express如何解决request entity too large问题
  • HTML中设置input等文本框为不可操作
  • js如何打印object对象
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • PAT A1017 优先队列
  • socket.io+express实现聊天室的思考(三)
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 订阅Forge Viewer所有的事件
  • 解析带emoji和链接的聊天系统消息
  • 浏览器缓存机制分析
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 思维导图—你不知道的JavaScript中卷
  • 通过git安装npm私有模块
  • 消息队列系列二(IOT中消息队列的应用)
  • 小程序01:wepy框架整合iview webapp UI
  • 移动端唤起键盘时取消position:fixed定位
  • 用简单代码看卷积组块发展
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #stm32驱动外设模块总结w5500模块
  • #Z0458. 树的中心2
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (4)Elastix图像配准:3D图像
  • (9)STL算法之逆转旋转
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (十)c52学习之旅-定时器实验
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • *p++,*(p++),*++p,(*p)++区别?
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET 服务 ServiceController
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题