在做Shuffle阶段的优化过程中,遇到了数据倾斜的问题,造成了对一些情况下优化效果不明显。主要是因为在Job完成后的所得到的Counters是整个Job的总和,优化是基于这些Counters得出的平均值,而由于数据倾斜的原因造成map处理数据量的差异过大,使得这些平均值能代表的价值降低。Hive的执行是分阶段的,map处理数据量的差异取决于上一个stage的reduce输出,所以如何将数据均匀的分配到各个reduce中,就是解决数据倾斜的根本所在。规避错误来更好的运行比解决错误更高效。在查看了一些资料后,总结如下。

1数据倾斜的原因

1.1操作:

关键词

情形

后果

Join

其中一个表较小,

但是key集中

分发到某一个或几个Reduce上的数据远高于平均值

大表与大表,但是分桶的判断字段0值或空值过多

这些空值都由一个reduce处理,灰常慢

group by

group by 维度过小,

某值的数量过多

处理某值的reduce灰常耗时

Count Distinct

某特殊值过多

处理此特殊值的reduce耗时

1.2原因:

1)、key分布不均匀

2)、业务数据本身的特性

3)、建表时考虑不周

4)、某些SQL语句本身就有数据倾斜

1.3表现:

任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成。因为其处理的数据量和其他reduce差异过大。

单一reduce的记录数与平均记录数差异过大,通常可能达到3倍甚至更多。 最长时长远大于平均时长。

2数据倾斜的解决方案

2.1参数调节:

hive.map.aggr=true

Map 端部分聚合,相当于Combiner

hive.groupby.skewindata=true

有数据倾斜的时候进行负载均衡,当选项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果集合会随机分布到 Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的 Group By Key 有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照 Group By Key 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个 Reduce 中),最后完成最终的聚合操作。

2.2 SQL语句调节:

如何Join:

关于驱动表的选取,选用join key分布最均匀的表作为驱动表

做好列裁剪和filter操作,以达到两表做join的时候,数据量相对变小的效果。

大小表Join:

使用map join让小的维度表(1000条以下的记录条数) 先进内存。在map端完成reduce.

大表Join大表:

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

count distinct大量相同特殊值

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

group by维度过小:

采用sum() group by的方式来替换count(distinct)完成计算。

特殊情况特殊处理:

在业务逻辑优化效果的不大情况下,有些时候是可以将倾斜的数据单独拿出来处理。最后union回去。

3典型的业务场景

3.1空值产生的数据倾斜

场景:如日志中,常会有信息丢失的问题,比如日志中的 user_id,如果取其中的 user_id 和 用户表中的user_id 关联,会碰到数据倾斜的问题。

解决方法1: user_id为空的不参与关联(红色字体为修改后)

select * from log ajoin users bon a.user_id is not nulland a.user_id = b.user_id
union all
select * from log awhere a.user_id is null;

解决方法2 :赋与空值分新的key值

select *from log aleft outer join users bon case when a.user_id is null then concat(‘hive’,rand() ) else a.user_id end = b.user_id;

结论:方法2比方法1效率更好,不但io少了,而且作业数也少了。解决方法1中 log读取两次,jobs是2。解决方法2 job数是1 。这个优化适合无效 id (比如 -99 , ’’, null 等) 产生的倾斜问题。把空值的 key 变成一个字符串加上随机数,就能把倾斜的数据分到不同的reduce上 ,解决数据倾斜问题。

3.2不同数据类型关联产生数据倾斜

场景:用户表中user_id字段为int,log表中user_id字段既有string类型也有int类型。当按照user_id进行两个表的Join操作时,默认的Hash操作会按int型的id来进行分配,这样会导致所有string类型id的记录都分配到一个Reducer中。

解决方法:把数字类型转换成字符串类型

select * from users aleft outer join logs bon a.usr_id = cast(b.user_id as string)

3.3小表不小不大,怎么用 map join 解决倾斜问题

使用 map join 解决小表(记录数少)关联大表的数据倾斜问题,这个方法使用的频率非常高,但如果小表很大,大到map join会出现bug或异常,这时就需要特别的处理。 以下例子:

select * from log aleft outer join users bon a.user_id = b.user_id;

users 表有 600w+ 的记录,把 users 分发到所有的 map 上也是个不小的开销,而且 map join 不支持这么大的小表。如果用普通的 join,又会碰到数据倾斜的问题。

解决方法:

select /*+mapjoin(x)*/* from log aleft outer join (select  /*+mapjoin(c)*/d.*from ( select distinct user_id from log ) cjoin users don c.user_id = d.user_id) xon a.user_id = b.user_id;

假如,log里user_id有上百万个,这就又回到原来map join问题。所幸,每日的会员uv不会太多,有交易的会员不会太多,有点击的会员不会太多,有佣金的会员不会太多等等。所以这个方法能解决很多场景下的数据倾斜问题。

