【问题标题】:Running a standalone Hadoop application on multiple CPU cores在多个 CPU 内核上运行独立的 Hadoop 应用程序
【发布时间】:2010-08-04 15:02:15
【问题描述】:

我的团队使用 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 来控制它。

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

【问题讨论】:

    标签: java multithreading command-line hadoop mapreduce


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,由于您的观察,我下载了源代码并进行了挖掘。我发现在本地模式下运行时,org.apache.hadoop.mapred.LocalJobRunner 用于实际运行作业。 run() 方法只是按顺序执行所有操作。根本没有穿线。我确实找到了 org.apache.hadoop.mapreduce.lib.map.MultithreadedMapper 一个非常奇怪的特性:一个映射器实现,它在实际的 Hadoop 框架之外进行线程处理。根据文档,仅当您不受 CPU 限制时才有用。我们的工具受 CPU 限制,因此我们无法使用它。
    【解决方案2】:

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

    所有这些

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

    属性只适用于在分布式模式下运行的 hadoop!

    HTH 约翰内斯

    【讨论】:

    • 正确。两年前我运行它的方式(stackoverflow.com/questions/3546025)是只运行一个工作和任务跟踪器。所以这不是本地的,只是伪分布式的一半。这使得在没有您提到的 0.21 功能的情况下使用多个 CPU 内核成为可能。
    【解决方案3】:

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

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

    【讨论】:

    • 没有像:mapred.tasktracker.tasks.maximum这样的选项,map和reduce有单独的选项:mapred.tasktracker.{map|reduce}.tasks.maximum,它在您发布的第二个链接下。
    • 我对此的解释是您可以拥有mapreduce 或没有。电子邮件线程来自 2007 年,但 Hadoop 的作者提到使用 mapred.tasktracker.tasks.maximum
    • 嗯,这封电子邮件来自 2007 年,它很可能涉及 hadoop 0.16 之前的版本,因为在 0.16 中引入了映射器和缩减器的单独选项(并且在 2008 年左右引入了 0.16)看看:hadoop.apache.org/common/docs/r0.15.2/…hadoop.apache.org/common/docs/r0.16.0/…
    • 我刚刚发现 mapred.tasktracker.tasks.maximum 在 Hadoop 0.16 (issues.apache.org/jira/browse/HADOOP-1274) 中被弃用,现在是 mapred.tasktracker.{map|reduce}.tasks.maximum。
    【解决方案4】:

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

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

    根据我的经验,“典型”的 Hadoop 作业是 I/O 绑定的,有时是内存绑定的,远远早于 CPU 绑定。由于这个原因,您可能会发现不可能在一台机器上充分利用所有内核。

    【讨论】:

    • 对于 CPU 绑定的工作,这个问题是关于(大约 2 年前)它可以在没有 HDFS 的多个 CPU 内核上运行。因此,一种剥离形式的“伪分布式”模式。
    猜你喜欢
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 2014-06-13
    相关资源
    最近更新 更多