【问题标题】:Does record splitting need to generate unique keys for each record in hadoop?记录拆分是否需要为hadoop中的每条记录生成唯一键?
【发布时间】:2015-07-09 08:34:49
【问题描述】:

我对 hadoop 世界还比较陌生。我一直在关注我可以找到的示例,以了解记录拆分步骤如何用于 mapreduce 作业。我注意到 TextInputFormat 将文件拆分为记录,其中键作为字节偏移量,值作为字符串。在这种情况下,我们可以在一个映射器中有两条不同的记录,它们与不同的输入文件具有相同的偏移量。

它会以任何方式影响映射器吗?我认为如果我们不处理它(例如字数),映射器的键的唯一性是无关紧要的。但是如果我们必须在 mapper 中处理它,key 可能必须是唯一的。谁能详细说明一下?

提前致谢。

【问题讨论】:

  • 你可能对这篇文章感兴趣:stackoverflow.com/questions/18642875/…
  • @frb :感谢分享链接。这是一个有趣的用例。但它仍然没有回答我的问题:是否存在我们可能需要为进入映射器的每条记录具有唯一键的情况。在这篇文章中,用户没有对其进行处理,因此没有体现出独特性。

标签: java hadoop mapreduce


【解决方案1】:

映射器的输入是文件(或 hdfs 块)而不是键值对。换句话说,mapper 本身会创建键值对,不会受到重复键的影响。

Mapper 生成的“最终”输出是一个多值哈希图。

< Key, <List of Values>>

此输出成为 Reducer 的输入。一个键的所有值都由同一个 reducer 处理。映射器可以为一个键创建多个值。事实上,一些解决方案依赖于这种行为。

【讨论】:

    【解决方案2】:

    实际上回答你的问题完全取决于场景。

    如果您没有使用密钥(即在 textinputformat 的情况下使用最少的字节偏移,但如果您使用的是 keyvalusepairInputformat,您可能正在使用它。)那么它永远不会影响,但如果你的 map() 函数逻辑是这样的,你在 key 的基础上进行一些计算,那么它肯定会影响。

    所以这完全取决于场景。

    【讨论】:

      【解决方案3】:

      有误会。实际上,

      对于文件的每个输入拆分,都会分配一个 Mapper。所有的 来自单个输入拆分的记录将仅由一个 Mapper 处理 对于给定的工作。

      由于映射器的执行范围在任何时间点总是在一个键/值对上,因此无需担心具有重复键的记录到达映射器。

      mapper 任务的输出是 n 个键/值对,最终会根据键进行合并、排序和分区。

      reducer 将根据分区从所有 mapper 收集所需的输出,并将其带到 reducer 的内存中,在那里它处理将键/值对排列为 &lt;key , Iterable &lt;value&gt; &gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 2019-07-06
        • 1970-01-01
        • 2015-10-01
        • 2017-01-02
        • 2013-07-04
        相关资源
        最近更新 更多