一、什么是数据倾斜及数据倾斜是如何产生的

数据倾斜的根本原因是数据的key分布不均,个别key数据很多,超出了计算节点的计算能力的结果;

过程:数据经过 map后,由于不同key 的数据量分布不均,在shuffle 阶段中通过 partition 将相同的 key 的数据打上发往同一个 reducer 的标记,然后开始 spill (溢写)写入磁盘,最后merge成最终map阶段输出文件。

如此一来 数据量很大的key 将发往同一个 reducer,超出了节点的计算能力,等待时间超出了可接受范围。

二、怎么判断数据有没有倾斜?

1、分析节点资源管理器,如果大部分节点已经执行完成,而个别节点长时间执行不完,很可能发生了数据倾斜;

2、分析执行日志,作业在reduce阶段停留在99%,很长时间完成不了,很可能发生了数据倾斜。

三、容易造成数据倾斜的原因

基本业务逻辑是造成数据倾斜的主要原因:

3.1、group by逻辑造成

3.2、distinct count(distinct xx)

3.3、小表join大表

3.4、大表join大表

四、解决方案

4.1、调优参数

set hive.map.aggr=true;

开启map端聚合,效率更高但需要更多的内存

set hive.groupby.skewindata=true;

开启group by数据倾斜时负载均衡,生成的查询计划会有两个MRJob。

第一个MRJob 中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的GroupBy Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;

第二个MRJob再根据预处理的数据结果按照GroupBy Key分布到Reduce中(这个过程可以保证相同的GroupBy Key被分布到同一个Reduce中),最后完成最终的聚合操作。

4.2、空值产生的数据倾斜

解决方法1:为空的不参与关联

select * from--先行过滤,减少读取的数据量(select * from dmf_dev.dmf_dev__mu_d01 where nvl(t1.id,'') <> '') t1Inner/left join dmf_dev.dmf_dev__mu_d02 t2on t1.id = t2.idunion allselect * from dmf_dev.dmf_dev__mu_d01 t1where nvl(t1.id,'') = ''

解决方法2 :空值随机赋值方式

select * from dmf_dev.dmf_dev__mu_d01 t1left join dmf_dev.dmf_dev__mu_d02 t2on case when nvl(t1.id) = '' then concat('hive',rand()) else t1.id end = t2.id

结论:方法2比方法1效率更好,不但io少了,而且作业数也少了。解决方法1中dev_01读取两次,jobs是2,解决方法2 job数是1 。

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

场景:两表关联键的数据类型不一致,一个是int,另外一个是string时,默认的Hash操作会按int型的id来进行分配,这样会导致所有string类型id的记录都分配到一个Reducer中。

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

select * from dmf_dev.dmf_dev__mu_d01 t1left join dmf_dev.dmf_dev__mu_d02 t2on cast(t1.id as string) = t2.id

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

set hive.auto.convert.join = true

如果是小表,自动选择map join:

hive.mapjoin.smalltable.filesize=25000000

调大小表的阈值,默认值是25mb

小表过大方案一

参数设置也无法实现mapjoin时,可以先行进行两表内关联结果当做小表,在进行mapjoin;

小表过大方案二

join倾斜, ⼤表join⼩表,但⼩表内存放不下 -> 侧视图(lateral view)⼩表扩容

SELECTimpr.*,grp.*FROM (SELECT-- 这⾥⽤rand将⼤表的数据打散CONCAT(group_id,'_',floor(rand()*20)) AS join_key,*FROM default.impression_stats_daily_by_hourlyWHERE date='{date}' AND hour='{hour}') imprJOIN (SELECTCONCAT(gid,'_',factor) AS join_key,*FROM (SELECT'0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20' AS number,gid,*FROM default.group_external_properties_hourlyWHERE date_hour='{date}_{hour}') extend lateral view explode(split(number, ',')) vt AS factor-- 这里列转行将小表扩容21倍) grpONimpr.join_key = grp.join_key -- ⽤⼩表扩容的形式保证⼤表数据被打散后还能join上

4.5、大表join的数据倾斜

Map输出key数量极少,导致reduce端退化为单机作业

