大数据 -- 数据倾斜
离线计算的数据倾斜问题
数据倾斜就是指我们在计算数据的时候,数据的分散度不够,导致大量的数据集中到一台或者几台机器上,这些数据的计算速度远远低于平均计算速度,导致整个计算过程很慢。
Hadoop中的数据倾斜主要表现在任务在Reducer阶段会长时间停留在大概99%处不能结束。这时如果仔细查看日志就会发现有一个或者多个reducer执行过程报oom错误或者container加载失败,这时基本可以判断本次离线计算任务的输入数据可能存在数据倾斜问题。
导致数据倾斜的原因可能有很多种,常见的原因如下
某些sql语句本身有问题。比如sql种含有distinct的计算。
Key分布不均匀。比如在两张表join过程中,其中一张表的key分布不均匀。
业务数据本身有问题。比如业务数据join的id分布不均匀,或者id为null指的比重较大,都会引起数据倾斜。
建表时考虑不周。比如同为type字段,其中一张表类型为int,另外一张表类型为string。
列举了一些常用的导致数据倾斜的场景
场景1:当一个大表和一个小表join时,如果小表的key比较集中,将会引起大表中的数据被分发到一个或者少数几个reducer任务中,导致数据分布不均匀。
场景2:在group by时,如果分组的维度太小,维度的值分布不均匀,将导致数据分布不均匀。
场景3:当大表与大表关联时,在关联的条件字段中,其中一个表的空值、null值过多,将导致数据分布不均匀。
解决方案
1. 调整参数
可以通过修改hive.map.aggr和hive.groupby.skewindata参数同时配置为true,在mapper端进行聚合操作,当发生数据倾斜时进行负载均衡。所发生成的查询计划会有两个MR任务。在第一个MR任务中,Mapper阶段的输出结果集合会被随机分布到Reducer阶段中,每个Reducer都会进行部分聚合操作,并输出结果。这样处理的结果是相同的key可以被分发到不同的reducer中,从而达到负载均衡的目的。在第二个MR任务中,Mapper根据第一个MR任务预处理后的数据结果再按照key输出给reducer,这个过程可以保证相同的key被分布到同一个reducer中。经过这两轮MR任务最后完成最终的聚合操作。相关的参数设置如下
hive.map.aggr=true
hive.groupby.skewindata=true
2. 优化sql语句
使用mapjoin:让小的维度表(建议在20000条记录以下)先写入内存,并按照顺序扫描大表完成join。这种方式比较使用于大表和小表的join。
空值优化:可以将空值的key变成一个字符串加上随机数,把倾斜的数据分布到不同的Reducer中,也可以对空值进行单独处理,然后再和其他非空值的计算结果进行合并。
group by优化:采用sum()结合group by的方式替换count(distinct)来完成计算。
3. 特殊情况特殊处理
在业务逻辑优化效果不太友好的情况下,有些时候可以将倾斜的数据单独拿出来处理,最后在union,为了方便理解,下面列举几个业务场景来进行说明。
案例1:空值产生的数据倾斜问题
场景:比如在日志中,通常会发生信息丢失的问题。假如日志中的order_id存在丢失情况,如果将其中的order_id和订单表的order_id关联,就会出现数据倾斜。
解决方法1:order_id为空值的则不参与关联,用union all 合并数据,如代码所示。
select * from log a join orders b
on a.order_id = b.order_idand a.order_id is not null
union all
select * from log awhere a.order_id is null;
解决方法2:为空值分配一个随机值,如代码所示。
select *from log aleft outer join orders bon case when a.order_id is null then cast(rand()*10000 as bigint) else a.order_id end
= b.order_id;
总结:解决方法2比方法1的执行效率更高,不但I/O少了,而且作业数也少了,在解决方法1中log读取两次,job数是2;在解决方法2中job数是1。这种优化适合由于无效id(比如-99、’’、null等无效字符组合)产生的倾斜问题。把空值的key变成一个字符串加上随机数,就能把倾斜的数据分布在不同的Reducer中,从而解决数据倾斜问题。
关河令·秋阴时晴渐向暝
【作者】周邦彦 【朝代】宋
秋阴时晴渐向暝,变一庭凄冷。伫听寒声,云深无雁影。
更深人去寂静,但照壁孤灯相映。酒已都醒,如何消夜永!
大数据 -- 数据倾斜相关推荐
- 【Spark调优】小表join大表数据倾斜解决方案
[Spark调优]小表join大表数据倾斜解决方案 参考文章: (1)[Spark调优]小表join大表数据倾斜解决方案 (2)https://www.cnblogs.com/wwcom123/p/1 ...
- 《数据科学与大数据分析——数据的发现 分析 可视化与表示》一2.3 第2阶段:数据准备...
本节书摘来自异步社区<数据科学与大数据分析--数据的发现 分析 可视化与表示>一书中的第2章,第2.3节,作者[美]EMC Education Services(EMC教育服务团队),更多 ...
- 大数据的两面性_大数据,多大的数据才是大数据?
大数据的本质是统计学,是通过统计分析得出最终结果.比如我们经常会使用到的图像识别,为什么手机能识别出来那些可能你也不知道的东西,因为那是建立在海量数据资料的基础之上的.就连如今人人都会用到的手机美颜也 ...
- 阿里飞天大数据飞天AI平台“双生”系统正式发布,9大全新数据产品集中亮相
作者 | 夕颜 责编 | 唐小引 出品 | AI科技大本营(ID:rgznai100) 如今,大数据和 AI 已经成为两个分不开的词汇,没有大数据,AI 就失去了根基:没有 AI,数据不会呈现爆发式的 ...
- R语言ggplot2可视化使用不连续的y轴、中断的Y轴来可视化数值分布差异很大的数据实战:把数据轴分为两个区间或者多个区间来匹配不同区间数据的可视化(因为有的数据可能10附近,有的数值可能1W附近)
R语言ggplot2可视化使用不连续的y轴.中断的Y轴来可视化数值分布差异很大的数据实战:把数据轴分为两个区间或者多个区间来匹配不同区间数据的可视化(因为有的数据可能10附近,有的数值可能1W附近) ...
- Gartner预测2019年十大「数据和分析技术」趋势:增强型分析成为重要卖点
来源:机器之能 摘要:处于数据和分析位置的领导人必须审视这些趋势对业务带来的潜在影响,并相应调整业务模式和运营,否则就有可能失去竞争优势.增强型数据分析,增强型数据管理,持续型智能,可解释的 AI,数 ...
- 一次Binder通信最大可以传输多大的数据?
本系列: Android-Binder进程间通讯机制-多图详解 一次Binder通信最大可以传输多大的数据? 关于Binder (AIDL)的 oneway 机制 前言 在第六章中,我通 ...
- MySQL-在线处理大表数据 在线修改大表的表结构
文章目录 生猛干货 官方文档 概述 示例 大表数据的分批处理 修改大表的表结构 方案一 : 从表修改,主从切换 方案二: pt-online-schema-change 搞定MySQL 生猛干货 带你 ...
- AI自动标注神器!支持多通道、大尺幅数据
深度学习大法固然好,但算法训练需要标注大量数据,不论是时间还是金钱成本都让很多从业的小伙伴们头疼不已.矩形框标注还相对简单,遇到像素级别的分割标注,工作量又是成倍增加,小编不禁想:要是能有自动标注的工 ...
- [ js ] 可否用多线程的思路,解决大数量数据的性能问题?
js中也是有线程概念的,setTimeout,setInterval和ajax都是这样的例子,另起一个线程,时间上似乎是并行处理的.于是,我想是不是可以利用这个多线程的机制,优化一下大数量数据遍历时的 ...
最新文章
- Confluence 6 配置服务器基础地址
- GitHub超4.1万星,最全Python入门算法来了
- 百度的智能办公平台来了!12岁百度Hi今天全面升级,让协作「如流」
- kubernetes一次生产故障日记
- DNS扫盲系列之五:域名配置ZONE文件
- Java connot reduce_Java8: Reduce方法
- nodejs匿名函数
- 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 12丨游戏玩法分析 V【难度困难】
- 附上一张公司项目解决方案的工程图
- 电商管理后台 API 接口文档
- iis新建一个html文件路径,C#使用DirectoryEntry操作IIS创建网站和虚拟路径
- Camera 360使用之坑
- 定点补码加减法运算_定点加减法运算与溢出判断处理
- G盘格式化了,要怎样恢复文件
- linux版高德导航软件下载,高德导航下载2021年最新版本_高德导航2021手机版下载-太平洋下载中心...
- win7进程中的svchost.exe占用CPU和内存很高的原因和解决窍门
- 大数据的关键技术(一)
- 方法论--面对问题,提出问题,解决问题
- Error creating bean with name ‘configurationPropertiesBeans‘ defined in class path resource异常分析
- 使用Xunit进行单元测试