gpt4 book ai didi

hadoop - reducer 配置单元数和计数(不同)

转载 作者:行者123 更新时间:2023-12-02 18:57:00 25 4
gpt4 key购买 nike

有人告诉我count(distinct)可能会导致数据偏斜,因为只使用了一个reducer。

我使用包含50亿条数据和2个查询的表进行了测试,

查询A:

select count(distinct columnA) from tableA

查询B:
select count(columnA) from
(select columnA from tableA group by columnA) a

实际上,查询A大约需要1000-1500秒,而查询B则需要500-900秒。结果似乎是预期的。

但是,我意识到这两个查询都使用 370 mappers1 reducers,而thay几乎具有 same cumulative CPU seconds。这意味着它们之间没有种属差异,并且时间差异可能是由集群负载引起的。

我很困惑为什么所有人都使用一个1 reducer ,我什至尝试了 mapreduce.job.reduces但它不起作用。顺便说一句,如果他们都使用1个reducer,为什么人们建议不要使用 count(distinct ),并且看来数据偏斜是不可避免的?

最佳答案

两个查询使用的映射器数量均与预期的相同,并且单个最终化简器的数量也与预期相同,因为您需要单个标量计数结果。同一顶点上的多个 reducer 独立运行,隔离运行,每个 reducer 都会产生自己的输出,这就是为什么最后一级只有单个 reducer 的原因。区别在于计划。

在第一个查询执行中,单个化简器读取每个映射器输出,并对所有数据进行不同的计数计算,从而处理过多的数据。

第二个查询使用中间聚集,最后的reducer接收部分汇总的数据(在上一步中汇总的不同值)。 Final Reducer需要再次聚合部分结果才能获得最终结果,它的数据量可能比第一种情况少得多。

从Hive 1.2.0开始,对count(distinct)进行了优化,您无需重写查询。设置此属性:hive.optimize.distinct.rewrite=true
也有映射器聚合(映射器也可以预聚合数据,并在其数据部分的范围内生成不同的值-拆分)设置此属性以允许映射端聚合:hive.map.aggr=true
使用EXPLAIN命令检查执行计划中的差异。

另请参见以下答案:https://stackoverflow.com/a/51492032/2700344

关于hadoop - reducer 配置单元数和计数(不同),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61767941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com