为啥我们需要知道在 mapreduce 中正在处理的文件的名称?

Posted

技术标签:

【中文标题】为啥我们需要知道在 mapreduce 中正在处理的文件的名称?【英文标题】:why do we need to know the name of file being processed in mapreduce?为什么我们需要知道在 mapreduce 中正在处理的文件的名称? 【发布时间】:2016-06-28 22:49:58 【问题描述】:

我看到一篇帖子询问如何让 mapreduce 处理文件名。这让我想知道在什么情况下我们需要知道正在处理的文件的名称或路径。

FileSplit fileSplit = (FileSplit) context.getInputSplit();

String fileName = fileSplit.getPath().getName();

谢谢 巴桑

【问题讨论】:

【参考方案1】:

有几种情况文件名很重要,例如:

    过程中需要文件名中的时间戳。 根据文件名,您可以处理不同的文件。就像您有两个非常相似的文件类型,它们需要一个相似的过程,但差异很小(如果没有,最好有两个不同的 mapreduce 作业)。 当您想要跟踪处理的文件的名称时。 等

【讨论】:

【参考方案2】:

有趣的问题。

假设您需要根据映射器 id 有效地生成唯一整数,就像在这里完成的那样:Unique Key generation in Hive/Hadoop

或者您可能有完全不同的理由使用映射器 ID(由 context.getTaskAttemptID().getTaskID().getId() 返回)

映射器任务 ID 的问题在于它不是根据输入文件确定性地分配的。

例如,您的 mapper 输入文件可能是前面的 reducer 的结果,并说您有 10 个输入分区:

输出-r-00000 输出-r-00001 ... 输出-r-00009

现在您需要将此数据提供给映射器,并且可能需要此映射器具有与输入文件索引直接对应的 id。

通常,在这种情况下,您要做的第一件事是禁用输入拆分,以便每个映射器完全处理自己的分区。

但正如我之前所说,映射器不是确定性分配的,因此您不能依赖 context.getTaskAttemptID().getTaskID().getId():

mapper 0 有时会处理 output-r-00000,有时会处理 output-r-00001,等等。

因此,要确定性地提出自定义映射器 ID,您可以使用输入文件名,您可以对其进行解析以获取分区索引。

【讨论】:

非常感谢 yurgis 的详细解释。有什么示例程序可以推荐给我吗?

以上是关于为啥我们需要知道在 mapreduce 中正在处理的文件的名称?的主要内容,如果未能解决你的问题,请参考以下文章

使用MapReduce的优化

使用MapReduce的优化

hadoop之mapreduce详解(优化篇)

我们真的需要在 MapReduce 框架中进行排序吗?

为啥这个 MapReduce 中最后的 reduce 步骤非常慢? (HiveQL、HDFS MapReduce)

MapReduce进阶:多路径输入输出