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

时间:2013-10-10 15:22:41

标签: performance hadoop io mapreduce reduce

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

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

        Reducer = Analytics1
      /
     

Mapper - Reducer = Analytics2

      \
        Reducer = Analytics3 
               ...

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

提前致谢!

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

2 个答案:

答案 0 :(得分:3)

你可以:

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

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

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

    编辑:正如@ judge-mental所建议的那样,通过让映射器发出<k,v>,可以进一步改进备选方案1;换句话说,将密钥设置在密钥的分析类型部分而不是值中,以便减速器将接收组合在一起的一个分析作业的所有密钥,并且可以对值执行流操作而无需将它们保留在RAM。

答案 1 :(得分:3)

可以使用custom partitioner。自定义分区程序会根据键将映射器的输出重定向到适当的reducer。因此,映射器输出的关键是R1 * ,R2 * ,R3 ***。需要研究这种方法的优点和缺点。

如前所述,Tez是另一种选择,但仍处于孵化阶段。