欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

hive调优_解决数据倾斜

程序员文章站 2022-05-01 13:03:35
...

小表与大表JOIN

小表与大表JOIN
小表与大表Join时容易发生数据倾斜,表现为小表的数据量比较少但key却比较集中,导致分发到某一个或几个reduce上的数据比其他reduce多很多,造成数据倾斜。

优化方法:使用Map Join将小表装入内存,在map端完成join操作,这样就避免了reduce操作。有两种方法可以执行Map Join(1) 通过hint指定小表做MapJoin
 select
    /*+ MAPJOIN(time_dim) */ count(*)
 from
 store_sales 
 join time_dim 
 on ss_sold_time_sk= t_time_sk;
 
(2) 通过配置参数自动做MapJoin

hive调优_解决数据倾斜

大表与大表JOIN

大表与大表JOIN

大表与大表Join时,当其中一张表的NULL值(或其他值)比较多时,容易导致这些相同值在reduce阶段集中在某一个或几个reduce上,发生数据倾斜问题。
优化方法:
(1)NULL值提取出来最后合并,这一部分只有map操作;非NULL值的数据分散到不同reduce上,不会出现某个reduce任务数据加工时间过长的情况,整体效率提升明显。这种方法由于有两次Table Scan 会导致map增多。

SELECT 
    a.user_Id,
    a.username,
    b.customer_id
FROM 
    user_info a
LEFT JOIN 
    customer_info b
ON a.user_id = b.user_id
where  a.user_id IS NOT NULL
# union All:对两个结果集进行并集操作,包括重复行,不进行排序;    
UNION ALL
SELECT 
    a.user_Id,
    a.username,
    NULL
FROM 
    user_info a
WHERE a.user_id IS NULL


(2)Join时直接把NULL值打散成随机值来作为reduce的key值,不会出现某个reduce任务数据加工时间过长的情况,整体效率提升明显。这种方法解释计划只有一次map,效率一般优于第一种方法。
SELECT 
    a.user_id,
    a.username,
    b.customer_id
FROM 
    user_info a
LEFT JOIN customer_info b
ON
CASE WHEN a.user_id IS NULL
THEN CONCAT ('dp_hive', RAND())
ELSE a.user_id  END=b.user_id;

GROUP BY 操作

Hive做group by查询,当遇到group by字段的某些值特别多的时候,会将相同值拉到同一个reduce任务进行聚合,也容易发生数据倾斜。

优化方法:

(1) 开启Map端聚合

hive调优_解决数据倾斜

当设定hive.groupby.skewindata为true时,生成的查询计划会有两个MapReduce任务。
在第一个MapReduce 中,map的输出结果集合会随机分布到 reduce 中, 每个 reduce 做部分聚合操作,这样处理之后,相同的 Group By Key 有可能分发到不同的 reduce 中,从而达到负载均衡的目的。

在第二个 MapReduce 任务再根据第一步中处理的数据按照Group By Key分布到reduce中,(这一步中相同的key在同一个reduce中),最终生成聚合操作结果。

COUNT(DISTINCT) 操作

当在数据量比较大的情况下,由于COUNT DISTINCT操作是用一个reduce任务来完成,这一个reduce需要处理的数据量太大,就会导致整个job很难完成,这也可以归纳为一种数据倾斜。

优化方法:将COUNT DISTINCT使用先GROUP BY再COUNT的方式替换。例如:

select 
count(id) 
from
(
select 
    id 
from
    bigtable 
group by id
) a;

因此,count distinct的优化本质上也是转成group by操作。

参考:https://mp.weixin.qq.com/s?__biz=MzUxOTU5Mjk2OA==&mid=2247485763&idx=2&sn=a711ab3468b727f8d6bb64c871365034&chksm=f9f60424ce818d32b517e375c95745fc6c1774829b82e09ff39f983a546f8cbd4234c90c848d&mpshare=1&scene=1&srcid=031954dgAJBEIZbIXCDYnwnP&sharer_sharetime=1584580832759&sharer_shareid=bc83e36774dfedaf1b723f4dc4163311&key=61c257cd8ca493f96ca99048dcd2f455930c681a9daa85d18ee71f589be8c97e66875b3c146ace43a9409eec28f1690243d4b4f85922e0039db99c3b3eb67a3ec9f06816ca4d1cd3c3bfbdee350013b3&ascene=1&uin=MjMzMTY4OTI2MQ%3D%3D&devicetype=Windows+10&version=62080079&lang=zh_CN&exportkey=AV5FnLheevj4KZ9UT1UO5bI%3D&pass_ticket=kT%2B4Tx3uVd5EC1PJYIxh1%2BOpBTBANXMg2VkGu%2BdWU2WFImXT1E%2FHbbqNx82Bq2%2B%2F

相关标签: 大数据 HIve