我在学习hadoop,我发现一些简化器非常混乱:
1) reducer的个数等于partition的个数
2)还原剂的数量为0.95或1.75乘以(no。*(无。
3) reducer的个数由mapred.reduce.tasks设置。
4) reducer的数量最接近:块大小的倍数*任务时间在5到15分钟之间*创建尽可能少的文件。
我很困惑,我们是显式设置reducer的数量还是由mapreduce程序本身完成?
减速器的数量是如何计算的?请告诉我如何计算减速器的数量
1 - reducer的数量等于分区的数量- False
。单个减速器可以在一个或多个分区上工作。但是选择的分区将在它启动的reducer上完全完成。
2——这只是理论上你可以为Hadoop集群配置的最大reducer数量。这在很大程度上也取决于您正在处理的数据类型(决定了减速器负担的繁重程度)。
3 - mapred-site.xml
配置只是对Yarn的一个建议。但是在内部,ResourceManager有它自己的算法在运行,在运行中优化。所以这个值并不是每次运行的reducer任务的数量。
4 -这个似乎有点不现实。我的块大小可能是128MB,每次我都不能有128*5的最小减数。我相信那又是错误的。
没有固定数量的reducers任务可以配置或计算。这取决于有多少资源实际上是可分配的。
如果您没有在驱动程序中使用下面的API明确指定,则根据我们正在处理的数据大小内部计算reducer的数量
job.setNumReduceTasks (x)
默认情况下,1 GB的数据将使用一个reducer。
所以如果你玩少于1gb的数据,你没有特别设置减速器的数量,所以1减速器将被使用。
同样,如果你的数据是10gb,那么将使用10个reducer。
您也可以更改配置,而不是1 GB,您可以指定更大或更小的大小。
蜂箱中设置减速机尺寸的属性为:
hive.exec.reducers.bytes.per。减速机
您可以在hive cli中执行set命令查看此属性。
你的工作可能需要也可能不需要reducer,这取决于你想要做什么。当有多个reducer时,map任务对它们的输出进行分区,每个reduce任务为每个reduce任务创建一个分区。每个分区中可以有许多键(及其关联值),但是任何给定键的记录都在单个分区中。一条经验法则是,目标是每个reducer运行5分钟左右,并且至少产生一个HDFS块的输出。太多的reducer会导致大量的小文件。
Partitioner确保来自多个映射器的相同键被分配到相同的reducer。这并不意味着分区的数量等于reducer的数量。但是,您可以使用job. setnumreducetasks(2)等作业实例在驱动程序中指定reduce任务的数量。如果你没有在驱动程序中指定reduce任务的数量,那么它将从默认值为1 (https://hadoop.apache.org/docs/r1.0.4/mapred-default.html)的mapred.reduce.tasks中选择,即所有映射器的输出将转到同一个reducer。
还需要注意的是,程序员无法控制映射器的数量,因为这取决于输入分割,而程序员可以控制任何作业的reducer的数量。