我有一个由许多小文件(平均每个30-40 mb)组成的数据集。我想通过mapreduce对它们运行分析,但是在每个作业中,Map程序都会再次读取文件,这会对i/o性能造成很大的负担(开销等)。
我想知道是否有可能使用一次Map器,为不同的还原器发出不同的输出?当我环顾四周时,我发现多个减速机是不可能的,但唯一可能的是工作链。但是,我希望并行运行这些作业,而不是按顺序运行,因为它们都将使用相同的数据集作为输入并运行不同的分析。总之,我想要的是:
Reducer = Analytics1
/
Map器-reducer=analytics2
\
Reducer = Analytics3
...
这可能吗?或者你对解决方法有什么建议吗?请给我一些建议。重新阅读这些小文件会给我的分析带来巨大的开销和性能降低。
提前谢谢!
编辑:我忘了提到我正在用hadoopv2.1.0-beta和yarn。
2条答案
按热度按时间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中。cuxqih212#
可以使用自定义分区器。自定义分区器将根据键将Map器的输出重定向到适当的reducer。所以,Map器输出的键是r1*,r2*,r3***。我们需要研究一下这种方法的利弊。
如前所述,tez是另一种选择,但它仍处于孵化阶段。