如果Hive的reducers数量和key数量不同,会发生什么?

问题描述 投票:2回答:1

在Hive中,我经常做这样的查询。

select columnA, sum(columnB) from ... group by ...

我读了一些mapreduce的例子,一个reducer只能产生一个键。似乎reducer的数量完全取决于columnA中键的数量。

因此,为什么hive可以人为地设置reducer的数量?

如果在columnA中有10个不同的值,而我把reducer的数量设置为 2会发生什么?每个换算器可以重复使用5次?

如果列A中有10个不同的值,我将变径数设置为 20hive只会生成10个reducers吗?

hadoop hive mapreduce
1个回答
0
投票

通常你不应该手动设置确切的reducer数量。使用 bytes.per.reducer 来代替。

--The number of reduce tasks determined at compile time
--Default size is 1G, so if the input size estimated is 10G then 10 reducers will be used
set hive.exec.reducers.bytes.per.reducer=67108864; 

如果你想通过作业减速器来限制集群的使用,你可以设置这个属性。hive.exec.reducers.max

如果你在Tez上运行,在执行时,如果设置了这个属性,Hive可以动态地设置reducers的数量。

set hive.tez.auto.reducer.parallelism = true;

在这种情况下,最初启动的reducer数量可能会更多,因为它是根据大小估计的,在运行时可以删除额外的reducer。

一个reducer可以处理很多键,这取决于数据大小和bytes.per.reducer和reducer限制的配置设置。在你的例子中,在查询时,相同的键将传递给同一个reducer,因为每个reducer容器都是独立运行的,所有具有特定键的行都需要传递给单个reducer,以便能够计算这个键的计数。

额外的reducer可以被强制 (mapreduce.job.reducers=N)或者基于错误的估计(因为陈旧的统计)而自动启动,如果不在运行时删除,它们将什么也不做,并很快结束,因为没有什么要处理。但是这样的reducer无论如何都会被安排和分配容器,所以最好不要强迫额外的reducer,并保持统计的新鲜度以便更好的估计。

© www.soinside.com 2019 - 2024. All rights reserved.