关于数据倾斜那些事

220 阅读2分钟

「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

数据倾斜

map join、Bucket-Map join、SMB join

Map join生效后,直接在map端输出数据,避免了reduce阶段。

但如果是复杂的查询,不可避免会有reduce阶段怎么处理数据倾斜?

Join关联查询时数据倾斜处理

skewjoin原理:

  1. 对于skewjoin.key,在执行job时,将它们存入临时的HDFS目录,其它数据正常执行
  2. 对倾斜数据开启map join操作(多个map并行处理),对非倾斜值采取普通join操作
  3. 将倾斜数据集和非倾斜数据集进行合并Union操作。 开启skewin以后,究竟多大的数据才会被认为是倾斜了的数据呢? set hive.skewjoin.key=100000; 默认值100000

编译时优化

  1. 开启编译时优化

    set hive.optimize.skewjoin.compiletime=true;
    
  2. 建表时指定倾斜字段和倾斜的值

    CREATE TABLE list_bucket_single (key STRING, value STRING)
    --  倾斜的字段和需要拆分的key值
    SKEWED BY (name) ON (‘张三’,’李四’,’王五’)
    --   为倾斜值创建子目录单独存放
    [STORED AS DIRECTORIES];
    

运行时优化

-- 开启运行时倾斜优化
set hive.optimize.skewjoin=true;
-- 设定倾斜阈值
set hive.skewjoin.key=100000;  //行数

Unoin优化

set hive.optimize.union.remove=true;

Group By统计时数据倾斜处理

MapJoin先行打散

hive.map.aggr

MR Job先行打散

hive.groupby.skewindata=true;

当选项设定为 true,生成的查询计划会有两个 MR Job。

第一个MR Job中,Map 的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操 作,并输出结果,这样处理的结果是相同的Group By Key有可能被分发到不同的Reduce中,从而 达到负载均衡的目的;

第二个MR Job再根据预处理的数据结果按照Group By Key分布到Reduce中(这个过程可以保 证相同的Group By Key被分布到同一个Reduce中),最后完成最终的聚合操作。

注意:在多个列上进行的去重操作与hive环境变量hive.groupby.skewindata存在冲突 注意:有多个列执行distinct去重操作时,不支持skewindata:

SELECT ip, count(DISTINCT uid), count(DISTINCT uname) FROMlog GROUP BY ip;

DISTINCT on different columns not supported with skew in data.