我正在运行一个计算密集型,基于hadoop的map-reduce应用程序。我已将hadoop配置为使用尽可能少的线程,但多个并发部署会导致应用程序的执行时间增加。
我无法找到执行时间增加的原因,因此必须存在我未发现的瓶颈和/或我错过的配置参数。
我的测试平台由3台Dell PowerEdge R630组成,每台都有Intel Xeon E5-2630v3:8个核心,2个线程/核心。这些计算机位于同一个10 Gbps
群集中,由同一个交换机互连。这些将被称为M1
,M2
,M3
。
我正在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
。
特别是:
C2
充当&#34; Master&#34 ;;它运行Namenode和Jobtracker服务。C3
和C1a
充当&#34; Slaves&#34;,它们运行Datanode和Tasktracker服务。我已经两次运行这个实验:
&#34;两个并发&#34;部署意味着有两个相同的部署,并发运行。为了进一步说明,当两个部署正在运行时,存在六个容器:
- C1b
上的M1
和C2a
- C2b
上的M2
和C3a
- C3b
上的M3
和C1a
C2a
,C3a
和C1b
属于同一个map-reduce执行,并按预期方式相互通信。容器C2b
,C3b
和{{1}}也是如此。
两种情况(1个并发部署,2个并发部署)都运行了10次,以获得良好的样本。这是1和2个并发部署的执行时间;很明显,通过2次并发部署,执行时间增加了6.72%。
我的问题是:为什么运行两个并发部署时执行时间会更长,即使我已将hadoop配置为使用尽可能少的线程?特别是:
我已经调查了以下内容:
我安装了PCM tools来测量执行期间的CPU利用率。这些工具安装在承载从属容器(Datanode,Tasktracker)的物理机之一上。
我测量了以下情况下处于活动状态的核心的利用率:
很明显,1或2个并发部署的CPU利用率是相似的,尽管1个部署平均略高。因此,CPU利用率似乎不是问题;我能错过什么?
请在评论中告诉我是否可以提供任何其他信息。
答案 0 :(得分:0)
要回答我自己的问题,最终的瓶颈是写入磁盘时的I / O带宽。在iotop
的帮助下,我测量了写作速度:
使用dd
我测量了最大写入速度:
# dd if=/dev/zero of=diskbench bs=1G count=1 conv=fdatasync
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB) copied, 7.38756 s, 145 MB/s
写入速度似乎恒定在10 MB /秒左右,通常达到120-160 MB /秒。一个自然的问题是“为什么我们要连续写入磁盘?”这就是hadoop的工作方式:映射器将其中间输出写入本地磁盘,而不是HDFS,因为它已经讨论了here。
因此,由于映射器连续写入本地硬盘,因此当运行多个hadoop执行时,即使我们有CPU处理能力,也会出现瓶颈。