【问题标题】:Hadoop: check how many mapper node actually ranHadoop:检查实际运行了多少个映射器节点
【发布时间】:2013-12-04 17:30:38
【问题描述】:

我正在运行一个具有不同数量的映射器和减速器的 MR 程序,以测试执行时间如何变化。我到了可以设置拆分大小以更改映射器数量的地步,并且我看到执行时间发生了一些变化。 我正在使用远程机器(具有超线程的四核)。 Hadoop版本:1.2.1 输入文件大小:1GB

所以,我现在要做的是验证 MR 是否真的按照我的配置运行。

例如,我将拆分大小设置为大约 250MB,这样我就有四个映射器。 在输出文件(_logs/history/job....)中,我看到它说

TOTAL MAP TASKS = 4
LAUNCHED MAP TASKS = 4
FINISHED MAP TASKS = 4
DATA-LOCAL MAP TASKS = 1

(1) 在这种情况下,我可以说使用了四个核心(四个映射器)吗?

(2) 当我运行 TOP 时,我只看到两个 Java 进程和两个 python 进程(MR 程序是用 python 编写的)。即使我期望有 4 个映射器或 8 个映射器,我总是只看到两个 Java 进程。 这是否意味着我没有使用其他内核?

【问题讨论】:

  • 如果你有一台4核的远程机器,这意味着一个节点,而不是四个。

标签: python hadoop mapreduce


【解决方案1】:

(1, 2) TOTAL MAP TASK 不反映并行或串行使用情况。这意味着已处理的任务总量,因此如果您看到两个 java 进程,则您的任务一次执行了 2 个。

拆分大小控制生成的映射任务的数量,但每个节点可以运行潜在的无限映射任务数量,同时运行映射器作业的预定义数量(最多,并非所有映射器都可能正在运行,有一些等待时间基于作业跟踪器交互和其他东西)。

您可以使用mapred.tasktracker.map.tasks.maximum 参数控制每个节点运行的映射器计数。而且您可能需要调整 JVM 内存设置以添加更多映射器。将启动最多mapred.tasktracker.map.tasks.maximum 个映射器进程(单独的 JVM 实例),如果其数量等于核心数,通常会利用所有核心。请注意,在内核之间调度进程的是操作系统,由操作系统执行负载平衡和性能优化。

但是请注意,对于 map 任务,IO 通常是瓶颈,而不是 CPU,因此并行执行不一定会导致单台机器上的加速。当然,如果你没有一些复杂的团队配置。

(3) 如果TOTAL MAP TASK 是 14,那么你的工作实际上被分成了 14 个部分。

【讨论】:

  • 非常感谢!我要确定的最后一件事是each map task utilizes one core, thus map tasks can run at the same timemappers run concurrently (wait for its turn to run),对吗?
  • @kabichan 基本上是的,但最后一点核心利用率取决于操作系统。启动了 4 个进程,操作系统必须安排在 4 个内核上。由操作系统执行此负载平衡,优化系统性能。
  • @kabichan 一些映射器进程(JVM 实例)同时运行,达到阈值(由...控制)
  • 太棒了!再次感谢您的大力帮助和对我的耐心。
猜你喜欢
  • 2016-11-27
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多