蜂巢高级操作(优化,数据倾斜优化)

  

2019/2/21星期四

  

<强>蜂巢高级操作(优化,数据倾斜优化)

  

分区表/桶表应用,倾斜,map-join//见蜂巢的基本语法
行列转换

  

蜂巢优化
蜂巢优化思想
解释的使用
经典案例(不同的计数)

  

<强>数据倾斜的原因
操作:
关键词情形后果
1,加入其中一个表较小,但关键是集中分发到某一个或几个减少上的数据远高于平均值;
2,大表与大表,但是分桶的判断字段0值或空值过多这些空值都由一个减少处理,非常慢;
3,小组由集团维度过小,某值的数量过多处理某值的减少非常耗时
4,计算不同的某特殊值过多处理此特殊值的减少耗时。
<强>原因小结:
1),关键分布不均匀
2),业务数据本身的特性
3),建表时考虑不周
4),某些SQL语句本身就有数据倾斜

  

<强>表现:
任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)减少子任务未完成。因为其处理的数据量和其他减少差异过大。单一减少的记录数与平均记录数差异过大,通常可能达到3倍甚至更多。最长时长远大于平均时长。

  

<强>数据倾斜的解决方案
1,参数调节:
hive.map。aggr=true
地图端部分聚合,相当于合路器
hive.groupby.skewindata=https://www.yisu.com/zixun/true
有数据倾斜的时候进行负载均衡,当选项设定为真的,生成的查询计划会有两个工作,第先生一个先生的工作中,地图的输出结果集合会随机分布到减少中,每个减少做部分聚合操作,并输出结果,这样处理的结果是相同的Group By主要有可能被分发到不同的减少中,从而达到负载均衡的目的,第二个先生工作再根据预处理的数据结果按照Group By关键分布到减少中(这个过程可以保证相同的Group By关键被分布到同一个减少中),最后完成最终的聚合操作。
2, SQL语句调节:
如何加入:
关于驱动表的选取,选用连接键分布最均匀的表作为驱动表
做好列裁剪和过滤器操作,以达到两表做加入的时候,数据量相对变小的效果。
大小表加入:
使用地图加入让小的维度表(1000条以下的记录条数)先进内存。在地图端完成减少。
大表加入大表:
把空值的关键变成一个字符串加上随机数,把倾斜的数据分到不同的减少上,由于零值关联不上,处理后并不影响最终结果。
计数明显(不同)大量相同特殊值
数不同的时,将值为空的情况单独处理,如果是计算数不同,可以不用处理,直接过滤,在最后结果中加1。如果还有其他计算,需要进行组,可以先将值为空的记录单独处理,再和其他计算结果进行union.group由维度过小:采用sum()集团的方式来替换数(不同的)完成计算。
特殊情况特殊处理:
在业务逻辑优化效果的不大情况下,有些时候是可以将倾斜的数据单独拿出来处理。最后联盟回去。

  

<强>典型的业务场景//生产中遇到的问题解决方法总结
1,空值产生的数据倾斜
场景:如日志中,常会有信息丢失的问题,比如日志中的user_id,如果取其中的user_id和用户表中的user_id关联,会碰到数据倾斜的问题。
解决方法1:user_id为空的不参与关联(红色字体为修改后)
从日志加入用户选择 b上。user_id不是零和。user_id=b。user_idunion allselect 从日志中。

user_id是零;   

解决方法2:赋与空值分新的关键值
select *从日志左外连接用户b时。然后user_id是null concat(“蜂巢”,兰德())其他。user_id结束=b.user_id;

  

结论:方法2比方法1效率更好,不但io少了,而且作业数也少了。
解决方法:
1中日志读取两次,工作是2。解决方法2工作数是1。
这个优化适合无效id(比如-99年”,空等)产生的倾斜问题。把空值的关键变成一个字符串加上随机数,就能把倾斜的数据分到不同的减少上,解决数据倾斜问题。

  

2,不同数据类型关联产生数据倾斜
场景:用户表中user_id字段为int、日志表中user_id字段既有字符串类型也有int类型。当按照user_id进行两个表的连接操作时,默认的散列操作会按int型的id来进行分配,这样会导致所有字符串类型id的记录都分配到一个减速器中。
解决方法:把数字类型转换成字符串类型
select *从用户b在左外连接日志。usr_id=(b。user_id字符串)

  

3,小表不小不大,怎么用地图加入解决倾斜问题
使用地图加入解决小表(记录数少)关联大表的数据倾斜问题,这个方法使用的频率非常高,但如果小表很大,大到地图加入会出现错误或异常,这时就需要特别的处理。以下例子:

蜂巢高级操作(优化,数据倾斜优化)