并发"单线程" hadoop执行:瓶颈在哪里?

时间:2017-06-11 23:27:40

标签: hadoop concurrency

我正在运行一个计算密集型,基于hadoop的map-reduce应用程序。我已将hadoop配置为使用尽可能少的线程,但多个并发部署会导致应用程序的执行时间增加。

我无法找到执行时间增加的原因,因此必须存在我未发现的瓶颈和/或我错过的配置参数。

试验台

我的测试平台由3台Dell PowerEdge R630组成,每台都有Intel Xeon E5-2630v3:8个核心,2个线程/核心。这些计算机位于同一个10 Gbps群集中,由同一个交换机互连。这些将被称为M1M2M3

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个容器C1C2C3,每个物理机器有1个容器。我们假设C1上的M1C2上的M2C3上的M3产生了C1

特别是:

  • 一个容器C2充当&#34; Master&#34 ;;它运行Namenode和Jobtracker服务。
  • 另外两个容器C3C1a充当&#34; Slaves&#34;,它们运行Datanode和Tasktracker服务。

我已经两次运行这个实验:

  • 一次并发部署
  • 两个并发部署

&#34;两个并发&#34;部署意味着有两个相同的部署,并发运行。为了进一步说明,当两个部署正在运行时,存在六个容器:   - C1b上的M1C2a   - C2b上的M2C3a   - C3b上的M3C1a

C2aC3aC1b属于同一个map-reduce执行,并按预期方式相互通信。容器C2bC3b和{{1}}也是如此。

执行时间

两种情况(1个并发部署,2个并发部署)都运行了10次,以获得良好的样本。这是1和2个并发部署的执行时间;很明显,通过2次并发部署,执行时间增加了6.72%。

MapReduce Execution time

问题

我的问题是:为什么运行两个并发部署时执行时间会更长,即使我已将hadoop配置为使用尽可能少的线程?特别是:

  1. 我可能是PCIe瓶颈还是CPU瓶颈? (见下文)
  2. 在配置hadoop以尽可能少使用线程时,我是否遗漏了其他内容?
  3. hadoop是否使用了比我所知道的更多的线程,这可能会使CPU或其他资源拥塞?
  4. 我已经调查了以下内容:

    • 带宽消耗:我们绝对不是网络瓶颈。该网络可以承受高达10 Gbps的速度,平均而言,该应用程序的消耗不会超过400-500 Mbps,并且没有其他人使用该集群。
    • PCIe:我已经测量了PCIe带宽,以调查我是否在那里遇到瓶颈。我打开了一个related question on Superuser,询问我的读数是否表明PCI充血。
    • CPU利用率:请参阅下一节。

    CPU指标

    我安装了PCM tools来测量执行期间的CPU利用率。这些工具安装在承载从属容器(Datanode,Tasktracker)的物理机之一上。

    我测量了以下情况下处于活动状态的核心的利用率:

    • 空闲(标有&#34; 0租户&#34;)
    • 1个并发部署(标记为&#34; 1个租户&#34;)
    • 2个并发部署(标记为&#34; 2个租户&#34;)

    CPU utilization

    很明显,1或2个并发部署的CPU利用率是相似的,尽管1个部署平均略高。因此,CPU利用率似乎不是问题;我能错过什么?

    请在评论中告诉我是否可以提供任何其他信息。

1 个答案:

答案 0 :(得分:0)

要回答我自己的问题,最终的瓶颈是写入磁盘时的I / O带宽。在iotop的帮助下,我测量了写作速度:

enter image description here

使用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处理能力,也会出现瓶颈。