我正在学习hadoop map reduce使用单词计数示例,请参阅附图:
我的问题是如何并行处理实际发生,我的理解/问题如下,如果我错了请纠正我:
让我知道这种理解是对的,我有一种感觉,我在很多方面完全脱离了吗?
答案 0 :(得分:1)
让我稍微详细解释每一步,以便您更清楚,我尽量保持简短,但我建议您通过官方文档(https://hadoop.apache.org/docs/r1.2.1/mapred_tutorial.html)来对整个过程有一个很好的感觉
分割步骤:如果你现在已经制作了一些程序,你必须注意到我们有时会设置一些减少器,但我们从未设置过多个mapper,因为mapper的数量取决于数量输入分裂。简单来说,任何作业中的映射器都不会与输入分割的数量成比例。所以现在问题出现了如何进行分裂。这实际上取决于一些因素,如mapred.max.split.size,它设置输入拆分的大小,还有很多其他方法,但我们可以控制输入拆分的大小。
映射步骤:如果由2个处理器表示2个JVM(2个容器)或2个不同的节点或2个映射器那么你的直觉是错误的容器或者说节点与拆分任何输入文件无关hdfs在不同节点上划分和分配文件,然后资源管理器负责在同一节点上启动映射器任务,如果可能的话,该节点具有输入拆分,一旦启动了映射任务,就可以创建一对键和值根据你在mapper中的逻辑。这里要记住的一件事是,一个映射器只能处理一个输入分割。
你在第3步,第4步和第5步有点混淆。我试图通过描述处理这些步骤的实际类来解释这些步骤。
Partitioner class:此类根据reducer的数量划分mapper任务的输出。如果你有超过1个reducer,这个类很有用,否则它不会影响你的输出。此类包含一个名为getPartition的方法,该方法决定映射器输出将使用哪个reducer(如果有多个reducer),则为mapper输出中存在的每个键调用此方法。您可以覆盖此类,并根据您的要求自定义此方法以进行自定义。因此,在您的示例的情况下,因为有一个reducer,所以它将两个映射器的输出合并在一个文件中。如果有更多的reducer并且创建了相同数量的中间文件。
WritableComparator类:您的地图输出的排序由此类完成。此排序是基于键完成的。与分区程序类一样,您可以覆盖它。在你的例子中,如果键是颜色名称,那么它将像这样对它们进行排序(这里我们考虑如果你不覆盖这个类,那么它将使用默认方法对文本进行排序,这是字母顺序):
< / LI> 醇>
Black,1
Black,1
Black,1
Blue,1
Blue,1
.
.
and so on
现在,同一个类也用于根据您的键对您的值进行分组,以便在您使用Ex - &gt;
时在reducer中可以使用iterable。Black -> {1,1,1}
Blue -> {1,1,1,1,1,1}
Green -> {1,1,1,1,1}
.
.
and so on
现在还有其他一些影响也会影响mapper和reducer之间以及mapper之前的intermediae步骤,但这些影响与你想要知道的并不相关。
我希望这可以解决您的问题。
答案 1 :(得分:0)
您的图表并未完全显示MapReduce中的基本单词计数。具体而言,“合并”步骤1&#39;之后的内容。在理解MapReduce如何并行化还原阶段方面具有误导性。更好的图表imo可以在https://dzone.com/articles/word-count-hello-word-program-in-mapreduce
找到在后一个图表中,很快就会看到映射器&#39;输出按输出键排序,然后根据此键在具有reducers的节点上进行混洗,然后reducers可以轻松并行运行。