【问题标题】:How map reduce program process fragmented data between two nodesmap reduce程序如何处理两个节点之间的碎片数据
【发布时间】:2016-05-18 11:25:37
【问题描述】:

我想了解 mapreduce 作业如何处理数据块。根据我对每个数据块的理解,调用一个映射器。 让我举一个例子。

假设,我有一个长文本文件,在 HDFS 中存储了 4 个节点上的 4 个块 (64 MB) 的数据(让我们忘记这里的复制)

在这种情况下,将在每台机器上调用 4 个地图任务(所有 4 个数据节点/机器) 这是一个问题:这种拆分可能导致部分记录存储在两个块上。像最后一条记录可能已部分存储在块 1(最后)中,而其他部分存储在块 2 中。 在这种情况下,mapreduce 程序如何确保处理完整的记录?

我希望,我已经能够提出我的查询

【问题讨论】:

  • 看看this answer。这是一个非常透彻的解释。

标签: mapreduce


【解决方案1】:

请在http://www.hadoopinrealworld.com/inputsplit-vs-block/阅读这篇文章

这是我在上面发布的同一篇文章的摘录。

块是按块大小对数据进行硬划分。因此,如果集群中的块大小为 128 MB,则数据集的每个块将为 128 MB,但如果文件大小不能完全被块大小整除,则最后一个块可能小于块大小。因此,块是块大小的硬切,块甚至可以在逻辑记录结束之前结束。

假设您的集群中的块大小为 128 MB,每个逻辑记录是您的文件大约 100 Mb。 (是的..巨大的记录) 所以第一条记录将完全适合块,因为记录大小 100 MB 与块大小为 128 MB 是很好的。然而,第 2 条记录无法放入块中,因此第 2 条记录将从块 1 开始并在块 2 中结束。 如果将映射器分配给块 1,在这种情况下,映射器无法处理记录 2,因为块 1 没有完整的记录 2。这正是 InputSplit 解决的问题。在这种情况下,InputSplit 1 将同时包含记录 1 和记录 2。 InputSplit 2 不以记录 2 开头,因为记录 2 已包含在输入拆分 1 中。因此 InputSplit 2 将只有记录 3。如您所见,记录 3 是在块 2 和 3 之间划分,但 InputSplit 2 仍将拥有整个记录 3。

块是存储在磁盘中的物理数据块,而 InputSplit 不是物理数据块。 Inputsplit 是一个 Java 类,带有指向块中开始和结束位置的指针。因此,当 Mapper 尝试读取数据时,它清楚地知道从哪里开始读取以及在哪里停止读取。 InputSplit 的起始位置可以从一个块开始,到另一个块结束。

快乐的 Hadooping

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多