数据倾斜知识小结

  1. 原因: 大部分是因key分布不均匀,也有map端或reduce端倾斜或因数据本身特征问题,只要涉及key的操作都可能出现倾斜。 
  2. 容易出现的情况:a.group by不搭配聚合函数使用  b.count(distinct)数据量大时,因为此操作是根据group by分组按distinct字段排序的  c.小表关联大表的join操作
  3. 解析:大数据里的数据一般都是map类型,key-value形式的,拿到hive来说,一般就是关联条件为key,其它字段为value,groupby后的字段就是key
  4. 表现:其他key执行完了,一个key一直未执行完,reducer的数据分布不均匀,有一个或少数reduce未完成,进度一直卡在99%(比如0-10,有11个key,0的数据量有100w记录,而其它它10个key只有100条记录。分到11个节点去执行,负责0那个key的节点就会执行很慢很慢)
  5. 大部分倾斜的key 都是0 或者null(这两个值是比较常见的,默认值经常给0。不给的情况下就是null)
  6. 举例:比如好多人参加微信小程序,给别人投票,大部分人的微信都打开了定位功能,这时候就能获取到你所在的城市,但有些人把权限控制了,不允许微信使用定位,这时候就获取不到用户的城市了,只能打成null或者0。city_id关联city_name的时候,就会出现倾斜。因为其它值可能分布比较均匀一些,就不会差距太大。
  7. 处理:找出发生数据倾斜的key作单独处理。a.key值中包含空值或异常值时若不需要该值提前过滤掉,若需要则使用select case when city_id is null thenconcat('000000',round(rand()*100000)) city_id from XXX 进行转换。b.若group by字段中有空值,调整相关hive参数设置。 c.数据倾斜非常严重时且不好处理时用distribute by rand() 使key完全随机,各个节点都存在很多key,但会降低效率。

你可能感兴趣的:(hive)