Hive数据倾斜

Group By 中的计算均衡优化

1.Map端部分聚合

先看看下面这条SQL,由于用户的性别只有男和女两个值 (未知)。如果没有map端的部分聚合优化,map直接把groupby_key 当作reduce_key发送给reduce做聚合,就会导致计算不均衡的现象。虽然map有100万个,但是reduce只有两个在做聚合,每个reduce处理100亿条记录。

selectuser.gender,count(1) from user group by user.gende

没开map端聚合产生的计算不均衡现象

hive.map.aggr=true参数控制在group by的时候是否map局部聚合,这个参数默认是打开的。参数打开后的计算过程如下图。由于map端已经做了局部聚合,虽然还是只有两个reduce做最后的聚合,但是每个reduce只用处理100万行记录,相对优化前的100亿小了1万

map端聚合打开map聚合开关缺省是打开的,但是不是所有的聚合都需要这个优化。考虑先面的sql,如果groupby_key是用户ID,因为用户ID没有重复的,因此map聚合没有太大意义,并且浪费资源。

select user…id,count(1) from user group by user.id

hive.groupby.mapaggr.checkinterval = 100000

Hive.map.aggr.hash.min.reduction=0.5

上面这两个参数控制关掉map聚合的策略。Map开始的时候先尝试给前100000 条记录做hash聚合,如果聚合后的记录数/100000>0.5说明这个groupby_key没有什么重复的,再继续做局部聚合没有意义,100000 以后就自动把聚合开关关掉,在map的log中会看到下面的提示:2011-02-23 06:46:11,206 WARN org.apache.hadoop.hive.ql.exec.GroupByOperator: Disable Hash Aggr: #hash table = 99999 #total = 100000 reduction = 0.0 minReduction = 0.52.

数据倾斜

通常这种情况都是在有distinct出现的时候,比如下面的sql,由于map需要保存所有的user.id

,map聚合开关会自动关掉,导致出现计算不均衡的现象,只有2个redcue做聚合,每个reduce处理100亿条记录。

select user.gender,count(distinct user.id

) from user group by user.gender

) from user group by user.gender


hive.groupby.skewindata =true

参数会把上面的sql翻译成两个MR,第一个MR的reduce_key是gender+id。因为id是一个随机散列的值,因此这个MR的reduce计算是很均匀的,reduce完成局部聚合的工作

MR1第二个MR完成最终的聚合,统计男女的distinct id值,数据流如下图所示,每个Map只输出两条记录,因此虽然只有两个redcue计算也没有关系,绝大部分计算量已经在第一个MR完成


MR2 hive.groupby.skewindata

默认是关闭的,因此如果确定有不均衡的情况,需要手动打开这个开关。当然,并不是所有的有distinct的group by都需要打开这个开关,比如下面的

sql。因为user.id

select id,count (distinct gender) from user group by user.id

select gender,count (distinct id) from user group by user.gender

是一个散列的值,因此已经是计算均衡的了,所有的reduce都会均匀计算。只有在groupby_key不散列,而distinct_key散列的情况下才需要打开这个开关,其他的情况map聚合优化就足矣。

;三.Join 中的计算均衡优化在hive中,join操作一般都是在reduce阶段完成的,写sql的时候要注意把小表放在join的左边,原因是在 Join 操作的 Reduce 阶段,位于 Join 操作符左边的表的内容会被加载进内存,将条目少的表放在左边,可以有效减少发生 out of memory 错误的几率。 一个大表和一个配置表的reduce join经常会引起计算不均衡的情况。比如配置表gender_config(gender string,gender_id int)。把“男”“女”字符串映射成一个id。配置表和上面的user表join的sql如下: select user.id

gender_config.gender_id from gender_config join user on gender_config.gender=user.gender gender 只有男女两个值,hive处理join的时候把join_key作为reduce_key,因此会出现和group by类似的reduce计算不均衡现象,只有两个reduce参与计算,每个reduce计算100亿条记录。

一个大表和一个小配置表的reduce join流程图 这种大表和配置表通常采用mapjoin的方式来解决这种不均衡的现象。目前hive是采用/*+ MAPJOIN(gender_config) /提示的方式告诉翻译器把sql翻译成mapjoin,提示里必须指明配置表是哪个。 select /+ MAPJOIN(gender_config) */ user.id

gender_config.gender_id from gender_config join user on gender_config.gender=user.gender

一个大表和一个小配置表的map join流程图 每个map会把小表读到hash table,然后和大表做hash join。因此map join的关键是小表能放入map进程的内存,如果内存放不下会序列化到硬盘,效率会直线下降。 成千上万个map从hdfs读这个小表进自己的内存,使得小表的读操作变成成个join的瓶颈,甚至有些时候有些map读这个小表会失败(因为同时有太多进程读了),最后导致join失败。临时解决办法是增加小表的副本个数。下一步优化可以考虑把小表放入Distributed Cache里,map读本地文件即可。


