根据我的理解,mapper首先运行,然后是partitioner(如果有的话),然后是Reducer。但是如果我们使用Partitioner类,我不确定Sorting和Shuffling阶段何时运行?
答案 0 :(得分:0)
更短暂的看法
下图解释了完整的细节。
从此图中,您可以看到Word Count应用程序的映射器和reducer组件所在的位置,以及它如何实现其目标。我们现在将更详细地研究这个系统。 MapReduce的流
答案 1 :(得分:0)
随机和排序阶段将始终执行(跨映射器和缩减器节点)。
MapReduce中不同阶段的层次结构如下:
地图 - >分区 - >组合器(可选) - >随机和排序 - >减少。强>
答案 2 :(得分:0)
简短的回答是:数据排序运行在Reducer,shuffling / sort运行之前 reducer(总是)和之后 map / combiner(如果有的话)/分区器(如果有的话)。
长期的答案是,在MapReduce工作中有4个主要参与者: 映射器,组合器,分区程序, Reducer 。所有这些都是您可以自己实际实现的类。
让我们采用着名的单词计数程序,让我们假设我们工作的分裂包含:
pippo, pluto, pippo, pippo, paperino, pluto, paperone, paperino, paperino
并且每个单词都是记录。
<强>映射强>
每个映射器都运行在文件的一个子集上,其任务是从拆分中读取每个记录,并为每个将输出的记录分配一个键。 Mapper会将中间结果存储在磁盘(本地磁盘)上。
此阶段的中间输出将是
pippo,1
pluto,1
pippo,1
pippo,1
peperino,1
pluto,1
paperone,1
paperino,1
paperino,1
此处将存储在运行映射器的节点的本地磁盘上。
<强>合强>
这是一个迷你减速机,可以汇总数据。它也可以运行连接,所谓的map-join。此对象有助于将带宽节省到群集中,因为它会聚合本地节点上的数据。
组合器的输出仍然是映射器阶段的一部分,将是:
pippo,3
pluto,2
paperino,3
paperone,1
当然这里是来自ONE节点的数据。现在我们必须将数据发送到reducer以获得全局结果。哪个reducer将处理记录取决于分区程序。
<强>分区强>
它的任务是在所有可用的reducer之间传播数据。该对象将读取组合器的输出,并将选择将处理该键的reducer。
在这个例子中,我们有两个reducer,我们使用以下规则:
all the pippo goes to reducer 1
all the pluto goes to reducer 2
all the paperino goes to reducer 2
all the paperone goes to reducer 1
所以所有节点都会将具有密钥pippo的记录发送到同一个reducer(1),所有节点都会将具有密钥pluto的记录发送到同一个reducer(2)等等......
以下是对数据进行混洗/排序的位置 ,并且由于组合器已经在本地减少了数据,因此该节点只需发送4条记录而不是9条记录。 / p>
<强>减速强>
此对象能够聚合来自每个节点的数据,并且还能够对数据进行排序。