【问题标题】:Intermediate files in mapper (Mapreduce)映射器中的中间文件(Mapreduce)
【发布时间】:2015-03-02 15:42:19
【问题描述】:

所以我是这个 Hadoop 世界的新手,我正在尝试了解映射器和化简器是如何工作的,我的问题(和问题)是:

我有一个长映射器,在生成 [key,value] 对之前需要生成一些中间文件。例如,在整个映射器中:文件 A 和 B 作为输入,我需要一个输出文件 E,其中包含一些无法缩减的中间文件。

file A -> file C
file B -> file D
file C + file D -> file E

可以存档吗?中间文件是否留在节点中?

【问题讨论】:

  • 是否需要保留文件C和D之间的差异?如果所有数据都在E文件中完成,你应该在Map中发出A和B的处理行,然后Reducer只复制输入到输出(文件 E)。在 MapReduce 中,你必须忘记 Map 和 Reduce 之间的文件,并以 对的形式思考。
  • 我需要保留相同的文件A和文件B(我已经解决了),因为他们将获得获得E所需的对应C和D,问题是我需要在同一个节点中完成所有操作,以免混合数据。我不能在一个节点中执行一堆脚本吗? mapreduce 是关于流式传输的吗?我是否必须走出去并用 java 编写流程才能摆脱 stdin-stdout 世界? (对不起,如果他们是愚蠢的问题,我只是这个:D)。谢谢!
  • 您可以使用密钥保留差异。例如,如果您处理了文件 A,则 Map 的输出应为 。您可以为任何编码更改“A”。对于这种情况,我认为不需要在 MapReduce 应用程序中维护文件概念。
  • @Tuxman 问题是执行文件的程序不接受标准输入,只接受文件,那是因为我需要 C 和 D 作为节点中的临时文件,而不是作为键值;是我的主要问题。
  • 我不明白。您是否在 Hadoop 上运行 MapReduce 应用程序? @克里斯蒂安佩雷斯

标签: hadoop mapreduce


【解决方案1】:

这是常规方法无法实现的。 但是有两种方法是可能的:

  • 您可以从每个映射器创建并写入 HDFS 上的文件。请注意,因为基于输入数据/编号的大小。文件中可能有许多并行运行的映射器,因此文件名必须是唯一的。
  • 更好的方法:从映射器为reducer 发出一个复杂的键。这个复杂的密钥有 2 个部分:IdentifierOfKey:Key。 IdentifierOfKey 只是一个标志,表示这条记录需要转到文件 E。现在在 reducer 中,您可以使用多个输出将数据放入多个文件中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    相关资源
    最近更新 更多