项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

hive或者MR处理数据,不怕数据量大,就怕倾斜。hive里大表join的时候,数据倾斜就是个很头疼的问题。本博主就遇到了一个真实案例,特意记录下来,有需要的同学可以参考

1.查了5个小时还没结束的sql语句

set mapred.reduce.tasks = 30;
insert overwrite directory 'xxx'
select
cus.idA,cus.name,addr.bb from tableA as cus
join tableB as addr
on cus.idA = addr.idB

很简单的一个hql语句,优化的空间也不是很大(例子中的addr数据量比cus小,应该讲addr放在前面驱动join)。tableA的量级为亿级,tableB的量级为几百万级别。就这么一个简单的sql,尼玛从上午十点半开始跑,跑到下午三点半还没有跑完。实在受不了了,kill掉了。

2.初步分析

首先上个查询过程中的图

看到这种情况,稍微有点经验的同学第一反应肯定就是:卧槽,这尼玛肯定是数据倾斜了。没错,map早就完工了,reduce阶段一直卡在99%,而且cumulative cpu的时间还一直在增长,说明整个job还在后台跑着。这种情况下,99%的可能性就是数据发生了倾斜,整个查询任务都在等某个节点完成。。。

3.分析那部分数据产生了倾斜

问题既然已经定位了,那接下来就是需要解决问题了。正好不巧的是,集群这几天还出了一些状况。so,首先为了确认到底是集群本身的问题,还是代码的问题,先找了另外两个表,都是亿级数据。这两个表不存在数据倾斜的情况,join一把试了试,两分钟之内结果就出来了。万幸,说明这会集群已经没有问题了,还是查查数据跟代码吧。

代码本身很简单,那就沿着数据倾斜的方向查查吧。因为上面的两个表是根据id关联的,那如果倾斜的话,肯定就是id倾斜了哇。

set mapred.reduce.tasks = 5;
select idA,count(*) as num
from tableA
group by idA
distribute by idA
sort by num desc limit 10

结果为:

192928   5828529
2000000000496592833 2406289
18000   1706031
4000288 1386324
2000000003624295444 1201178
2000000001720892923 1029475
2000000002292880478 991299
2000000000736661289 881954
2000000000740899183 873487
2000000000575115116 803250

对于有上亿数据的一个表来说,这数据也算不上倾斜多厉害嘛。最多的一个key也就五百多万不到六百万。好吧,先不管了,再查一把另外一个表

set mapred.reduce.tasks = 5;
select idB,count(*) as num
from tableB
group by idB
distribute by idB
sort by num desc limit 10

结果也很快出来

192928   383412
18000   60318
617279581   23028
51010262    4643
4000286 3528
2000000000575115116 3218
1366173280  3012
4212339 2972
2000000002025620390 2704
2000000001312577574 2622

这数据倾斜,也不是特别严重嘛。

不过再把这两个结果一对比,尼玛恍然大悟。两个表里最多的一个key都是192928,一个出现了将近600万次,一个出现了将近40万次。这两个表再一join,尼玛这一个key就是600万40万的计算量。最要命的是,这计算量都分配给了一个节点。我数学不太好,600万40万是多少,跪求数学好的同学帮忙计算一下。不过根据经验来看的话,别说5个小时,再添个0也未必能算得完。。。

##4.如何解决
既然找到了数据倾斜的位置,那解决起来也就好办了。因为本博主的真正需求并不是真正要算两个表的笛卡尔积(估计实际中也极少有真正的需求算600万*40万数据的笛卡尔积。如果有,那画面太美我不敢看),所以最easy的解决方案,就是将这些key给过滤掉完事:

set mapred.reduce.tasks = 30;
insert overwrite directory 'xxx'
select
cus.idA,cus.name,addr.bb from tableA as cus
join tableB as addr
on cus.idA = addr.idB
where cus.idA not in (192928,2000000000496592833,18000,4000288,2000000003624295444,2000000001720892923,2000000002292880478,2000000000736661289,2000000000740899183,2000000000575115116,617279581,51010262,4000286,1366173280,2000000002025620390,2000000001312577574)

