数据倾斜
1,什么是数据倾斜
<代码>由于数据分布不均匀,造成数据大量的集中到一点,造成数据热点代码>
2,数据倾斜的现象
<代码>在执行任务的时候,任务进度长时间维持在99%左右,查看任务监控页面,发现只有少量(1个或几个)减少子任务未完成。因为其处理的数据量和其他减少差异过大。 单一减少的记录数与平均记录数差异过大,通常可能达到3倍甚至更多。最长时长远大于平均时长。代码>
3,数据倾斜的情况
4,数据倾斜的原因
<代码> 1),关键分布不均匀 2),业务数据本身的特性 3),建表时考虑不周 4),某些SQL语句本身就有数据倾斜代码>
5,数据倾斜的解决方案
5.1地图端聚合h5> <代码类=" sql语言">——地图端部分聚合,相当于合路器
hive.map。aggr=true;
——有数据倾斜的时候进行负载均衡
hive.groupby.skewindata=https://www.yisu.com/zixun/true;
——有数据倾斜的时候进行负载均衡,当选项设定为真的,生成的查询计划会有两个工作,第先生一个先生的工作中,地图的输出结果集合会随机分布到减少中,每个减少做部分聚合操作,并输出结果,这样处理的结果是相同的Group By主要有可能被分发到不同的减少中,从而达到负载均衡的目的,第二个先生工作再根据预处理的数据结果按照Group By关键分布到减少中(这个过程可以保证相同的Group By关键被分布到同一个减少中),最后完成最终的聚合操作。代码>
5.2 SQL语句调节
<李>
如何加入
<代码>关于驱动表的取,用连接键分布最均匀的表作为驱动表
做好列裁剪和过滤器操作,以达到两表做加入的时候,数据量相对变小的效果。代码>
李>
<李>
如何加入
大小表加入
<代码>使用地图加入让小的维度表(1000条以下的记录条数)先进内存。在地图端完成减少。代码>李> <李>
大表加入大表
<代码>把空值的关键变成一个字符串加上随机数,把倾斜的数据分到不同的减少上,由于零值关联不上,处理后并不影响最终结果。代码>李> <李>
计数明显大量相同特殊值
<代码>数不同的时,将值为空的情况单独处理,如果是计算数不同,可以不用处理,直接过滤,在最后结果中加1。如果还有其他计算,需要进行组,可以先将值为空的记录单独处理,再和其他计算结果进行联盟。代码>李> <李>
group by维度过小
<代码>采用sum()集团的方式来替换数(不同的)完成计算。代码>李> <李>
特殊情况特殊处理
<代码>在业务逻辑优化效果的不大情况下,一些时候是可以将倾斜的数据单独拿出来处理。最后联盟回去代码>李>
5.3典型的业务场景h5>
<李>
空值产生的数据倾斜
<李>场景李>
<代码>如日志中,常会有信息丢失的问题,比如日志中的user_id,如果取其中的user_id和用户表中的user_id关联,会碰到数据倾斜的问题。代码>
<李>解决办法李>
<代码类=" sql语言">——user_id为空的不参与关联
select * from日志
加入用户b
在一个。user_id不是零
和一个。user_id=b.user_id
union all
select * from日志
一个地方。user_id是零;
——赋与空值分新值的关键
select *
从日志
左外连接用户b
在当一个。然后user_id是null concat(“蜂巢”,兰德())其他。user_id结束=b.user_id;
代码>
李>
<李>
空值产生的数据倾斜
-
<李>场景李>
不同数据类型关联产生数据倾斜
-
<李>场景李>
<代码>用户表中user_id字段为int、日志表中user_id字段既有字符串类型也有int类型。当按照user_id进行两个表的连接操作时,默认的散列操作会按int型的id来进行分配,这样会导致所有字符串类型id的记录都分配到一个减速器中。代码>
-
<李>
解决办法
李> <李>把数字类型转换成字符串类型李