了解Map-Reduce

时间:2013-09-24 15:30:04

标签: hadoop mapreduce

所以这总是困惑我。我不确定map-reduce是如何工作的,而且我似乎迷失在确切的事件链中。

我的理解:

  1. Master将文件分块并将它们交给地图选手(K1,V1)
  2. Mappers将获取文件并执行Map(K1,V1) - > (K2,V2)并将此数据输出到单个文件中。
  3. 这就是我失去的地方。
    1. 那么这些单独的文件是如何结合起来的呢?如果在每个文件中重复键怎么办?
    2. 谁合并了?是主人吗?如果所有文件都在此步骤进入Master,那么它们不会是一个巨大的瓶颈吗?这一切都合并到一个文件中吗?文件是否重新分块并立即交给Reducer?
    3. OR,如果所有文件都直接转到reducers,那么在进程结束时(K3,V3)文件中重复的K3会发生什么?他们是如何结合的?还有另一个Map-Reduce阶段吗?如果是这样,我们是否需要创建新的操作:Map(K3,V3) - >(K4,V4),Reduce(K4,V4) - >(K3,V3)
  4. 我想总结一下,我只是不知道如何正确地重新组合文件并导致我的map-reduce逻辑失败。

2 个答案:

答案 0 :(得分:2)

步骤3称为“随机播放”。它是map reduce框架的主要增值之一,尽管对于大型数据集来说它也非常昂贵。该框架对所有映射器输出的完整记录集执行类似于GROUP BY操作的操作,然后使用每组记录调用reducer。回答3的个人问题:

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

3.2。执行所有数据移动的负载分布在整个集群中,因为每个reducer任务都知道它想要的输出并从每个映射器请求它们。主节点唯一要做的就是坐标,,告诉每个减速器什么时候开始拉动映射器输出,监视死节点,并跟踪每个人的进度。

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

答案 1 :(得分:1)

在读到这个答案之前,请花点时间阅读有关合并排序(分而治之的方法)

以下是框架

背后发生的一整套动作
  1. 客户提交mapreduce作业。正在进行职位提交

    • FileInputFormat决定如何将文件划分为Splits(Split = 1或更多hdfs块,具体取决于你的splitsize)。
  2. JobTracker计算出拆分的位置,并生成靠近拆分的映射器,地点的优先级为(1.本地数据,2。本地机架,3。本地网络跳跃)

    < / LI>
  3. Mappers读取数据(由FileInputFormat提供的Record Readers)并生成k1-&gt; v1

  4. 此数据在本地保存到映射器运行的本地文件系统中,这里的技巧是保存在localfilesystem上的数据为“SORTED”并存储在分区中(等于reducers的数量)

    • 如果启用了Combiner,则在保存到磁盘之前,对于给定的键,将根据组合器逻辑(大部分与reduce相同)合并值,将数据排序并保存到磁盘上
  5. 5。每个reducer从其对应的分区中提取映射器中的数据(不要忘记对reducer提取的所有数据进行排序)

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

    Reducer打开文件夹到从映射器中提取的所有已排序文件并合并它们。 (合并时使用组和排序比较器)当合并从排序文件发生时,reducer的输出被排序并保存到hdfs

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

    请浏览http://bytepadding.com/big-data/map-reduce/understanding-map-reduce-the-missing-guide/以获取相同

    的图片