将此代码重新提交,5min时间,job跑完收工!

hive join 数据倾斜 真实案例相关推荐

  1. 【hive】数据倾斜-大表小表join优化mapjoin

    真正让你明白Hive调优系列3:笛卡尔乘积,小表join大表,Mapjoin等问题 0.Hive中的优化分类    真正想要掌握Hive的优化,要熟悉相关的MapReduce,Yarn,hdfs底层源 ...

  2. hive解决数据倾斜问题_八种解决 Spark 数据倾斜的方法

    有的时候,我们可能会遇到大数据计算中一个最棘手的问题--数据倾斜,此时Spark作业的性能会比期望差很多.数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的性能. 数 ...

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

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

  4. Hive之数据倾斜的原因和解决方法

    数据倾斜 在做Shuffle阶段的优化过程中,遇到了数据倾斜的问题,造成了对一些情况下优化效果不明显.主要是因为在Job完成后的所得到的Counters是整个Job的总和,优化是基于这些Counter ...

  5. hive大数据倾斜总结

    在做Shuffle阶段的优化过程中,遇到了数据倾斜的问题,造成了对一些情况下优化效果不明显.主要是因为在Job完成后的所得到的Counters是整个Job的总和,优化是基于这些Counters得出的平 ...

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

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

  7. hive 将null值替换为0_【Hive】数据倾斜

    仰望星空,脚踏实地❤️ 唯有匠心,不负光阴❤️ 其实我是个暖男 你说你有点咳嗽 我立马帮你联系了花圈殡仪馆丧葬一条龙 怎么样,喜欢我这个事事有着落的男孩子吗? ??? 这次讨论的话题是 数据倾斜 先养 ...

  8. Hive学习之路 (十九)Hive的数据倾斜

    1.什么是数据倾斜? 由于数据分布不均匀,造成数据大量的集中到一点,造成数据热点 2.Hadoop 框架的特性 A.不怕数据大,怕数据倾斜 B.Jobs 数比较多的作业运行效率相对比较低,如子查询比较 ...

  9. Hive中数据倾斜和小文件过多的解决方案

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

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

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

最新文章

  1. Redis的Pub/Sub模式
  2. Battlestation Operational HDU 6134
  3. linux oracle 安装_Linux下python连接oracle(cx_Oracle模块)
  4. android广告页白屏_Android 启动页面与广告页面的实现-Go语言中文社区
  5. Docker和容器简介
  6. Android -- 开机启动无界面后台程序
  7. 中国卡曼涡气流传感器行业市场供需与战略研究报告
  8. c#自带压缩类实现数据库表导出到CSV压缩文件的方法
  9. Linux运维系统工程师与java基础学习系列-1
  10. Metasploit中meterpreter里cmd乱码解决办法
  11. python导入Wordcloud包
  12. 应用宝 android 平板,应用宝HD2.0个性化推荐最优安卓平板软件
  13. 树莓派与win10主机传输文件方式(未完,占坑)
  14. 【优化充电】基于matlab遗传算法求解电动汽车充电统一管理优化问题(含负荷功率曲线对比图及充电计划)【含Matlab源码 2300期】
  15. 如何利用Qt 3D 渲染与 Qt Quick 2D 元素结合创建太阳系行星元素?
  16. 支持向量机基本原理与思想
  17. 皮卡堂什么维修服务器,皮卡堂充值帮助指南
  18. Diffusion Model原理详解及源码解析
  19. 用python定义两个元组_python学习笔记2---python中表示“组”的概念与定义
  20. Matlab 数字数组转换成集中字符串

热门文章

  1. Python 常用函数Logging
  2. 白帽子也能迎娶白富美:2017八大高薪信息安全认证
  3. sharepoint 2007 无法自动跳转到default.aspx
  4. 分享一个多功能SVN备份脚本
  5. [Misc]IE浏览器真正全屏幕操作技巧
  6. 漂亮女生应聘华为的真实过程
  7. 解决Spark集群无法停止
  8. onclick与addEventListener的区别
  9. Pig-0.13.0的编译
  10. 溜达列表的鼠标HOVER变色