hadoop中还原程序的数量

hadoop中还原程序的数量,hadoop,mapreduce,hadoop2,reducers,bigdata,Hadoop,Mapreduce,Hadoop2,Reducers,Bigdata,我在学习hadoop, 我发现减速机的数量非常混乱: 1) 还原器的数量与分区的数量相同 2) 减速器的数量为0.95或1.75乘以(节点数量)*(每个节点的最大容器数量) 3) 还原器的数量由映射red.reduce.tasks设置 4) 还原器的数量最接近:块大小的倍数*5到15分钟之间的任务时间*创建尽可能少的文件 我很困惑,我们是显式地设置了减缩器的数量还是由mapreduce程序本身完成的 如何计算减速器的数量?请告诉我如何计算减速机的数量。1-减速机的数量与分区的数量相同-False

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

1) 还原器的数量与分区的数量相同

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

3) 还原器的数量由映射red.reduce.tasks设置

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

我很困惑,我们是显式地设置了减缩器的数量还是由mapreduce程序本身完成的


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

1-减速机的数量与分区的数量相同-
False
。单个缩减器可以在一个或多个分区上工作。但是一个选定的分区将在它启动时在减速器上完全完成

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

3.
mapred site.xml
配置只是对用户的一个建议。但在内部,ResourceManager有自己的算法在运行,不断优化。因此,该值实际上不是每次运行的reducer任务数

4-这个似乎有点不现实。我的块大小可能是128MB,每次我都不能有最小数量为128*5的减缩器。我相信这也是错误的


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

分区器确保来自多个映射器的相同关键帧进入同一个减速器。这并不意味着分区的数量等于减缩器的数量。但是,可以使用job.setNumReduceTasks(2)等作业实例指定驱动程序中的reduce任务数。如果您没有在驱动程序中指定reduce任务的数量,那么它会从mapred.reduce.tasks中选取默认值为1()的任务,也就是说,所有映射器的输出都将转到同一个reducer


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

如果您没有明确指定在驱动程序中使用下面的API,则还原器的数量是从我们正在处理的数据大小内部计算出来的

job.setNumReduceTasks(x)

默认情况下,对于1GB的数据,将使用一个缩减器

因此,如果您使用的数据小于1GB,并且没有专门设置减速机的数量,那么将使用1个减速机

同样,如果您的数据是10GB,那么将使用10Reducer

您还可以更改配置,可以指定更大或更小的大小,而不是1 GB

配置单元中用于设置减速器大小的属性为:

hive.exec.reducers.bytes.per.reducer

您可以通过在配置单元cli中触发set命令来查看此属性


分区器只决定哪些数据将被送到哪个减缩器。

您的工作可能需要也可能不需要减缩器,这取决于您试图做什么。当存在多个reducer时,映射任务将对其输出进行分区,每个任务为每个reduce任务创建一个分区。每个分区中可能有许多键(及其关联值),但任何给定键的记录都在单个分区中。一个经验法则是针对每个减速机运行五分钟左右,并产生至少一个HDFS块的输出的减速机。还原程序太多,最终会产生很多小文件。

感谢您的评论,如果有三个分区,并且我们将reduce任务的数量设置为2,那么数据将如何划分,就像两个从业者的数据将转到一个分区,而一个分区的数据将转到另一个还原程序一样?我们还可以设置输入分割大小,这样我们就可以设置映射器的数量。如果有3个分区,那么数据就已经被分割了,主节点会将还原器分配给3个分区。Master将从数据节点获取心跳消息,其中包含有关其可用性、资源等的信息。Master在调度时使用这些信息。得到2个分区的reducer将处理一个又一个分区。有关还原程序和映射程序数量的更多信息,请访问以下链接:@gunner87我相信,如果未提供mapred.reduce.tasks,则只有当所有分区都可以容纳在单个节点中时,默认值才为1。如果生成的分区大小超过单个节点上的HDFS可用空间怎么办?谢谢你的回答,我得到了你的1、2和3分。但我认为如果我们设置mapred.reduce.tasks,那么它将是reducer的数量。如果我错了,请纠正我。所以我认为这种情况是这样的,我们可以使用setnumReducetasks()方法的mapred.reduce.tasks和分区数来设置减缩器的数量,在减缩器任务之间划分数据。请澄清。是的,驱动程序类中的方法调用在大多数情况下都是有效的。有时我看到,当我将reducer的数量设置为6时,ApplicationManager只运行额外的4个空reducer,而不执行任何操作。如果您将reducer的数量设置为小于所需的数量,那么它可能会遵守您的设置,但这不是运行MapReduce的优化设置。通常我要做的是在MapReduce之前计算输入记录编号大小,并设置它可能需要的近似减缩器。@ViKiG关于第3点。如果hadoop使用自己的算法来计算最佳还原数,为什么我需要提供还原数?@Bemipefe如果
mapred site.xml
中给出的还原数是6,而实际可能或需要的还原数是2,那么它只会创建2,而不是6。如果减速器