在多个CPU核心上运行独立的Hadoop应用程序

7
我的团队使用Hadoop库构建了一个Java应用程序,将一堆输入文件转换为有用的输出。 考虑到当前负载,单个多核服务器在未来一年左右可以胜任。我们目前还没有必要使用多台服务器的Hadoop集群,但我们选择开始这个项目是为了"未雨绸缪"。
当我在命令行上运行这个应用程序(或者在eclipse或netbeans中运行)时,我还没有能够说服它同时使用超过一个map和/或reduce线程。 鉴于这个工具非常CPU密集,这种"单线程性"是目前的瓶颈。
当我在netbeans分析器中运行它时,我确实看到该应用程序启动了几个线程来执行各种任务,但只有一个map/reduce正在运行。
输入数据由几个输入文件组成,因此Hadoop至少应该能够同时运行每个输入文件1个线程用于映射阶段。
我该怎么做才能至少有2个甚至4个活动线程运行(对于这个应用程序的大部分处理时间应该是可能的呢)?
我希望这只是我忽视了的一些非常愚蠢的东西。
我刚找到这个: https://issues.apache.org/jira/browse/MAPREDUCE-1367 这实现了我在Hadoop 0.21中寻找的功能。 它引入了标志mapreduce.local.map.tasks.maximum来控制它。
目前,我还发现了这个问题中描述的解决方案
4个回答

5

我不确定是否正确,但在本地模式下运行任务时,无法有多个mapper/reducer。

无论如何,要设置最大运行mapper和reducer的数量,请使用配置选项mapred.tasktracker.map.tasks.maximummapred.tasktracker.reduce.tasks.maximum。默认情况下,这些选项设置为2,因此我可能是正确的。

最后,如果您想准备好多节点群集,请直接以完全分布式方式运行,但让所有服务器(namenode、datanode、tasktracker、jobtracker等)都在单台机器上运行。


1
谢谢,因为你的观察我下载了源代码并深入研究了一下。我发现当在本地模式下运行时,实际上使用的是org.apache.hadoop.mapred.LocalJobRunner来运行作业。run()方法只是按顺序执行所有操作,没有任何线程。我确实找到了org.apache.hadoop.mapreduce.lib.map.MultithreadedMapper,这是一个非常奇怪的功能:一个Mapper实现,在Hadoop框架之外进行线程处理。根据文档,只有在不受CPU限制时才有用。我们的工具受到CPU限制,所以我们不能使用它。 - Niels Basjes

2
只是为了澄清一下... 如果hadoop在本地模式下运行,那么任务级别上就没有并行执行(除非你运行的是>= hadoop 0.21 (MAPREDUCE-1367))。但你可以同时提交多个作业,然后这些作业会并行执行。 所有这些。

mapred.tasktracker.{map|reduce}.tasks.maximum

属性仅适用于在分布式模式下运行的Hadoop!希望对你有所帮助。约翰内斯

没错。两年前我运行它的方式(https://dev59.com/hE_Ta4cB1Zd3GeqPFfcy)只是通过运行作业和任务跟踪器来完成的。所以这并不是本地模式,只是伪分布式的一半。这样就可以在没有你提到的0.21版本特性的情况下利用多个CPU核心。 - Niels Basjes

0

2
没有像 mapred.tasktracker.tasks.maximum 这样的选项,对于 map 和 reduce 有单独的选项:mapred.tasktracker.{map|reduce}.tasks.maximum,它在你发布的第二个链接中。 - wlk
我的理解是你可以有mapreduce,也可以没有。这个电子邮件来自于2007年,但Hadoop的作者提到了使用mapred.tasktracker.tasks.maximum - matt b
这封电子邮件是2007年的,很可能涉及hadoop 0.16版本之前的内容,因为在0.16中引入了映射器和减速器的单独选项(而0.16大约在2008年推出)请参阅:http://hadoop.apache.org/common/docs/r0.15.2/cluster_setup.html#Configuring+the+Hadoop+Daemons和http://hadoop.apache.org/common/docs/r0.16.0/cluster_setup.html#Configuring+the+Hadoop+Daemons。 - wlk
3
我刚刚发现Hadoop 0.16中弃用了mapred.tasktracker.tasks.maximum( https://issues.apache.org/jira/browse/HADOOP-1274 ),现在改为使用mapred.tasktracker.{map|reduce}.tasks.maximum。请注意更新。 - Niels Basjes

0

你想要做的是在“伪分布式”模式下运行Hadoop。一台机器,但是运行任务跟踪器和名称节点就像它是一个真正的集群。然后它将(可能)运行多个工作节点。

请注意,如果您的输入很小,Hadoop会决定不值得并行化。您可能需要通过更改其默认拆分大小来引导它。

根据我的经验,“典型”的Hadoop作业在受到I/O限制时有时会受到内存限制,而不是CPU限制。由于这个原因,您可能会发现无法完全利用一台机器上的所有核心。


对于几乎两年前的CPU绑定作业,它可以在没有HDFS的情况下在多个CPU核心上运行,因此采用了一种简化的“伪分布式”模式。 - Niels Basjes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接