我在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个核心,对吗?
答案 0 :(得分:16)
映射器和缩减器的最佳数量与很多事情有关。
目标主要在于使用的CPU功率,传输的数据量(在映射器中,映射器和减速器之间,以及减速器之外)和磁盘“头部运动”之间的平衡。
如果mapreduce作业中的每个任务都能以最少的磁头移动读取/写入数据,那么它们的效果最佳。通常被描述为“顺序读/写”。但是,如果任务受CPU限制,则额外的磁头移动不会影响作业。
在我看来,在这个具体案例中你有
处理这种情况的可能方法:
首先要做的就是:做一些测试运行,看看哪个设置在这个特定的工作和你的特定集群中表现最佳。
然后你有三个选择:
转移负荷的建议:
如果CPU绑定且所有CPU都已满载,则减少CPU负载:
如果IO绑定并且您还剩下一些CPU容量:
答案 1 :(得分:0)
引自“Hadoop The Definite Guide,3rd edition”,第306页
因为MapReduce作业正常 受I / O约束,拥有比处理器更多的任务更有意义 利用。
超额订阅量取决于作业的CPU利用率 你跑,但一个好的经验法则是一个到两个之间的因子 任务(计算map和reduce任务)比处理器。
上面引用的处理器相当于一个逻辑核心。
但这只是理论上的,很可能每个用例都不同于另一个,比如Niels的详细解释,需要进行一些测试。