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

症状:

1,对表做select count(1) from tb group by key,看表中是否有大量相同的key。

2,查看监控界面,任务进度长时间维持在99%(或100%),只有少量(1个或几个)reduce子任务未完成或某几个reduce子任务是平均reduce时长的n倍;

上图的其中的一个job的reduce时间远远超出其他reduce时长,表明该reduce处理的数据远超出其他的reduce,可见此次统计发生数据倾斜。

解决方案

参数调优:

1,set hive.groupby.skewindata=true:这个参数的意思是做Reduce操作的时候,拿到的key并不是所有相同值给同一个Reduce,而是随机分发,然后Reduce做聚合,做完之后再做一轮MR,拿前面聚合过的数据再算结果。所以这个参数其实跟Hive.Map.aggr做的是类似的事情,只是拿到Reduce端来做,而且要额外启动一轮Job,所以其实不怎么推荐用,效果不明显。

2,set hive.skewjoin.key=100000:这个是join的键对应的记录条数超过这个值则会进行优化。

3,set mapred.reduce.tasks=500:增加Reducer个数,通常数据(KV数值对)Shuffle到某个Reducer是根据Key进行Hash然后对Reducer个数进行取模。

HQL语句优化:

1,小表join大表:

将小表放在join左边,减少oom的几率;

使用mapjoin,小表数据最好在1000条以内。select /*+mapjoin(a)*/ count(1) from tb_a a left outer join tb_b b on a.uid=b.uid;

2,大表join大表:

把空值的key变成一个字符串加上随机数,把倾斜的数据分到不同的reduce上,由于null值关联不上,处理后并不影响最终结果。

select * from tb_a a left outer join tb_b b on (case when a.userid is null then concact('xxx', rand()) else a.userid end = b.userid);

3,不同数据类型关联产生数据倾斜,在join之前先转换数据类型:

select * from users a left outer join logs b on a.usr_id = cast(b.user_id as string);

4,count distinct优化

采用sum() group by的方式来替换count(distinct )进行计算

原语句:select a, count(distinct b) as c from tbl group by a;

改写后:select a, count(*) as c from (select distinct a, b from tbl) group by a;

另外,count distinct时,将值为空的情况单独处理,如果是计算count distinct,可以不用处理,直接过滤,在最后结果中加1。如果还有其他计算,需要进行group by,可以先将值为空的记录单独处理,再和其他计算结果进行union。

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

  1. oracle查询表字段横向排序,sql 查询 - 横着走的螃蟹 - OSCHINA - 中文开源技术交流社区...

    查询原则:列看成变量,where后面看成表达式 1.常用函数: max求最大,select max(shop_price) from goods; min求最小 sum求总和,select sum(g ...

  2. mysql i优化_mysql优化 - ifeixiang的个人页面 - OSCHINA - 中文开源技术交流社区

    下面是一部分比较重要的建议: 1.选择正确的存储引擎 以 MySQL为例,包括有两个存储引擎 MyISAM 和 InnoDB,每个引擎都有利有弊. MyISAM 适合于一些需要大量查询的应用,但其对于 ...

  3. mysql消除冗余关键字_优化mysql语句 - 可爱的wzz的个人空间 - OSCHINA - 中文开源技术交流社区...

    1.查询SQL尽量不要使用select *,而是select具体字段. 反例子: select * from employee; 正例子: select id,name from employee; ...

  4. mysql数据无故回档_数据库回档解决方案 - osc_hajrc28s的个人空间 - OSCHINA - 中文开源技术交流社区...

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者介绍:李明,腾讯云数据库架构师华南区负责人,曾在某专业数据库服务商.51job任职DBA. 作为一名DBA,日常工作中免不了需要做一些救 ...

  5. JAVA调用数据泵,数据泵导出和导入 - lsj_syy的个人空间 - OSCHINA - 中文开源技术交流社区...

    Oracle 数据泵(IMPDP/EXPDP)导入导出总结 Oracle数据泵导入导出是日常工作中常用的基本技术之一,它相对传统的逻辑导入导出要高效,这种特性更适合数据库对象数量巨大的情形,因为我日常 ...

  6. csnd ftp服务器端java_数据包取证总结 - osc_r6zeu2c7的个人空间 - OSCHINA - 中文开源技术交流社区...

    数据包取证总结 1. 先观察题目,如果题目有明确指示某端口,或某协议.然后根据提示的端口和协议构造过滤表达式,否则话一般都是考http协议的那种 (wireshark打开数据包后,使用了过滤表达式后先 ...

  7. oracle临时表与外部表,临时表,外部表 - wzl_up的个人空间 - OSCHINA - 中文开源技术交流社区...

    1    临时表 1.1 居于事物的临时表 create global temporary table table_name (column datatype) on commit delete ro ...

  8. mysql的where在hive的语法,hive常用语法示例 - charming丶的个人空间 - OSCHINA - 中文开源技术交流社区...

    1. 建表语句 create table page_view( viewTime INT, userId BIGINT, pageUrl STRING, refererUrl STRING, ip S ...

  9. mysql+优化器+软解析_MySQL执行计划 - osc_93u9qofu的个人空间 - OSCHINA - 中文开源技术交流社区...

    执行计划,SQL语句过来,会先解析,词法解析,语法解析,之后生成执行计划,计划上会算出使用全盘扫秒还是依靠索引, mysql不缓冲执行计划,oracle有 体系结构 1.优化器--->执行计划 ...

最新文章

  1. java中哈夫曼编码所用的函数_数据结构(java语言描述)哈夫曼编码
  2. 剑指offer:矩形覆盖 python 实现
  3. 如何让history命令显示带时间
  4. php 去除中英文空格,php去除字符串首尾中英文空格程序_PHP教程
  5. 深度优先遍历算法-01小偷偷东西问题
  6. java 获取mysql链接_Java中如何获取mysql连接的3种方法总结
  7. Python logging模块切分和轮转日志
  8. vue怎么实现右键二级菜单_vue中如何自定义右键菜单详解
  9. 规划和实施Exchange 2013备份
  10. iOS内存管理部分内容
  11. java中的Date类,DataFormat类及Calendar类的使用详解
  12. AspUpload实时上传进度的AJAX方法
  13. Quartus-II入门(全加器)
  14. 吸入糖皮质激素行业调研报告 - 市场现状分析与发展前景预测
  15. 再说System Verilog 与 Verilog 的关系
  16. 全球上线!ABB中国涡轮增压器分拆 – 数据清理阶段完成
  17. 降龙十八掌-程序员篇
  18. 刷题记录:牛客NC16122郊区春游
  19. r语言和python的区别-Python和R语言之分析对比
  20. 网易互动直播2.0 开发 十二 视频设备管理

热门文章

  1. 本月 Windows Mobile 文章推荐
  2. matlab 处理dat文件画图,matlab_DAT_processing matlab处理dat文件并进行绘图 - 下载 - 搜珍网...
  3. c 向html页面传值,html页面之间的传值,获取元素和方法的调用
  4. 荣新linux培训,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  5. jq匹配偶数行_jquery怎么实现奇偶行不同背景颜色?
  6. java jespa_Jespa实际运用的一点心得
  7. Hi3520D UART2和UART3是如何加载到内核的
  8. 让事件飞——Linux eventfd 原理
  9. Hi3515的开发板 Hi3515 SDK编译出错 提示缺少libpciv.a的解决办法
  10. windows延缓写入失败相关问题解决办法