Hadoop 如果配置单元还原器的数量与键的数量不同,会发生什么情况?

Hadoop 如果配置单元还原器的数量与键的数量不同,会发生什么情况?,hadoop,hive,mapreduce,reduce,Hadoop,Hive,Mapreduce,Reduce,在配置单元中,我经常执行以下查询: select columnA, sum(columnB) from ... group by ... 我读了一些mapreduce示例,一个reducer只能生成一个键。似乎减缩器的数量完全取决于列A中键的数量 所以,为什么蜂箱可以手动设置减速机的数量 如果A列中有10个不同的值,我将还原数设置为2,会发生什么?每个减速器将重复使用5次 如果A列中有10个不同的值,我将还原数设置为20,会发生什么?配置单元将只生成10个还原器?通常不应手动设置还原器的确切数

在配置单元中,我经常执行以下查询:

select columnA, sum(columnB) from ... group by ...
我读了一些mapreduce示例,一个reducer只能生成一个键。似乎减缩器的数量完全取决于列A中键的数量

所以,为什么蜂箱可以手动设置减速机的数量

如果A列中有10个不同的值,我将还原数设置为2,会发生什么?每个减速器将重复使用5次


如果A列中有10个不同的值,我将还原数设置为20,会发生什么?配置单元将只生成10个还原器?

通常不应手动设置还原器的确切数量。改为使用
字节数.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可以动态设置还原器的数量:

set hive.tez.auto.reducer.parallelism = true;
在这种情况下,最初启动的还原器数量可能会更大,因为它是根据大小估计的,在运行时可以删除额外的还原器

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


额外的减缩器可以被强制(
mapreduce.job.reducers=N
)或根据错误的估计自动启动(因为过时的统计数据),如果在运行时不删除,它们将不会执行任何操作,并且会很快完成,因为没有要处理的内容。但无论如何,这样的减缩器都会被安排和分配容器,因此最好不要强制使用额外的减缩器,并保持统计数据的新鲜性,以便更好地进行估计。

减缩器不一定与密钥数相同。但可以保证给定的密钥将由同一个reducer处理。看到区别了吗?因此,如果“col_A”中有10个不同的键,并且减速器的数量为2,则N个键将由减速器_1处理,其余(10-N)个键将由减速器_2处理。N的值(即键在还原器中的分布方式)由Hadoop确定。将还原器的数量设置为大于不同值数量的值没有意义,因为作业最多需要与不同值相同数量的还原器(而不是更多)