hadoop中的减速器数量

时间:2016-07-04 15:48:06

标签: hadoop mapreduce hadoop2 reducers bigdata

我正在学习hadoop, 我发现减速器的数量非常混乱:

1)减速器数量与分区数量相同。

2)减速器数量为0.95或1.75乘以(节点数)*(每个节点的最大容器数)。

3)减速器数量由 mapred.reduce.tasks 设置。

4)减速器数量最接近:块大小的倍数* 5到15分钟之间的任务时间*创建尽可能少的文件。

我很困惑,我们是否明确设置了reducers的数量,或者是由mapreduce程序本身完成的?

如何计算减速器的数量?请告诉我如何计算减速器的数量。

4 个答案:

答案 0 :(得分:3)

1 - reducer的数量与分区数量相同 - False。单个reducer可能适用于一个或多个分区。但是选择的分区将在它启动的reducer上完全完成。

2 - 这只是您可以为Hadoop集群配置的最大减速器的理论数量。这在很大程度上取决于您正在处理的数据类型(决定减速器承受多大负担)。

3 - mapred-site.xml配置只是对纱线的建议。但在内部,ResourceManager有自己的算法运行,随时随地优化。因此,该值实际上并不是每次运行的reducer任务的数量。

4 - 这个看起来有点不切实际。我的块大小可能是128MB,每次我不能有128 * 5最小数量的reducer。我相信这也是错误的。

可以配置或计算固定数量的reducer任务。这取决于实际可分配的资源量。

答案 1 :(得分:2)

你的工作可能需要也可能不需要减速器,这取决于你想做什么。当存在多个reducer时,map任务会对其输出进行分区,每个reduce对每个reduce任务创建一个分区。每个分区中可以有许多密钥(及其关联值),但任何给定密钥的记录都在一个分区中。一个经验法则是针对减速器,每个减速器运行五分钟左右,并且产生至少一个HDFS块的输出值。太多的减速器,你最终会得到很多小文件。

答案 2 :(得分:1)

分区程序确保来自多个映射器的相同键转到同一个reducer。这并不意味着分区数等于减少器数。但是,您可以使用job.setNumReduceTasks(2)等作业实例在驱动程序中指定reduce任务数。如果您没有在驱动程序中指定reduce任务的数量,那么它将从mapred.reduce.tasks中选择,其默认值为1(https://hadoop.apache.org/docs/r1.0.4/mapred-default.html),即所有映射器输出将转到相同的reducer。

另外,请注意程序员无法控制映射器的数量,因为它取决于输入分割,因为程序员可以控制任何作业的缩减器数量。

答案 3 :(得分:1)

如果您未在驱动程序中明确指定使用以下API,则内部根据我们正在处理的数据大小计算减速器数量

job.setNumReduceTasks(x)的

默认情况下,1 GB的数据将使用一个reducer。

因此,如果您正在播放少于1 GB的数据,并且您没有专门设置减速器的数量,那么将使用1个减速器。

同样,如果您的数据是10 Gb,那么将使用10个减速器。

您也可以更改配置,而不是1 GB,您可以指定更大的尺寸或更小的尺寸。

hive中用于设置reducer大小的属性是:

hive.exec.reducers.bytes.per.reducer

您可以通过在hive cli中触发set命令来查看此属性。

分区程序仅决定哪些数据将转到哪个reducer。