Hadoop MapReduce为多个作业读取一次数据集

Eng*_*zer 6 io performance reduce hadoop mapreduce

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

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

        Reducer = Analytics1
      /
Run Code Online (Sandbox Code Playgroud)

Mapper - Reducer = Analytics2

      \
        Reducer = Analytics3 
               ...
Run Code Online (Sandbox Code Playgroud)

这可能吗?或者你对解决方法有什么建议吗?请给我一些想法.再次读取这些小文件会为我的分析带来巨大的开销和性能降低.

提前致谢!

编辑:我忘了提到我正在使用带有YARN的Hadoop v2.1.0-beta.

cab*_*bad 3

你可以:

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

有关 Apache Tez 的一些有用参考:

编辑:添加了有关替代方案 1 的以下内容:

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

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

  • 我相信您应该从映射器为您的 1. 替代方案发出的元组是 &lt;&lt;analytics_type, k_for_that_type&gt;, v&gt;。您的映射器写入 3 条记录而不是 1 条,最终得到的组数量是原来的 3 倍,但您可以从键中判断出它属于哪种分析类型,从而知道在该组上运行哪种类型的归约算法(以及将输出)。这一切都可以通过普通的 MapReduce 来完成。 (2认同)