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

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

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

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

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

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

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


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

现在我也在这个问题中找到了这里描述的解决方案。

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

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

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

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

所有那些

。mapred.tasktracker {地图|减少} .tasks.maximum

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

HTH Joahnnes

根据hadoop.core-user电子邮件列表中的这个post ,您需要将mapred.tasktracker.tasks.maximum设置更改为您希望机器处理的最大任务数(这将是核心数量) )。

此主题(以及您可能要配置的其他属性)也在主文档中介绍了如何设置群集/守护程序 。

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

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

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