考虑先对Join中的一个表去重,以此结果过滤无用信息,考虑先对Join中的一个表去重,以此结果过滤无用信息

Map输出key分布不均,少量key对应大量value,导致reduce端单机瓶颈。

总结

让map节点的输出数据更均匀的分布到reduce节点中去,是解决数据倾斜的最终目标。

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

  1. 数据倾斜的原因和解决方案

    数据倾斜的原因和解决方案 参考文章: (1)数据倾斜的原因和解决方案 (2)https://www.cnblogs.com/pengpenghuhu/p/12000199.html 备忘一下.

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

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

  3. Kafka中产生数据积压的原因以及解决方案

    Kafka中产生数据积压的原因以及解决方案 1.kafka中数据积压的原因 kafka作为消息队列,其中数据积压也是经常遇到的问题之一.我们都知道,数据积压的直接原因,一定是系统中的某个部分出现了性能 ...

  4. K/3 MRP运算数据不准的原因及解决方案

    系统MRP计算的结果不正确, 经过分析系统的数据,把MRP计算不正确原因整理如下:     1.系统中存在大量的生产任务单没有完全领料,但被结案,造成部份领料单窜单领料,最终引起已分配量不正确 2.系 ...

  5. 数据倾斜原因和解决方案

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

  6. 数据倾斜是什么以及造成的原因?

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

  7. auto errored after 报错解决_漫谈数据倾斜解决方案(干货)

    数据倾斜是大数据开发中经常会遇到的问题,而且基本是面试中的必问考点,本文是笔者根据搜集资料和阅读多篇博问的总结,全方位的从数据倾斜的定义.原因.解决方法.实例等角度进行解析.希望能帮助大家能对数据倾斜 ...

  8. join丢失数据_15、Hive数据倾斜与解决方案

    数据倾斜 1.什么是数据倾斜 由于数据分布不均匀,造成数据大量的集中到一点,造成数据热点 2.数据倾斜的现象 在执行任务的时候,任务进度长时间维持在99%左右,查看任务监控页面,发现只有少量(1个或几 ...

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

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

  10. 061 hive中的三种join与数据倾斜

    一:hive中的三种join 1.map join 应用场景:小表join大表 一:设置mapjoin的方式: )如果有一张表是小表,小表将自动执行map join. 默认是true. <pro ...

最新文章

  1. SAP QM 物料主数据检验类型上的Skips allowed
  2. 使用特异性特征提取网络辅助分类任务
  3. 用python画皮卡丘源代码-利用Python绘制萌萌哒的皮卡丘
  4. luoguP2657 [SCOI2009]windy数
  5. Salesforce - soql 多字段多值过滤查询思路
  6. 为什么现在那么多人都想做电商?
  7. Kubernetes 小白学习笔记(4)--kubernetes是什么
  8. 抖音网红怎么赚钱了?通过一百行代码批量下载抖音视频!找到窍门!
  9. 网站视频倍速播放和进度自定义调整
  10. 获取 pdf 中某个 关键字的位置
  11. 一个毕业生的年终总结
  12. Latex如何写参考文献及修改顺序
  13. linux内核编译详解
  14. 我是一个集技术和购物返利的机器人
  15. 吉西他滨纳米载药细胞膜囊泡|红细胞囊泡包载的纳米药物(齐岳试剂)
  16. MFC 窗口分割(Dlg 为例)
  17. java安装出现向导中断,在Macromedia Dreamweaver 8 完整安装之前向导已中断的解决办法...
  18. Leetcode刷题986. 区间列表的交集
  19. 文件is not found in the curren directory or on the Matlab path
  20. 网易服务器维护,网易15日未停服维护,所有服务器正常运行中

热门文章

  1. 【好奇心驱动力】APP每日打卡自动化测试
  2. 技术人员在客户现场工作注意事项
  3. 常数e怎么用计算机,自然常数e:原来是这么来的
  4. 网页前端设计之多选按钮
  5. OpenGL导入3DMax模型(.3DS)
  6. 100以内的的自然数对有多少?
  7. 老照片还原当年穿着潇洒雷锋(组图)
  8. Swiper的安装及使用
  9. 服务器及电脑主机系统安全加固操作手册
  10. 性别检测识别、年龄检测识别