【问题标题】:Concurrent "single-threaded" hadoop executions: where is the bottleneck?并发“单线程”hadoop 执行:瓶颈在哪里?
【发布时间】:2017-06-16 16:29:12
【问题描述】:

我正在运行一个计算密集型、基于 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 个容器。让我们假设C1M1 上产生,C2M2 上产生,C3M3 上产生。

特别是:

  • 一个容器C1,充当“Master”;它运行 Namenode 和 Jobtracker 服务。
  • 另外两个容器C2C3 充当“从属”,它们运行Datanode 和Tasktracker 服务。

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

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

“两个并发”部署意味着有两个相同的部署,同时运行。为了进一步澄清,当两个部署运行时,存在六个容器: - C1aC1b M1 - C2aC2b M2 - C3aC3b M3

C1aC2aC3a 属于同一个 map-reduce 执行,并按预期相互通信。容器C1bC2bC3b 也是如此。

执行时间

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

问题

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

  1. 我会遇到 PCIe 瓶颈或 CPU 瓶颈吗? (见下文)
  2. 在配置 hadoop 以使用尽可能少的线程时,我是否遗漏了其他一些事情?
  3. 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


    【解决方案1】:

    回答我自己的问题,最终的瓶颈是写入磁盘时的 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 处理能力,也会出现瓶颈。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-03
      • 2017-07-17
      • 2015-06-12
      • 2011-05-25
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多