【发布时间】:2017-06-16 16:29:12
【问题描述】:
我正在运行一个计算密集型、基于 hadoop 的 map-reduce 应用程序。我已将 hadoop 配置为使用尽可能少的线程,但多个并发部署会导致应用程序的执行时间增加。
我找不到导致执行时间增加的原因,因此肯定存在我没有发现的瓶颈和/或我错过的配置参数。
试验台
我的测试平台由 3 个 Dell PowerEdge R630 组成,每个都有一个Intel Xeon E5-2630v3:8 个内核,2 个线程/内核。这些机器位于同一个10 Gbps 集群中,由同一个交换机互连。这些将被称为M1、M2、M3。
Hadoop 配置
我在java-1.6.0-openjdk-amd64 上运行hadoop-1.2.1。我已将 hadoop 配置为使用尽可能少的线程数。这是我的mapred-site.xml 配置:
<configuration>
<property>
<name>mapred.map.tasks</name>
<value>1</value>
</property>
<property>
<name>mapred.tasktracker.map.tasks.maximum</name>
<value>1</value>
</property>
<property>
<name>mapred.reduce.tasks</name>
<value>1</value>
</property>
<property>
<name>mapred.tasktracker.reduce.tasks.maximum</name>
<value>1</value>
</property>
<property>
<name>mapred.job.tracker</name>
<value>10.0.0.1:9001</value>
</property>
<property>
<name>mapred.map.tasks.speculative.execution</name>
<value>false</value>
</property>
<property>
<name>mapred.reduce.tasks.speculative.execution</name>
<value>false</value>
</property>
<property>
<name>tasktracker.http.threads</name>
<value>2</value>
</property>
<property>
<name>mapred.reduce.parallel.copies</name>
<value>2</value>
</property>
</configuration>
部署
实际部署发生在容器上,通过nova-docker 生成。在每个部署中,我生成 3 个容器,C1、C2 和 C3,每台物理机有 1 个容器。让我们假设C1 在M1 上产生,C2 在M2 上产生,C3 在M3 上产生。
特别是:
- 一个容器
C1,充当“Master”;它运行 Namenode 和 Jobtracker 服务。 - 另外两个容器
C2和C3充当“从属”,它们运行Datanode 和Tasktracker 服务。
我已经运行了两次这个实验:
- 一个并发部署
- 两个并发部署
“两个并发”部署意味着有两个相同的部署,同时运行。为了进一步澄清,当两个部署运行时,存在六个容器:
- C1a 和 C1b M1
- C2a 和 C2b M2
- C3a 和 C3b M3
C1a、C2a 和 C3a 属于同一个 map-reduce 执行,并按预期相互通信。容器C1b、C2b 和C3b 也是如此。
执行时间
这两种情况(1 个并发部署,2 个并发部署)都运行了 10 次,以获得良好的样本。这是 1 个和 2 个并发部署的执行时间;很明显,2 个并发部署的执行时间增加了 6.72%。
问题
我的问题是:为什么运行两个并发部署时执行时间更长,即使我已将 hadoop 配置为使用尽可能少的线程?特别是:
- 我会遇到 PCIe 瓶颈或 CPU 瓶颈吗? (见下文)
- 在配置 hadoop 以使用尽可能少的线程时,我是否遗漏了其他一些事情?
- hadoop 使用的线程是否比我知道的多,这可能会导致 CPU 或其他资源拥塞?
我已经调查了以下内容:
- 带宽消耗:我们绝对没有网络瓶颈。网络可以维持高达 10 Gbps 的速度,应用程序平均消耗不超过 400-500 Mbps,并且没有其他人在使用集群。
- PCIe:我已经测量了 PCIe 带宽以调查我是否在那里遇到瓶颈。我打开了related question on Superuser 询问我的读数是否表明 PCI 拥塞。
- CPU 利用率:请参阅下一节。
CPU 指标
我安装了PCM tools 来测量执行期间的 CPU 利用率。这些工具安装在一台托管从属容器(Datanode、Tasktracker)的物理机上。
我测量了以下情况下处于活动状态的核心的利用率:
- 空闲(标记为“0 个租户”)
- 1 个并发部署(标记为“1 个租户”)
- 2 个并发部署(标记为“2 个租户”)
很明显,1 或 2 个并发部署的 CPU 利用率相似,尽管 1 个部署的平均水平略高。因此,CPU 利用率似乎不是问题;我可能会错过什么?
请在 cmets 中告诉我是否可以提供任何其他信息。
【问题讨论】:
标签: hadoop concurrency