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读本地文件即可。

---------------------

hive中groupby优化_Hive数据倾斜相关推荐

  1. hive中groupby优化_Hive 查询优化总结

    一.join优化 Join查找操作的基本原则:应该将条目少的表/子查询放在Join操作符的左边.原因是在Join操作的Reduce阶段,位于Join操作符左边的表的内容会被加载进内存,将条目少的表放在 ...

  2. 大数据笔记30—Hadoop基础篇13(Hive优化及数据倾斜)

    Hive优化及数据倾斜 知识点01:回顾 知识点02:目标 知识点03:Hive函数:多行转多列 知识点04:Hive函数:多行转单列 知识点05:Hive函数:多列转多行 知识点06:Hive函数: ...

  3. hive建表语句_Hive数据如何同步到MaxCompute之实践讲解

    摘要:本次分享主要介绍 Hive数据如何迁移到MaxCompute.MMA(MaxCompute Migration Assist)是一款MaxCompute数据迁移工具,本文将为大家介绍MMA工具的 ...

  4. hive解决数据倾斜问题_Hive数据倾斜和解决办法

    转自:https://blog.csdn.net/xinzhi8/article/details/71455883 操作: 关键词 情形 后果 Join 其中一个表较小,但是key集中 分发到某一个或 ...

  5. hive解决数据倾斜问题_hive数据倾斜及处理

    火山日常啰嗦 学习了一些大数据的相关框架后,发现应用层的东西确实不难,真正难的都是底层原理,所以我查看了很多资料,借鉴了前人的方法再加上自己的理解,写下了这篇文章. 数据倾斜的直白概念: 数据倾斜就是 ...

  6. hive的set优化_Hive优化(整理版)

    1. 概述 1.1 hive的特征: 可以通过SQL轻松访问数据的工具,从而实现数据仓库任务,如提取/转换/加载(ETL),报告和数据分析: 它可以使已经存储的数据结构化: 可以直接访问存储在Apac ...

  7. Spark性能优化之-数据倾斜

    文章目录 概述 现象和判定方式 数据倾斜发生时的现象 数据倾斜发生的原理 如何定位导致数据倾斜的代码 某个task执行特别慢的情况 某个task莫名其妙内存溢出的情况 查看导致数据倾斜的key的数据分 ...

  8. Hive的HQL语句及数据倾斜解决方案

    [版权申明:本文系作者原创,转载请注明出处] 文章出处:http://blog.csdn.net/sdksdk0/article/details/51675005 作者: 朱培          ID ...

  9. 大数据SQL优化之数据倾斜解决案例全集

    1 什么是数据倾斜 数据倾斜即指在大数据计算任务中某个处理任务的进程(通常是一个JVM进程)被分配到的任务量过多,导致任务运行时间超长甚至最终失败,进而导致整个大任务超长时间运行或者失败.外部表现的话 ...

最新文章

  1. CentOS6.5 升级 Python 2.7 版本
  2. java 多线程数量_java多线程之计算数量
  3. 类的加载过程一:Loading
  4. 微服务介绍及Asp.net Core实战项目系列之微服务介绍
  5. hdu4277 暴力
  6. [UVa-437] Color Length
  7. java 数据结构 迷宫_JAVA数据结构与算法之递归(一)~ 迷宫问题
  8. eclipse maven访问maven私有库
  9. spring的动态代理,碰到了一个类型转换的问题:java.lang.ClassCastException: com.sun.proxy.$Proxy16 cannot be cast to com.
  10. 设计没灵感,哪些网站可以参考?
  11. 程序员让开,硅谷将是物理学家的天下,薪水高得离谱
  12. virtualbox中给CentOS根分区扩容的方法
  13. 非标准的CAN波特率计算
  14. 什么是OFD格式文档?一文教你读懂OFD格式文档
  15. 如何使用Global Mapper分幅导出地图
  16. 麒麟子带你快速进入Cocos Creator的3D世界
  17. html借助JS简单实现图片闪烁功能
  18. 如何在CSDN收获粉丝-你主动我们之间就会有故事
  19. 【USB网络摄像头】基于mjpeg-streamer的视频采集与播放【QT上位机软件】
  20. VS2019设置easyx图形库

热门文章

  1. 关于PHPExcel 导出下载表格,调试器响应乱码
  2. LeetCode 题解之Find Peak Element
  3. Loj #6060. 「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set
  4. 设计模式之单例模式——Singleton
  5. UVa 1642 (综合) Magical GCD
  6. Hadoop ecosystem
  7. typedef 浅析
  8. 基于插件架构的简单的Winform框架(下)
  9. 透视前端工程化之 Webpack 基本介绍【文末有彩蛋~】
  10. 使用Sqlserver事务发布实现数据同步