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

时间:2010-08-04 15:02:15

标签: java multithreading command-line hadoop mapreduce

我的团队使用Hadoop库构建了一个Java应用程序,将一堆输入文件转换为有用的输出。 考虑到当前的负载,单个多核服务器在未来一年左右就可以正常运行。我们(还)没有必要选择多服务器Hadoop集群,但我们选择启动这个项目“正在准备”。

当我在命令行(或在eclipse或netbeans)上运行此应用程序时,我还没有能够说服它一次使用更多的那个地图和/或减少线程。 鉴于该工具非常占用CPU,这种“单线程”是我目前的瓶颈。

在netbeans探查器中运行时,我确实看到应用程序出于各种目的启动多个线程,但同一时刻只运行一个map / reduce。

输入数据由几个输入文件组成,因此Hadoop至少应该能够为地图阶段同时为每个输入文件运行1个线程。

我该怎么做才能至少运行2个甚至4个活动线程(在此应用程序的大部分处理时间内应该可以这样做?)

我希望这是一个非常愚蠢的东西,我忽略了。


我刚发现:https://issues.apache.org/jira/browse/MAPREDUCE-1367 这实现了我在Hadoop 0.21中寻找的功能 它引入了mapreduce.local.map.tasks.maximum标志来控制它。

现在我也找到了here in this question描述的解决方案。

4 个答案:

答案 0 :(得分:5)

我不确定我是否正确,但是当你在本地模式下运行任务时,你不能拥有多个映射器/缩减器。

无论如何,要设置最大运行映射器和缩减器数,默认使用配置选项mapred.tasktracker.map.tasks.maximummapred.tasktracker.reduce.tasks.maximum,这些选项设置为2,所以我可能是对的。

最后,如果你想为多节点集群做好准备,那就直接以完全分布的方式运行它,但让所有服务器(namenode,datanode,tasktracker,jobtracker,...)在一台机器上运行

答案 1 :(得分:2)

只是为了澄清...... 如果hadoop在本地模式下运行,则您在任务级别上没有并行执行(除了您正在运行> = hadoop 0.21(MAPREDUCE-1367))。虽然您可以一次提交多个作业,然后这些作业并行执行。

所有

  

mapred.tasktracker {地图|降低}。.tasks.maximum

属性仅适用于以分布式模式运行的hadoop!

HTH Joahnnes

答案 2 :(得分:0)

根据this thread on the hadoop.core-user email list,您需要将mapred.tasktracker.tasks.maximum设置更改为您希望机器处理的最大任务数(这将是核心数)。

此{(以及您可能想要配置的其他属性)也记录在the main documentation on how to setup your cluster/daemons

答案 3 :(得分:0)

你想要做的是在"伪分发"中运行Hadoop。模式。一台机器,但是,运行任务跟踪器和命名节点就好像它是一个真正的集群。然后它(可能)会运行几个工人。

请注意,如果您的输入很小,Hadoop会认为它不值得并行化。您可能必须通过更改其默认分割大小来哄它。

根据我的经验,"典型的" Hadoop作业在受CPU限制之前是I / O绑定的,有时是内存限制的。因此,您可能会发现无法在一台计算机上充分利用所有核心。