在hive中,我经常执行以下查询:
select columnA, sum(columnB) from ... group by ...
我读了一些mapreduce示例,一个reduce只能生成一个键。似乎减速机的数量完全取决于列中键的数量。所以,为什么Hive可以手动设置减速机的数量?如果列A中有10个不同的值,我将还原数设置为2,会发生什么?每个减速器将重复使用5次?如果列A中有10个不同的值,并且我将还原数设置为20,会发生什么?Hive只能产生10个减速器?
qaxu7uf21#
通常不应手动设置减速器的确切数量。使用 bytes.per.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可以动态地设置reducer的数量,如果设置了以下属性:
hive.exec.reducers.max
set hive.tez.auto.reducer.parallelism = true;
在这种情况下,最初启动的减速器数量可能会更大,因为它是根据大小估计的,在运行时可以删除额外的减速器。一个reducer可以处理多个键,这取决于数据大小和字节数。每个reducer和reducer限制配置设置。在类似于您的示例的查询中,相同的键将传递给同一个reducer,因为每个reducer容器都是独立运行的,所有具有特定键的行都需要传递给单个reducer才能计算该键的计数。可以强制使用额外的减速器( mapreduce.job.reducers=N )或者根据错误的估计(因为过时的统计数据)自动启动,如果在运行时不删除,它们将什么也不做,并且很快完成,因为没有什么要处理的。但无论如何,这样的减缩器都会被调度和分配容器,所以最好不要强制使用额外的减缩器,并保持最新的统计信息以便更好地估计。
mapreduce.job.reducers=N
1条答案
按热度按时间qaxu7uf21#
通常不应手动设置减速器的确切数量。使用
bytes.per.reducer
取而代之的是:如果要限制作业缩减器使用群集,可以设置以下属性:
hive.exec.reducers.max
如果您在tez上运行,那么在执行时hive可以动态地设置reducer的数量,如果设置了以下属性:在这种情况下,最初启动的减速器数量可能会更大,因为它是根据大小估计的,在运行时可以删除额外的减速器。
一个reducer可以处理多个键,这取决于数据大小和字节数。每个reducer和reducer限制配置设置。在类似于您的示例的查询中,相同的键将传递给同一个reducer,因为每个reducer容器都是独立运行的,所有具有特定键的行都需要传递给单个reducer才能计算该键的计数。
可以强制使用额外的减速器(
mapreduce.job.reducers=N
)或者根据错误的估计(因为过时的统计数据)自动启动,如果在运行时不删除,它们将什么也不做,并且很快完成,因为没有什么要处理的。但无论如何,这样的减缩器都会被调度和分配容器,所以最好不要强制使用额外的减缩器,并保持最新的统计信息以便更好地估计。