mapreduce中的分区到底是如何工作的?

xtfmy6hx  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(321)

我想我大体上对mapreduce编程模型有一个相当的了解,但是即使在阅读了原始论文和其他一些资料之后,许多细节对我来说还是不清楚的,特别是关于中间结果的划分。
我将很快总结一下我对mapreduce的理解:我们有一个潜在的非常大的输入数据集,它被mr框架自动分割成m个不同的部分。对于每一块,框架安排一个map任务,由集群中的一个可用处理器/机器执行。每个m map任务输出一组键值对,这些键值对本地存储在执行该map任务的同一台机器上。每台机器将其磁盘划分为r个分区,并基于这些分区之间的中间键来分配其计算出的中间键值对。然后,框架为每个不同的中间键启动一个reduce任务,该任务由任何可用的机器再次执行。
现在我的问题是:
在一些教程中,似乎可以并行执行map和reduce任务。是这样吗?假设每个不同的中间键只启动一个reduce任务,这怎么可能呢?我们不必等到最后一个map任务完成后,才能开始第一个reduce任务吗?
因为每个不同的中间键有一个reduce任务,所以每个reduce任务都要求执行机器从其他机器加载相应的分区,这对吗?每台机器可能都有一个带有所需中间密钥的键值对,因此对于每个reduce任务,我们可能必须查询所有其他机器。这真的有效吗?
原来的文章说分区的数量(r)是由用户指定的。但是分区不是reduce任务的输入吗?或者更确切地说:所有机器中具有相同数目的所有分区的并集不是一个reduce任务的输入吗?这意味着,r取决于用户通常不知道的不同中间键的数量。
概念上很清楚map和reduce函数/任务的输入和输出是什么。但我想我还没有理解mapreduce的技术层面。有人能帮我理解吗?

jslywgbw

jslywgbw1#

克里斯说的补遗,
基本上,hadoop中的一个partitioner类(例如默认hashpartitioner)
必须实现这个功能,

int getPartition(K key, V value, int numReduceTasks)

此函数负责返回分区号,并从numreducetasks变量获取启动作业时固定的缩减器数,如hashpartitioner中所示。
根据上述函数返回的整数,hadoop选择特定键的reduce任务应该运行的节点。
希望这有帮助。

wfypjpf4

wfypjpf42#

可以在Map任务仍在运行时启动reducer任务(使用称为slowstart的功能),但reducer只能运行复制阶段(从已完成的Map任务获取已完成的结果)。它需要等待所有Map程序完成,然后才能真正执行最终排序和缩减。
reduce任务实际上处理零个、一个或多个键(而不是每个键的离散任务)。在对这些中间输出进行排序,然后一次减少一个键集之前,每个reducer需要从每个与其分区相关的map任务中获取map输出。
回到2的注解-一个reducer任务(每个分区一个)运行在零个、一个或多个键上,而不是每个离散键一个任务。
理解中间键的分布和变化也很重要,因为它是散列的,并且是模化的(如果使用默认的hashpartitioner),以确定哪个reduce分区应该处理该键。假设您有偶数个reducer任务(10),并且输出键总是散列为偶数-那么在本例中,这些散列数和10的模将始终是偶数,这意味着奇数reducer永远不会处理任何数据。

相关问题