如果 Hive 的 reducer 数量与键的数量不同,会发生啥?

Posted

技术标签:

【中文标题】如果 Hive 的 reducer 数量与键的数量不同,会发生啥?【英文标题】:What will happen if Hive number of reducers is different to number of keys?如果 Hive 的 reducer 数量与键的数量不同,会发生什么? 【发布时间】:2020-10-03 18:54:40 【问题描述】:

在 Hive 中,我经常做如下查询:

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

我阅读了一些 mapreduce 示例,一个 reducer 只能产生一个键。看来 reducer 的数量完全取决于 columnA 中的键数。

因此,为什么 hive 可以手动设置减速器的数量?

如果A列有10个不同的值,我将reducer的数量设置为2,会发生什么?每个reducer会重复使用5次吗?

如果A列有10个不同的值,我将reducer的数量设置为20,会发生什么? hive 只会生成 10 个 reducer?

【问题讨论】:

reducer 不一定和key的个数一样。但是可以保证给定的密钥将由同一个减速器处理。看出区别了吗? 因此,如果“col_A”中有 10 个不同的键并且 reducer 的数量为 2,则 reducer_1 将处理 N 个键,而 reducer_2 将处理其余 (10-N) 个键。 N 的值(即如何在 reducer 中分配密钥的方式)由 hadoop 确定 将 reducer 的数量设置为大于不同值数量的值没有意义,因为该作业最多需要与不同值一样多的 reducer(而不是更多) 【参考方案1】:

通常,您不应手动设置减速器的确切数量。请改用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; 

如果你想限制job reducer对集群的使用,你可以设置这个属性:hive.exec.reducers.max

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

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

在这种情况下,最初启动的减速器数量可能会更大,因为它是根据大小估算的,在运行时可以移除额外的减速器。

一个reducer可以处理很多key,这取决于数据大小和bytes.per.reducer和reducer限制配置设置。在您的示例中查询的情况下,相同的键将传递给同一个减速器,因为每个减速器容器都是独立运行的,并且所有具有特定键的行都需要传递给单个减速器才能计算该键的计数。

可以强制 (mapreduce.job.reducers=N) 或根据错误的估计自动启动额外的减速器(因为过时的统计信息),如果在运行时没有删除,它们将什么也不做并很快完成,因为没有什么要处理的。但无论如何,这样的 reducer 都会被调度并分配容器,所以最好不要强制使用额外的 reducer,并保持统计数据新鲜以便更好地估计。

【讨论】:

以上是关于如果 Hive 的 reducer 数量与键的数量不同,会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

Hive中Map任务和Reduce任务数量计算原理

Hive中Map任务和Reduce任务数量计算原理

大数据(MapReduce的编程细节及其Hive的安装,简单操作)

如何在 hive 中设置 mapreduce 任务的数量等于 1

hive如何调整map数和reduce数

3Hive-sql优化,数据倾斜处理