2013-09-24 89 views
1

所以这一直困扰着我。我不确定map-reduce的工作方式,我似乎迷失在事件的确切链条中。了解地图 - 减少

我的理解:

  1. 主大块的文件和双手它们映射器为(K1,V1)
  2. 映射器将文件并执行一个Map(K1,V1) - >(K2,V2 )并将这些数据输出到单个文件中。
  3. 这是我失去的地方。
    1. 那么这些单独的文件得到组合一些如何?如果在每个文件中重复键,该怎么办?
    2. 这是什么组合?它是主人吗?如果所有文件在这一步都进入了Master,那么他们是否会成为一个巨大的瓶颈?它是否被合并为一个文件?这些文件现在是否被重新分割并递交给减速器?
    3. 或者,如果所有文件直接转到减速器,那么在流程结束时(K3,V3)文件中的重复K3会发生什么情况?它们是如何组合的?是否有另一个地图缩小阶段?如果是这样,我们需要创建新的操作:地图(K3,V3) - >(K4,V4),降低(K4,V4) - >(K3,V3)

我想总之,我只是不知道如何重新组合正确的文件,并导致我的地图 - 减少逻辑失败。

回答

2

第3步叫做“洗牌”。它是地图缩小框架的主要增值之一,尽管它对于大型数据集也非常昂贵。框架对所有映射器输出的完整记录集执行与GROUP BY操作类似的操作,然后对每组记录调用reducer。回答3个人的个人问题:

3.1。想象一下,你的工作被配置为总减少者数量为 r。框架将每个地图输出文件分割成 r件,并将每件作品发送到一个reducer任务。用 m总映射器,即先生小片飞来飞去。当一个特定的reducer收到它需要的所有切片时,它将它们合并在一起,然后用K2键对结果进行排序,然后通过该密钥对该记录进行分组,以便个别调用reduce()。如果有重复的K2键,该组将比单身大。事实上,这是重点。如果您的映射器不输出相同的密钥,那么您的算法甚至不需要缩减阶段,您可以完全跳过昂贵的随机播放。

3.2。执行所有数据移动的负载分布在整个集群中,因为每个Reducer任务都知道它想要的输出并从每个映射器请求它们。主节点唯一需要做的就是协调,即,告诉每个缩减器何时开始抽取映射器输出,监视死亡节点并跟踪每个人的进度。

3.3。 Reducer输出不是由框架检查或以任何方式组合。然而,你有很多减速器任务( r),这就是你将得到的带有K3,V3记录的输出文件的数量。如果您需要再次合并,请在该输出上运行另一个作业。

1

前一个读这样的回答,请花一些超时阅读有关合并排序(分而治之的办法)

下面是完整的一套由框架发生在幕后行动

  1. 客户提交mapreduce作业。虽然jobsubmission正在发生

    • FileInputFormat决定如何将文件分成拆分(拆分取决于你splitsize = 1个或更多HDFS块)。
  2. 的JobTracker计算出其中的被分割位于,并产生接近分割映射器,局部性的优先级为(1数据本地,2架本地的,3.网络跳本地)

  3. 映射器读取数据(由FileInputFormat提供记录的读者),并产生K1-> V1

  4. 这个数据在本地保存到其中映射器运行的本地文件系统,这里的诀窍是保存在localfilesystem数据被“划分“并存储在分区中(等于还原器的数量)

    • 之前IF合并启用,对于给定键,值被合并depening的组合逻辑(大多相同减少)保存到磁盘,数据进行排序并保存到磁盘

5。每个减速拉从它们相应的分区映射器数据(不要忘记通过减速拉的所有数据进行排序)

{ 
k1->v1 
k1->v2 
K2->v3 
} 

减速开辟了filepointers所有排序的文件从映射器拉,将它们合并。 (分组和排序比较是在合并使用)作为合并从排序的文件发生,减速机的输出进行排序并保存到HDFS

该步骤是有点类似于排序合并“合并步骤”

请通过http://bytepadding.com/big-data/map-reduce/understanding-map-reduce-the-missing-guide/获取相同的图片展示