【问题标题】:Hadoop MapReduce read the data set once for multiple jobsHadoop MapReduce 为多个作业读取数据集一次
【发布时间】:2013-10-18 10:57:27
【问题描述】:

我有一个由许多小文件(平均每个 30-40 MB)组成的数据集。我想通过 MapReduce 对它们进行分析,但是对于每个作业,映射器都会再次读取文件,这会对 I/O 性能(开销等)造成沉重的负担。

我想知道是否可以使用一次映射器,为不同的减速器发出各种不同的输出?当我环顾四周时,我发现多个减速器是不可能的,但唯一可能的事情是作业链接。但是,我想并行运行这些作业,而不是顺序运行,因为它们都将使用相同的数据集作为输入并运行不同的分析。所以,总而言之,我想要的东西如下:

        Reducer = Analytics1
      /

Mapper - Reducer = Analytics2

      \
        Reducer = Analytics3 
               ...

这可能吗?或者您对解决方法有什么建议吗?请给我一些想法。重新读取这些小文件会给我的分析带来巨大的开销和性能下降。

提前致谢!

编辑:我忘了提到我正在使用 Hadoop v2.1.0-beta 和 YARN。

【问题讨论】:

  • 你可以让你的 reducer(s) 在同一个 pass/job 中完成所有的 Analytics (1-3)。
  • 但是每个 reducer 可能采用不同的输入( 对)。因此,仅在一个 reducer 中运行所有分析对我来说不起作用。 Mapper 应该为不同的 reducer(分析)发出不同的 对。此外,对于不同的对,我希望能够从减速器之前发生的 Shuffle&Sort 机制中受益。

标签: performance hadoop io mapreduce reduce


【解决方案1】:

你可以:

  1. 让您的减速器在同一个通道/作业中执行所有分析 (1-3)。编辑:从您的评论中,我看到这个替代方案对您没有用,但我将其留在这里以供将来参考,因为在某些情况下可以这样做。
  2. 使用比 MapReduce 更通用的模型。例如,Apache Tez(仍然是一个孵化器项目)可用于您的用例。

一些关于 Apache Tez 的有用参考资料:

编辑:添加了关于备选方案 1 的以下内容:

您还可以让映射器生成一个键,指示输出打算用于哪个分析过程。 Hadoop 会自动按这个键对记录进行分组,并将它们全部发送到同一个 reducer。映射器生成的值将是 <k,v> 形式的元组,其中键 (k) 是您要生成的原始键。因此,映射器生成<k_analytics, <k,v>> 记录。减速器有一个读取键的减速器方法,并根据键调用适当的分析方法(在你的减速器类中)。这种方法可行,但前提是您的 reducer 不必处理大量数据,因为您可能需要在执行分析过程时将其保存在内存中(在列表或哈希表中)(如 @ 987654326@ 元组不会按它们的键排序)。如果这不是您的 reducer 可以处理的事情,那么 @praveen-sripati 建议的自定义分区器可能是一个值得探索的选项。

编辑:正如@judge-mental 所建议的,备选方案1 可以通过映射器问题<<k_analytics, k>, value> 来进一步改进;换句话说,使分析类型中的键成为键的一部分,而不是值的一部分,以便化简器将接收分组在一起的一个分析作业的所有键,并且可以对值执行流式操作,而不必将它们保留在内存。

【讨论】:

  • 我正在进行一个项目,现在似乎很难改变背后的技术。有没有办法用原始的 Hadoop MapReduce 做到这一点?
  • 我不这么认为。但是,如果您使用的是 YARN(Hadoop 0.23 或 2.x),那么您可以轻松使用 Tez,因为它在 YARN 之上工作。 Hadoop 已经解耦了 MapReduce,因此 MapReduce 现在是在 YARN 之上实现的,Tez 和其他模型也是如此。
  • 我相信你应该从映射器中为你的 1 发出元组。替代方案是 , v>。您的映射器写入 3 条记录而不是 1 条记录,您最终会得到 3 倍的组,但是您可以从键中判断它属于哪种分析类型,从而在组上运行哪种类型的缩减算法(以及将输出)。这一切都可以用普通的 mapreduce 来完成。
  • 是的,这比我的方法好。我的建议也应该有效,但问题是来自一个分析的密钥会混合在一起,因此您需要在 RAM 中跟踪它们。您的方法使用较少的 RAM。我会更新我的答案。
【解决方案2】:

使用custom partitioner 可能是可能的。自定义分区器将根据键将映射器的输出重定向到适当的减速器。因此,映射器输出的键是 R1*、R2*、R3***。需要研究这种方法的利弊。

如前所述,Tez 是替代方案之一,但仍处于孵化器阶段。

【讨论】:

  • 我的一些分析已经需要复合键方法,所以我将其用作 。在我的案例中已经实现了自定义分区器。是否可以进一步将这种方法扩展到进一步的组合?我的数据很大,所以我不想把所有东西都保存在 RAM 中并那样处理。由于我需要分组和排序机制,所以我在 Shuffle&Sort 阶段使用了 Composite Key。
猜你喜欢
  • 2013-06-26
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多