关于reducer的数据分区



Hadoop权威指南(Tom White)第178页部分洗牌和排序:地图侧。就在图6-4

后面

在写入磁盘之前,线程首先将数据划分为与它们最终将被发送到的reducer对应的分区。在每个分区中,后台线程按键在内存中执行排序,如果有组合函数,则在排序的输出上运行。

问题:

这是否意味着映射将每个键输出写入不同的文件,然后再组合它们?因此,如果有2个不同的密钥输出要发送到reducer,每个不同的密钥将被单独发送到reducer,而不是发送单个文件。

如果我上面的推理是不正确的,那么实际发生了什么?

仅当两个关键输出到不同的减速机时。如果分区认为它们应该去同一个reducer,它们将在同一个文件中。

—更新以包含更多细节-主要来自书:

分区器只是将键排序到桶中。从0到n表示工作中的减速器数量。reduce任务有少量的复制线程,因此它可以并行地获取map输出。因此,对于给定的作业,jobtracker知道映射输出和主机之间的映射。reducer中的线程定期向master请求map输出主机,直到它检索到所有的主机。

如果map输出足够小,则将其复制到reduce任务JVM的内存中(缓冲区的大小由mapred.job.shuffle.input.buffer控制)。Percent,指定用于此目的的堆的比例);否则,它们将被复制到磁盘。当内存缓冲区达到阈值大小(由mapred.job.shuffle.merge.percent控制)或达到映射输出的阈值数量(mapred.inmem.merge.threshold)时,它将被合并并溢出到磁盘。如果指定了组合器,它将在合并期间运行,以减少写入磁盘的数据量。

当副本在磁盘上积累时,一个后台线程将它们合并成更大的、排序的文件。这节省了以后合并的时间。请注意,(由map任务)压缩的任何map输出都必须在内存中解压缩,以便对它们执行合并。

当所有的映射输出都被复制后,reduce任务进入排序阶段(应该正确地称为合并阶段,因为排序是在映射端执行的),该阶段合并映射输出,保持它们的排序顺序。这是轮流进行的。例如,如果有50个地图输出,并且合并因子为10(默认值,由io.sort.factor属性控制,就像在地图的合并中一样),则会有5轮。每轮会将10个文件合并为一个,所以最后会有5个中间文件。

没有最后一轮将这五个文件合并成一个排序好的文件,而是通过在最后一个阶段(reduce阶段)直接提供reduce函数来节省对磁盘的访问。这个最终的合并可以来自内存段和磁盘段的混合。

如果我们配置了多个reducer,那么在分区时如果我们得到不同reducer的key,它们将被存储在对应于reducer的单独文件中,并且在map任务结束时将完整的文件发送给reducer,而不是单个key。

假设有3个减速器在运行。然后,您可以使用分区器来决定哪个键指向三个reducer中的哪个。您可能可以在分区程序中执行X%3,以决定哪个键指向哪个reducer。Hadoop默认使用HashPartitioner

相关内容

  • 没有找到相关文章

最新更新