【发布时间】: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 应用程序? @克里斯蒂安佩雷斯