4总结

使map的输出数据更均匀的分布到reduce中去,是我们的最终目标。由于Hash算法的局限性,按key Hash会或多或少的造成数据倾斜。大量经验表明数据倾斜的原因是人为的建表疏忽或业务逻辑可以规避的。在此给出较为通用的步骤:

1、采样log表,哪些user_id比较倾斜,得到一个结果表tmp1。由于对计算框架来说,所有的数据过来,他都是不知道数据分布情况的,所以采样是并不可少的。

2、数据的分布符合社会学统计规则,贫富不均。倾斜的key不会太多,就像一个社会的富人不多,奇特的人不多一样。所以tmp1记录数会很少。把tmp1和users做map join生成tmp2,把tmp2读到distribute file cache。这是一个map过程。

3、map读入users和log,假如记录来自log,则检查user_id是否在tmp2里,如果是,输出到本地文件a,否则生成<user_id,value>的key,value对,假如记录来自member,生成<user_id,value>的key,value对,进入reduce阶段。

4、最终把a文件,把Stage3 reduce阶段输出的文件合并起写到hdfs。

如果确认业务需要这样倾斜的逻辑,考虑以下的优化方案:

1、对于join,在判断小表不大于1G的情况下,使用map join

2、对于group by或distinct,设定 hive.groupby.skewindata=true

3、尽量使用上述的SQL语句调节进行优化

转自 http://www.tbdata.org/archives/2109

  •                     <li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#csdnc-thumbsup"></use></svg><span class="name">点赞</span><span class="count">6</span></a></li><li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{&quot;mod&quot;:&quot;popu_824&quot;}"><svg class="icon" aria-hidden="true"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-csdnc-Collection-G"></use></svg><span class="name">收藏</span></a></li><li class="tool-item tool-active is-share"><a href="javascript:;" data-report-click="{&quot;mod&quot;:&quot;1582594662_002&quot;}"><svg class="icon" aria-hidden="true"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-csdnc-fenxiang"></use></svg>分享</a></li><!--打赏开始--><!--打赏结束--><li class="tool-item tool-more"><a><svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg></a><ul class="more-box"><li class="item"><a class="article-report">文章举报</a></li></ul></li></ul></div></div><div class="person-messagebox"><div class="left-message"><a href="https://blog.csdn.net/wyz0516071128"><img src="https://profile.csdnimg.cn/D/9/2/3_wyz0516071128" class="avatar_pic" username="wyz0516071128"><img src="https://g.csdnimg.cn/static/user-reg-year/1x/2.png" class="user-years"></a></div><div class="middle-message"><div class="title"><span class="tit"><a href="https://blog.csdn.net/wyz0516071128" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}" target="_blank">奔跑的小鲫鱼</a></span></div><div class="text"><span>发布了92 篇原创文章</span> · <span>获赞 396</span> · <span>访问量 22万+</span></div></div><div class="right-message"><a href="https://im.csdn.net/im/main.html?userName=wyz0516071128" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-letter">私信</a><a class="btn btn-sm  bt-button personal-watch attented" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}">已关注</a></div></div></div>
    </article>
    


http://www.taodudu.cc/news/show-6768052.html

相关文章:

  • 人工智能---梯度下降的原理和手写实现
  • 为什么说人机融合智能就是强人工智能?
  • 对于数据倾斜的思考
  • 解决数据倾斜
  • 干货!AI与自动驾驶─人工智能有可能实现人类智能的挑战性任务吗
  • 笔记,人工智能,梯度下降法
  • 【人工智能】从梯度下降算法到人工神经网络
  • 关于数据倾斜
  • 非人工智能方向粗糙理解深度学习
  • Vue3通透教程【十四】TS复杂类型详解(一)
  • easypoi导入复杂表头Excel
  • 复杂的数据类型(数组,指针)
  • 如何写复杂的SQL
  • 周易六十四卦——观卦
  • 微信小程序 - 判断一个经纬度是否在一个多边形区域内
  • 微信小程序map改变角的弧度
  • 微信公众号获取用户当前经纬度
  • JAVA判断一个地理坐标是否在一个多边形区域内和是否在一个圆形区域内(经纬度)
  • 微信JSSDK获取用户地理位置(经纬度)
  • (转)微信获取到的经纬度坐标不精准的问题
  • 02深度解析Spring Cloud Ribbon---LoadBalancerAutoConfiguration拦截器注入
  • 2019 ICPC 上海 M Blood Pressure Game [血压游戏] 出题人原封不动标程
  • linux 下ntp服务器,Linux下NTP服务器搭建(示例代码)
  • Spring源码解析之-- 事务TransactionInterceptor 分析(开启事务)
  • (MacOS)来做一个简单带有音乐提醒的python倒计时器吧~
  • python视频转字符动画_Python 视频转字符动画 - 进阶
  • unity 一个UI和模型的需求,要求模型位于两个ui之间
  • 6. Unity3d Lua框架 - xLua - UIManager UI管理系统:提供UI操作、UI层级、UI消息、UI资源加载、UI调度、UI缓存等管理
  • Unity程序开发框架——UI管理模块
  • Unity实现模型显示在UI前面