作者:宁哥说
来源:CSDN
原文:https://blog.csdn.net/qq_35036995/article/details/80298403
版权声明:本文为博主原创文章,转载请附上博文链接!

Hive数据倾斜优化相关推荐

  1. oracle数据倾斜优化,Hive数据倾斜优化 - ericquan8的个人页面 - OSCHINA - 中文开源技术交流社区...

    数据倾斜成因:由于数据分布不均匀,造成数据大量的集中到一点,造成数据热点.具体为某一个reduce接收到的数据是其他reduce的n倍,导致明显的木桶效应. 症状: 1,对表做select count ...

  2. HIVE 数据倾斜浅谈

    HIVE 数据倾斜浅谈 一.数据倾斜现象   map100%,reduce一直卡在一个值,如99%. 二.数据倾斜的原因   数据按key的hash值分配到reduce中,如果有的key值比较集中,就 ...

  3. hive数据倾斜及处理案例

    什么是数据倾斜 数据倾斜其实是进行分布式计算的时候,某些节点的计算能力比较强或者需要计算的数据比较少,早早执行完了,某些节点计算的能力较差或者由于此节点需要计算的数据比较多,导致出现其他节点的redu ...

  4. rdd数据存内存 数据量_Spark 性能优化(二)——数据倾斜优化

    1.2 数据倾斜优化 1.2.1 为何要处理数据倾斜(Data Skew) 什么是数据倾斜?对 Spark/Hadoop 这样的大数据系统来讲,数据量大并不可怕,可怕的是数据倾斜. 何谓数据倾斜?数据 ...

  5. Spark sql数据倾斜优化的一个演示案例

    以统计词频演示spark利用先局部聚合再全局聚合解决数据倾斜的例子. import org.apache.spark.sql.{DataFrame, SparkSession}object DataS ...

  6. 【HIVE数据倾斜常见解决办法】

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.什么是HIVE数据倾斜? 二.数据倾斜原因及解决办法 1. Join 倾斜 a. 大表 Join 小表 b. 大表 ...

  7. 深入浅出Hive数据倾斜,最全面的讲解(好文收藏)

    背景 我们日常使用HIVE SQL的时候可能会遇到这样一个令人苦恼的场景:执行一个非常简单的SQL语句,任务的进度条长时间卡在99%,不确定还需多久才能结束,这种现象称之为数据倾斜.这一现象出现的原因 ...

  8. Hive数据倾斜解决方法总结

    Hive数据倾斜解决方法总结 参考文章: (1)Hive数据倾斜解决方法总结 (2)https://www.cnblogs.com/kongcong/p/7777092.html 备忘一下.

  9. hive数据倾斜的解决办法

    数据倾斜是进行大数据计算时常见的问题.主要分为map端倾斜和reduce端倾斜,map端倾斜主要是因为输入文件大小不均匀导致,reduce端主要是partition不均匀导致. 在hive中遇到数据倾 ...

最新文章

  1. 最近又Get个新技能,不是全栈也能用技术倒腾点东西赚零花钱了!
  2. unity3D打包发布Apk详细步骤
  3. 那些年我们薅(撸)过的电子羊毛(设备)
  4. 掌握 Ajax,第 8 部分: 在请求和响应中使用 XML
  5. 深圳部分写字楼租金暴跌,为何会出现这种情况?
  6. 终端mysql Operation not permitted错误解决方案
  7. LeetCode刷题——62. 不同路径
  8. 3月22 坐标系转换,旋转矩阵,仿射变换,例子,相机与世界,欧拉角与轴角公式,一个坐标系下面的轨迹
  9. linux新建虚拟机到图形化界面
  10. Redies(一款高性能的数据库)
  11. linux dvd 刻录_如何将任何视频文件刻录到可播放的DVD
  12. WP模板,WP网站模板,WP网站主题模板
  13. 《买土豆的故事》——经典职场故事
  14. Python快速读取超大文件
  15. 中国工业园区建设与运营市场发展状况与投资战略咨询报告2022-2028年
  16. 2007年IT产业回顾:划时代的一年 一个变革的时代
  17. proteus常用元件图示和名称介绍
  18. Jmeter读取excel表格数据响应数据乱码
  19. 变形金刚2 昨日上映 汽车人提前降临地球
  20. canvas圆形进度条

热门文章

  1. 关于JS中for循环时,作用域问题和this指针指向的总结
  2. 《从零开始学Swift》学习笔记(Day 40)——析构函数
  3. SQL Server 2008下日志清理方法
  4. 黑马程序员--C语言基础之--sizeof()运算符的使用以及注意
  5. PHPEXCEL实例
  6. Android中设置文本颜色的三种方法
  7. 函数实现不放在头文件的原因,及何时可以放头文件的情况【转】
  8. MySQL 删除大表的性能问题
  9. 简析LIVE555中的延时队列
  10. MySQL8.0内存相关参数介绍