hadoop mapreduce为多个作业读取一次数据集

kpbwa7wx  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(378)

我有一个由许多小文件(平均每个30-40 mb)组成的数据集。我想通过mapreduce对它们运行分析,但是在每个作业中,Map程序都会再次读取文件,这会对i/o性能造成很大的负担(开销等)。
我想知道是否有可能使用一次Map器,为不同的还原器发出不同的输出?当我环顾四周时,我发现多个减速机是不可能的,但唯一可能的是工作链。但是,我希望并行运行这些作业,而不是按顺序运行,因为它们都将使用相同的数据集作为输入并运行不同的分析。总之,我想要的是:

Reducer = Analytics1
      /

Map器-reducer=analytics2

\
        Reducer = Analytics3 
               ...

这可能吗?或者你对解决方法有什么建议吗?请给我一些建议。重新阅读这些小文件会给我的分析带来巨大的开销和性能降低。
提前谢谢!
编辑:我忘了提到我正在用hadoopv2.1.0-beta和yarn。

rggaifut

rggaifut1#

你可以:
让你的减速机在同一个过程/作业中完成所有分析(1-3)。编辑:从你的评论,我看到这个替代品是没有用的,但我留在这里,以供将来参考,因为在某些情况下,这是可能的。
使用比mapreduce更通用的模型。例如,apachetez(仍然是一个孵化器项目)可以用于您的用例。
关于apache tez的一些有用的参考资料:
描述apacheYarn和相关项目的研究论文,包括apache-tez。
一些博客文章解释了tez的模式。
编辑:增加了关于备选方案1的以下内容:
您还可以让Map器生成一个键,指示输出要用于哪个分析过程。hadoop将自动按这个键对记录进行分组,并将它们全部发送到同一个reducer。Map程序生成的值将是以下形式的元组 <k,v> ,钥匙在哪里( k )是您要生成的原始密钥。因此,Map器生成 <k_analytics, <k,v>> 记录。reducer有一个reducer方法来读取键,并根据键调用适当的分析方法(在reducer类中)。这种方法是可行的,但前提是你的reducer不必处理大量的数据,因为你可能需要在执行分析过程(如 <k,v> 元组不会按其键排序)。如果您的reducer不能处理这个问题,那么@praveen sripati建议的自定义分区器可能是一个探索的选项。
编辑:正如@judge-mental所建议的,备选方案1可以通过发行mappers来进一步改进 <<k_analytics, k>, value> ; 换言之,使分析类型中的键成为键的一部分,而不是值,这样,reducer将接收一个分析作业的所有键,并可以对值执行流操作,而不必将它们保留在ram中。

cuxqih21

cuxqih212#

可以使用自定义分区器。自定义分区器将根据键将Map器的输出重定向到适当的reducer。所以,Map器输出的键是r1*,r2*,r3***。我们需要研究一下这种方法的利弊。
如前所述,tez是另一种选择,但它仍处于孵化阶段。

相关问题