背景现象
- 数据倾斜的现象是,当提交运行一个程序时,这个程序的大多数的Task都已经运行结束了,只有某一个Task一直在运行,迟迟不能结束,导致整体的进度卡在99%或者100%,这时候就可以判定程序出现了数据倾斜的问题。
- 当你提交一个MR程序的时候,在yarn上发现程序运行时间过长,且迟迟没有结束,而且日志没有报错,这时候就可以判定是数据倾斜问题.
原因

- 数据本身就不平均
- 分区规则不科学
- 业务影响 造成数据短期高频波动
通用解决方案
- 1、有钱 有预警
增加物理资源 单独处理倾斜的数据 - 2、没钱 没有预警
倾斜数据打散 分步执行
先将倾斜数据打散成多干份
处理的结果再最终合并
在hive中的场景
首先倾斜一般发生在reduce阶段
-
场景一:group by 、count(distinct)
-- 解决方案
- map端预聚合
hive.map.aggr=true; map端预聚合.(治标)
原理 提前在map端预聚合一部分数据,减少shuffle数量和reduce阶段的执行时间,避免每个task数据过大导致倾斜.(万一数据不能预聚合或者聚合后仍然数据量较大)
- 随机分区
select * from table distribute by rand();(治标)
原理:通过distribute by rand()设置底层根据随机的key 进行分区分组等,通过随机函数 实现随机分区,避免数据倾斜.
- 数据倾斜时自动负载均衡(hive自带功能)
hive.groupby.skewindata=true;
原理:
a,开启该参数以后,当前程序会自动通过两个MapReduce来运行
b,第一个MapReduce自动进行随机分布到Reducer中,每个Reducer做部分聚合操作,输出结果.(相当于把大的数据打散)
c,第二个MapReduce将上一步聚合的结果再按照业务(group by key)进行处理,保证相同的分布到一起,最终聚合得到结果.
-
场景二:join
Hive默认启动Map join 优化
- join操作时,如果两张表比较大无法实现Map join,只能走Reduce join,当关联两表中某一字段的值过多时,仍会导致数据倾斜问题
- 倾斜是在reduce 阶段发生的,尽量不走reduce join ,优先使用Mapjoin(只要是join我就转换成Map join)
解决方案
1.提前过滤,将大数据转成小数据,实现map join , 适用于大表join小表
:将数据根据条件进行一部分筛选,筛选出的结果很可能就是小表
Mapjoin 原理:将小表数据 放在每个大表task任务的执行主机的内存当中
- 使用Bucket join 桶表join
原理:如果方案一筛选后仍是大表,就可以对表分桶, 实现Bucket map join 避免数据倾斜- 使用Skew join (外连接不生效)
Skew Join是Hive中一种专门为了避免数据倾斜而设计的特殊的Join过程
原理 数据量多的 走map join 数据量小的 继续reduce join
使用:
开启运行过程中skewjoin
set hive.optimize.skewjoin=true;
如果这个key的出现的次数超过这个范围
set hive.skewjoin.key=100000;
在编译时判断是否会产生数据倾斜
set hive.optimize.skewjoin.compiletime=true;
set hive.optimize.union.remove=true;
如果Hive的底层走的是MapReduce,必须开启这个属性,才能实现不合并
set mapreduce.input.fileinputformat.input.dir.recursive=true;
skew join原理:
image.png
1.当A表joinB表时产生了一部分数据量比较大的数据,[a-k1,b-k1],另一部分数据量正常[a-k,b-k2]的继续走rduce处理
2,Hive 将数据量比较大数据写到HDFS当中
3,单独运行一个MR程序来计算这部分数据这部分数据
4.hive再根据其他优化进行map端joun,产生结果,最终和其他结果进行合并合成一个最终结果
当前正在运行的hive任务已经数据倾斜,该如何处理?
如果是查询的语句列如(group, join)可以直接在yarn kill掉
如果是 insert ,,, select 就要权衡 等他跑完
结束后 对sql语句发生数据倾斜的地方进行定位、给出解决方案、测试、变更
如何提前预防数据倾斜
可以要对进行join 或者group by 的字段采样
列如 订单表1000w条数据 商品表100w条数据
a.pid = b.pid
select pid ,count(*) from tb_order group by pid;
查看一下订单表中 商品key的个数
列如商品1 900w条 那么这个数据一定会发生数据倾斜
TextFile、SequenceFile、RCfile 、ORCfile各有什么区别
textfile 文本文件 hdfs 默认存储
SequenceFile 二进制文件 使用二进制字节码存储 存储方式为行存储,其具有使用方便、可分割、
可压缩的特点
RCfile 、
ORCfile 列式存储
行式存储 方便插入 列式存储 方便查询
:相比TEXTFILE和SEQUENCEFILE,RCFILE由于列式存储方式,数据加载时性能消耗较大,但是具有较好
的压缩比和查询响应。
数据仓库的特点是一次写入、多次读取,因此,整体来看,RCFILE相比其余两种格式具有较明显的优势
网友评论