数据倾斜原因和解决方案相关推荐

  1. 数据倾斜原理及解决方案

    导读 相信很多接触MapReduce的朋友对'数据倾斜'这四个字并不陌生,那么究竟什么是数据倾斜?又该怎样解决这种该死的情况呢? 何为数据倾斜? 在弄清什么是数据倾斜之前,我想让大家看看数据分布的概念 ...

  2. Spark之数据倾斜 --采样分而治之解决方案

    1 采样算法解决数据倾斜的思想 2 采样算法在spark数据倾斜中的具体操作 转载于:https://www.cnblogs.com/itboys/p/9801507.html

  3. 大数据常见问题:数据倾斜

    offer收割系列介绍: 1.分享桥哥本人或小伙伴在面试大厂时遇到的真题,并给出参考答案!!如果能帮到大家,点赞.收藏.评论是对我最大的支持!! 2.涉及岗位:主要为大数据开发.数据仓库(桥哥干过的) ...

  4. 大数据之数据倾斜剖析

    1.1 绪论 数据倾斜是大数据领域绕不开的拦路虎,当你所需处理的数据量到达了上亿甚至是千亿条的时候,数据倾斜将是横在你面前一道巨大的坎. 迈的过去,将会海阔天空!迈不过去,就要做好准备:很可能有几周甚 ...

  5. 大表与大表join数据倾斜_技术分享|大数据技术初探之Spark数据倾斜调优

    侯亚南 数据技术处 支宸啸 数据技术处 在大数据计算中,我们可能会遇到一个很棘手的问题--数据倾斜,此时spark任务的性能会比预期要差很多:绝大多数task都很快执行完成,但个别task执行极慢或者 ...

  6. Spark 之 解决数据倾斜(一)

    介绍 Spark中的数据倾斜问题主要指shuffle过程中出现的数据倾斜问题,是由于不同的key对应的数据量不同导致的不同task所处理的数据量不同的问题. 例如,reduce点一共要处理100万条数 ...

  7. thinkphp 随机取10条数据_spark调优-数据倾斜

    1.数据倾斜发生时的现象 绝大多数task执行得都非常快,但个别task执行极慢.比如,总共有1000个task,997个task都在1分钟之内执行完了,但是剩余两三个task却要一两个小时.这种情况 ...

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

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

  9. Hive 数据倾斜hive.optimize.skewjoin

    数据倾斜原因 通常发生在join过程中,两个表都较大,不能支持map join,其中一个表中数据量某一类值特别多,分配到该值的reducer,耗时较长 模拟数据 Fact 表,列code_id,cod ...

最新文章

  1. switch...case结构
  2. 一天之内用SDN能做出什么
  3. Docker-Compose简介与Ubuntu Server 上安装Compose
  4. Books Queries(codeforces 1066)
  5. strocli64 源码_storcli 简易使用介绍
  6. OSPF——STUB区域及完全STUB区域详解
  7. 中秋节PSD分层模板|电商营销借势促销,快快收藏!
  8. 【转】【异常处理】Incorrect string value: ‘\xF0\x90\x8D\x83...‘ for column... Emoji表情字符过滤的Java实现
  9. 用gitee搭建自己的博客网站
  10. UFS Clk Gate介绍
  11. LTE附着流程详解-UECapabilityInformation
  12. python 使用图形化界面tkinter显示图片 规定大小!
  13. 大数据工程师需要学习哪些技术?
  14. amp模式_AMP的完整形式是什么?
  15. 直播回顾丨一堂课快速上手EdgeX
  16. .NET 中的 Encoding 编码
  17. 随机变量不相关却不一定独立
  18. 那些不用写代码也能做游戏的工具
  19. 计算机系统第五章答案,计算机系统概论第五章测验及答案.doc
  20. Java实现随机密码生成

热门文章

  1. Nodejs基础之consolidate
  2. 移动端真机测试,挺实用的。
  3. IE浏览器打印合格证相关问题
  4. 如何测量芯片电源的上电时序
  5. wp门户新闻主题下载免授权自适应大门户WordPress主题
  6. LOL - 英雄联盟 (2011年腾讯运营的电子竞技类游戏)
  7. ue怎么转换html格式,如何在UltraEdit中预览HTML代码?
  8. OpenCv通过RTSP预览大华摄像机视频
  9. qt开发常用的论坛,博客
  10. 知识梳理,HTML5智能表单