Hive数据倾斜优化
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数据倾斜优化相关推荐
- oracle数据倾斜优化,Hive数据倾斜优化 - ericquan8的个人页面 - OSCHINA - 中文开源技术交流社区...
数据倾斜成因:由于数据分布不均匀,造成数据大量的集中到一点,造成数据热点.具体为某一个reduce接收到的数据是其他reduce的n倍,导致明显的木桶效应. 症状: 1,对表做select count ...
- HIVE 数据倾斜浅谈
HIVE 数据倾斜浅谈 一.数据倾斜现象 map100%,reduce一直卡在一个值,如99%. 二.数据倾斜的原因 数据按key的hash值分配到reduce中,如果有的key值比较集中,就 ...
- hive数据倾斜及处理案例
什么是数据倾斜 数据倾斜其实是进行分布式计算的时候,某些节点的计算能力比较强或者需要计算的数据比较少,早早执行完了,某些节点计算的能力较差或者由于此节点需要计算的数据比较多,导致出现其他节点的redu ...
- rdd数据存内存 数据量_Spark 性能优化(二)——数据倾斜优化
1.2 数据倾斜优化 1.2.1 为何要处理数据倾斜(Data Skew) 什么是数据倾斜?对 Spark/Hadoop 这样的大数据系统来讲,数据量大并不可怕,可怕的是数据倾斜. 何谓数据倾斜?数据 ...
- Spark sql数据倾斜优化的一个演示案例
以统计词频演示spark利用先局部聚合再全局聚合解决数据倾斜的例子. import org.apache.spark.sql.{DataFrame, SparkSession}object DataS ...
- 【HIVE数据倾斜常见解决办法】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.什么是HIVE数据倾斜? 二.数据倾斜原因及解决办法 1. Join 倾斜 a. 大表 Join 小表 b. 大表 ...
- 深入浅出Hive数据倾斜,最全面的讲解(好文收藏)
背景 我们日常使用HIVE SQL的时候可能会遇到这样一个令人苦恼的场景:执行一个非常简单的SQL语句,任务的进度条长时间卡在99%,不确定还需多久才能结束,这种现象称之为数据倾斜.这一现象出现的原因 ...
- Hive数据倾斜解决方法总结
Hive数据倾斜解决方法总结 参考文章: (1)Hive数据倾斜解决方法总结 (2)https://www.cnblogs.com/kongcong/p/7777092.html 备忘一下.
- hive数据倾斜的解决办法
数据倾斜是进行大数据计算时常见的问题.主要分为map端倾斜和reduce端倾斜,map端倾斜主要是因为输入文件大小不均匀导致,reduce端主要是partition不均匀导致. 在hive中遇到数据倾 ...
最新文章
- 最近又Get个新技能,不是全栈也能用技术倒腾点东西赚零花钱了!
- unity3D打包发布Apk详细步骤
- 那些年我们薅(撸)过的电子羊毛(设备)
- 掌握 Ajax,第 8 部分: 在请求和响应中使用 XML
- 深圳部分写字楼租金暴跌,为何会出现这种情况?
- 终端mysql Operation not permitted错误解决方案
- LeetCode刷题——62. 不同路径
- 3月22 坐标系转换,旋转矩阵,仿射变换,例子,相机与世界,欧拉角与轴角公式,一个坐标系下面的轨迹
- linux新建虚拟机到图形化界面
- Redies(一款高性能的数据库)
- linux dvd 刻录_如何将任何视频文件刻录到可播放的DVD
- WP模板,WP网站模板,WP网站主题模板
- 《买土豆的故事》——经典职场故事
- Python快速读取超大文件
- 中国工业园区建设与运营市场发展状况与投资战略咨询报告2022-2028年
- 2007年IT产业回顾:划时代的一年 一个变革的时代
- proteus常用元件图示和名称介绍
- Jmeter读取excel表格数据响应数据乱码
- 变形金刚2 昨日上映 汽车人提前降临地球
- canvas圆形进度条