hive数据倾斜

目录

定义和现象:

容易造成数据倾斜的原因

1、group by逻辑造成

解决方案

2、空值产生的数据倾斜

解决方法1:为空的不参与关联

解决方法2 :空值随机赋值方式

对业务的优化


定义和现象:
        在处理数据的时候,数据的分散程度不够,导致大量数据集中到了一台或几台机
器上计算,就会导致这些机器的计算速度远远低于平均计算速度,导致整个计算
过程很慢,reduce 的进程在日志里可能卡在99%不动了。
容易造成数据倾斜的原因
1、group by逻辑造成

假设按基金经理和基金账户交易记录事实表来统计交易记录,那么部分明星基金经理的交易记录显然非常多,而多数基金经理的交易记录就一般,由于 group by 的时候是按照基金经理的 ID 分发到每个 Reduce Task ,那么此时分配到明星基金经理的 Reduce Task 就分配了更多的交易记录,从而导致数据倾斜。

解决方案

调优参数

set hive.map.aggr=true;

开启map端聚合,效率更高但需要更多的内存

set hive.groupby.skewindata=true;

开启group by数据倾斜时负载均衡,生成的查询计划会有两个MapReduce Job

2、空值产生的数据倾斜
解决方法1:为空的不参与关联
SELECT *
FROM log a
JOIN bmw_users b
ON a.user_id IS NOT NULL
AND a.user_id = b.user_id
UNION ALL
SELECT *
FROM log a
WHERE a.user_id IS NULL;
解决方法2 :空值随机赋值方式
select 
* 
from dmf_dev.dmf_dev__mu_d01 t1
left join dmf_dev.dmf_dev__mu_d02 t2
on case when nvl(t1.id) = '' then concat('hive',rand()) 
    else t1.id = t2.id
对业务的优化
看一下取数的话,尽量去从汇总层获取,别盲目的从明细层取数。再结合具体业务,去分析,把扫描的分区数做 到最少,尽量不浪费多余的计算和资源。然后就是写sql时,要哪个字段就写哪个字段,以及where过滤时,把 无用的数据都过滤掉,减少它MapReduce需要分发的数据量。

你可能感兴趣的:(hive,hadoop)