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

kab*_*han 8 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     |
+----------+----------+----------+
Run Code Online (Sandbox Code Playgroud)

编辑

1-8个reducer和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  |
+---------+---------+---------+---------+---------+
Run Code Online (Sandbox Code Playgroud)

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

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

Nie*_*jes 16

最佳的映射器和缩减器数量与很多东西有关.

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

mapreduce作业中的每个任务如果能够以最小的磁头移动读取/写入数据,则效果最佳.通常被描述为"顺序读/写".但是,如果任务受CPU限制,则额外的磁头移动不会影响作业.

在我看来,在这种具体情况下,你有

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

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

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

那你有三个选择:

  • 接受你的情况
  • 将负载从CPU转移到磁盘或相反.
  • 获得更大的集群:更多CPU和/或更多磁盘.

转移负载的建议:

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

    • 检查代码中是否有不必要的CPU周期.
    • 切换到'低CPU影响'压缩编解码器:即从GZip转到Snappy或"无压缩".
    • 调整作业中的映射器/缩减器数量.
  • 如果IO绑定并且您还有一些CPU容量:

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