Hadoop:映射器和缩减器的数量

时间:2013-12-01 00:40:32

标签: hadoop mapreduce

我在1.1GB文件上多次运行Hadoop MapReduce,使用不同数量的映射器和缩减器(例如1个映射器和1个减速器,1个映射器和2个减速器,1个映射器和4个减速器,......)

Hadoop安装在具有超线程的四核机器上。

以下是按最短执行时间排序的前5个结果:

+----------+----------+----------+
|  time    | # of map | # of red |
+----------+----------+----------+
| 7m 50s   |    8     |    2     |
| 8m 13s   |    8     |    4     |
| 8m 16s   |    8     |    8     |
| 8m 28s   |    4     |    8     |
| 8m 37s   |    4     |    4     |
+----------+----------+----------+

修改

1 - 8减速器和1 - 8个映射器的结果: column = mappers的数量 row =减速器数量

+---------+---------+---------+---------+---------+
|         |    1    |    2    |    4    |    8    |
+---------+---------+---------+---------+---------+
|    1    |  16:23  |  13:17  |  11:27  |  10:19  |
+---------+---------+---------+---------+---------+
|    2    |  13:56  |  10:24  |  08:41  |  07:52  |
+---------+---------+---------+---------+---------+
|    4    |  14:12  |  10:21  |  08:37  |  08:13  |  
+---------+---------+---------+---------+---------+
|    8    |  14:09  |  09:46  |  08:28  |  08:16  |
+---------+---------+---------+---------+---------+

(1) 当我有8个映射器时,看起来程序运行得稍微快一点,但为什么它会随着我增加减速器的数量而减慢? (例如8mappers / 2reducers比8mappers / 8reducers更快)

(2) 当我只使用4个映射器时,它有点慢,因为我没有使用其他4个核心,对吗?

2 个答案:

答案 0 :(得分:16)

映射器和缩减器的最佳数量与很多事情有关。

目标主要在于使用的CPU功率,传输的数据量(在映射器中,映射器和减速器之间,以及减速器之外)和磁盘“头部运动”之间的平衡。

如果mapreduce作业中的每个任务都能以最少的磁头移动读取/写入数据,那么它们的效果最佳。通常被描述为“顺序读/写”。但是,如果任务受CPU限制,则额外的磁头移动不会影响作业。

在我看来,在这个具体案例中你有

  • 一个执行相当多CPU周期的映射器(即,更多的映射器使其更快,因为CPU是瓶颈,磁盘可以保持提供输入数据)。
  • 一个几乎没有CPU周期且主要是IO绑定的reducer。这导致使用单个reducer仍然是CPU绑定的,但是有4个或更多的reducer你似乎是IO绑定的。因此,4个减速器会导致磁头移动“太多”。

处理这种情况的可能方法:

首先要做的就是:做一些测试运行,看看哪个设置在这个特定的工作和你的特定集群中表现最佳。

然后你有三个选择:

  • 接受你的情况
  • 将负载从CPU转移到磁盘或反之亦然。
  • 获取更大的群集:更多CPU和/或更多磁盘。

转移负荷的建议:

  • 如果CPU绑定且所有CPU都已满载,则减少CPU负载:

    • 检查代码中是否有不必要的CPU周期。
    • 切换到'低CPU影响'压缩编解码器:I.e。从GZip到Snappy或“不压缩”。
    • 调整作业中的地图制作者/缩减者数量。
  • 如果IO绑定并且您还剩下一些CPU容量:

    • 启用压缩:这会使CPU工作更加困难并减少磁盘必须完成的工作。
    • 尝试各种压缩编解码器(我建议坚持使用Snappy或Gzip ......我经常使用Gzip)。
    • 调整作业中的地图制作者/缩减者数量。

答案 1 :(得分:0)

引自“Hadoop The Definite Guide,3rd edition”,第306页

  

因为MapReduce作业正常   受I / O约束,拥有比处理器更多的任务更有意义   利用。

     

超额订阅量取决于作业的CPU利用率   你跑,但一个好的经验法则是一个到两个之间的因子   任务(计算map和reduce任务)比处理器。

上面引用的处理器相当于一个逻辑核心。

但这只是理论上的,很可能每个用例都不同于另一个,比如Niels的详细解释,需要进行一些测试。