16日,蜂巢数据倾斜与解决方案

  

数据倾斜

  

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的记录都分配到一个减速器中。