1

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

我的理解:

  1. Master 将文件分块并将它们作为 (K1, V1) 交给映射器
  2. 映射器将获取文件并执行 Map(K1,V1)-> (K2,V2) 并将此数据输出到单个文件中。
  3. 这就是我迷路的地方。
    1. 那么这些单独的文件是如何组合在一起的呢?如果密钥在每个文件中重复怎么办?
    2. 这结合谁?是主人吗?如果这一步所有文件都进入Master,它们会不会成为一个巨大的瓶颈?是否全部合并到一个文件中?现在文件是否重新分块并交给减速器?
    3. 或者,如果所有文件都直接转到reducer,那么在流程结束时(K3,V3)文件中重复的K3会发生什么?它们是如何结合的?是否还有另一个 Map-Reduce 阶段?如果是这样,我们是否需要创建新操作:Map(K3,V3)->(K4,V4), Reduce(K4,V4)->(K3,V3)

我想总结一下,我只是不明白文件是如何正确重新组合的,它导致我的 map-reduce 逻辑失败。

4

2 回答 2

2

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

3.1。想象一下,您的作业被配置为总共有r个减速器。该框架将每个 map 输出文件划分为r个片段,并将每个片段发送到一个 reducer 任务。有m个总映射器,那就是mr little slices 飞来飞去。当一个特定的 reducer 接收到它需要的所有切片时,它将它们全部合并在一起并按 K2 键对结果进行排序,然后按该键对记录进行动态分组,以便单独调用 reduce()。如果存在重复的 K2 键,则该组将大于单例。事实上,这就是重点。如果您的映射器从未输出相同的键,那么您的算法甚至不需要减少阶段,您可以完全跳过昂贵的 shuffle。

3.2. 进行所有数据移动的负载分散在整个集群中,因为每个 reducer 任务都知道它想要什么输出,并从每个映射器请求它们。主节点唯一要做的就是协调,告诉每个reducer何时开始拉取mapper输出,注意死节点,并跟踪每个人的进度。

3.3. 框架不检查减速器输出或以任何方式组合。无论您有多少 reducer 任务 ( r ),您将获得多少包含 K3、V3 记录的输出文件。如果您需要再次组合,请在该输出上运行另一个作业。

于 2013-09-24T17:34:21.310 回答
1

在阅读此答案之前,请花一些时间阅读有关合并排序(分而治之的方法)的信息

这是框架在幕后发生的完整动作集

  1. 客户提交一个 mapreduce 作业。在提交作业时

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

  3. 映射器读取数据(FileInputFormat 提供的记录读取器)并生成 k1->v1

  4. 这些数据在本地保存到运行映射器的本地文件系统中,这里的技巧是保存在本地文件系统上的数据是“排序的”并存储在分区中(等于减速器的数量)

    • 如果启用了组合器,则在保存到磁盘之前,对于给定的键,值根据组合器逻辑进行合并(与 reduce 基本相同),数据被排序并保存到磁盘

5. 每个reducer从对应partition的mapper中拉取数据(别忘了reducer拉取的所有数据都是排序好的)

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

Reducer 打开指向从映射器中提取的所有已排序文件的文件指针并将它们合并。(合并时使用分组和排序比较器)由于从排序文件中进行合并,reducer 的输出被排序并保存到 hdfs

这一步有点类似于归并排序“合并步骤”

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

于 2015-04-27T20:09:45.347 回答