就字数统计示例而言,map reduce 并行处理如何在 hadoop 中真正发挥作用?

How does map reduce parallel processing really work in hadoop with respect to the word count example?

我正在学习 hadoop map reduce 使用字数统计示例,请参阅附图:

我的问题是关于并行处理实际上是如何发生的,我的 understanding/questions 下面,如果我错了请纠正我:

  1. 拆分步骤:这分配了映射器的数量,这里两个数据集转到两个不同的处理器 [p1,p2],那么两个映射器?此拆分由第一个处理器 P.
  2. 完成
  3. 映射步骤:每个处理器 [p1,p2] 现在通过在产生值 v 的键上应用所需的函数 f() 将数据分成键值对 [ k1,v1],[k2,v2].
  4. 合并步骤 1:在每个处理器中,值按键分组,给出 [k1,[v1,v2,v3]].
  5. 合并步骤 2:现在 p1,p2 returns 输出到 P,合并两个结果键值对。这发生在 P.
  6. 排序步骤 : 现在这里 P 将对所有结果进行排序。
  7. Reduce Step :这里 P 将在每个单独的键 [k1,[v1,v2,v3]] 上应用 f() 以给出 [k1,V]

请问这个理解对吗,我感觉我在很多方面都完全不对劲?

您的图表并未准确显示 MapReduce 中的基本字数统计。具体来说,'Merging-step 1' 之后的内容在理解 MapReduce 如何并行化缩减阶段方面具有误导性。更好的图表,imo,可以在 https://dzone.com/articles/word-count-hello-word-program-in-mapreduce

找到

在后一张图中很容易看出,只要映射器的输出按输出键排序,然后基于这个键在带有 reducer 的节点上进行混洗,那么 reducer 就可以轻松地 运行 并行。

让我稍微详细地解释一下每个步骤,这样你会更清楚,我尽量让它们尽可能简短,但我建议你阅读官方文档 (https://hadoop.apache.org/docs/r1.2.1/mapred_tutorial.html ) 来好好感受一下整个过程

  1. Split Step:如果你现在已经编写过一些程序,你一定已经观察到我们有时会设置多个 reducer,但我们从不设置多个 mapper,因为 mapper 的数量取决于关于输入拆分的数量。简而言之,任何作业中的映射器数量与输入拆分的数量成正比。所以现在问题出现了,分裂是如何发生的。这实际上取决于许多因素,例如 mapred.max.split.size 设置输入拆分的大小,还有许多其他方法,但事实上我们可以控制输入拆分的大小。

  2. 映射步骤:如果 2 个处理器是指 2 个 JVM(2 个容器)或 2 个不同的节点或 2 个映射器,那么您的直觉是错误的容器,或者说节点与拆分任何输入无关文件是 hdfs 的工作,它在不同的节点上划分和分发文件,然后资源管理器负责在具有输入拆分的同一节点上启动映射器任务,如果可能的话,一旦启动映射任务,您就可以创建对根据您在映射器中的逻辑键和值。这里要记住的一件事是,一个映射器只能处理一个输入拆分。

你在第 3 步、第 4 步和第 5 步上有点混淆了。我试图通过参考处理这些步骤的实际 classes 来解释这些步骤。

  1. Partitioner class:这个class根据reducer的数量划分mapper任务的输出。如果你有超过 1 个减速器,这个 class 很有用,否则它不会影响你的输出。这个 class 包含一个名为 getPartition 的方法,它决定你的映射器输出将转到哪个缩减器(如果你有多个缩减器)这个方法会为映射器输出中存在的每个键调用。您可以覆盖此 class 并随后覆盖此方法以根据您的要求对其进行自定义。所以在你的例子中,因为有一个减速器,所以它将把两个映射器的输出合并到一个文件中。如果有更多的 reducer 并且会创建相同数量的中间文件。

  2. WritableComparator class : 地图输出的排序由此完成 class 这种排序是基于键完成的。像 partitioner class 你可以覆盖它。在您的示例中,如果键是颜色名称,那么它将像这样对它们进行排序(这里我们正在考虑如果您不覆盖此 class 那么它将使用默认方法对按字母顺序排列的文本进行排序):


    Black,1
    Black,1
    Black,1
    Blue,1
    Blue,1
    .
    .
    and so on 

现在,同样的 class 也用于根据您的键对您的值进行分组,以便在 reducer 中,您可以在 Ex ->

的情况下对它们使用 iterable
Black -> {1,1,1}   
Blue -> {1,1,1,1,1,1}
Green -> {1,1,1,1,1}
.
.
and so on
  1. Reducer -> 这一步将根据你的 reducer class 中定义的逻辑简单地减少你的地图。你的初衷适合这个 class.

现在还有一些其他影响也会影响映射器和缩减器之间以及映射器之前的中间步骤,但这些与您想知道的内容没有太大关系。

希望这能解决您的问题。