数据倾斜

  由于数据分布不均衡导致个别reduce数据量太大,整个任务卡在99%无法完成,查看task counter 输入输出是正常任务的几十倍。

下面是处理办法

  • 针对关联key值大量空的情况
      一种是本身数据中就有空值,还有一种情况通过多个 left join 关联导致有空值。 针对该情况关联条件做判空随机处理,比如:coalesce(col,concat(‘hive_rand’,rand())) 。
      如果两表是直接 join , 可以去掉空值关联。
  • 针对个别key值数据量太大
     如果可以通过日志找到具体倾斜的数据,可以针对该key单独处理,同时union all 其它数据,如下图所示可以看到key值”00000000…”大量出现。
  • 常用处理方式mapjoin
     如果是大表关联小表,优先用mapjoin优化,大表也可以根据数据倾斜情况拆分小表用该方式处理。mapjoin 需要保证如下参数开启(默认开启):
    1
    2
    3
    set  hive.auto.convert.join=true
    set hive.mapjoin.smalltable.filesize=25000000
    或者使用 hit /*+mapjoin(a)*/
    可以通过执行日志中是否出现“ launch local task to process map join ” 来判断mapjoin是否生效
  • 针对group by 导致的数据倾斜
    1
    2
    3
    4
    #map中做部分聚集操作
    set hive.map.aggr=true
    #通过设置该参数进行负载均衡
    set hive.groupby.skewindata=true
      总结:hadoop在执行海量数据查询分析的时候,正常情况下是比传统数据库快很多。 如果出现任务长时间执行不完,首先要排查是否出现数据倾斜等异常情况。