当前位置: 首页 > 知识库问答 >
问题:

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

周和安
2023-03-14

我在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 个映射器的结果:列 = 映射器行数 = 化简器数

+---------+---------+---------+---------+---------+
|         |    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个映射器时,程序运行速度似乎稍快一些,但是为什么当我增加化简器的数量时,它会变慢呢?(例如,8个映射器/2个转换器比8个映射器/8个转换器快)

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

共有2个答案

金昌胤
2023-03-14

引用自“Hadoop The Delimited Guide,第3版”,第306页

由于MapReduce作业通常是I / O绑定的,因此拥有比处理器更多的任务以获得更好的利用率是有意义的。

超额订阅的数量取决于您运行的作业的 CPU 利用率,但一个好的经验法则是,任务的因子应比处理器多一到两个(同时计算 map 和 reduce 任务)。

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

但这只是理论上的,很可能每个用例都不同,就像Niels的详细解释一样,需要执行一些测试。

房学文
2023-03-14

映射器和还原器的最佳数量与许多事情有关。

主要目标是在使用的CPU能力、传输的数据量(在映射器中、在映射器和减速器之间以及在减速器外)和磁盘“磁头移动”之间取得平衡。

如果mapreduce作业中的每个任务都能“以最小的磁头移动”读/写数据,则其工作效果最佳。通常称为“顺序读/写”。但是,如果任务受CPU限制,额外的磁头移动不会影响作业。

在我看来,在这个特定的案例中

  • 一个映射器,它需要相当多的CPU周期(也就是说,更多的映射器使它运行得更快,因为CPU是瓶颈,磁盘可以跟上提供输入数据的速度)
  • 一种几乎不占用CPU周期且主要受IO限制的减速机。这导致使用单个减速机时,您仍然是CPU受限的,而使用4个或更多减速机,您似乎是IO受限的。因此,4个减速器会导致磁头“移动过多”

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

首先完全按照您所做的去做:做一些测试运行,看看对于这个特定的作业和您的特定集群,哪个设置执行得最好。

那么你有三个选择:

  • 接受你所拥有的处境
  • 将负载从CPU转移到磁盘或相反。
  • 获取更大的集群:更多CPU和/或更多磁盘。

移载建议:

> < li>

如果CPU受限且所有CPU都满载,则减少CPU负载:

  • 检查代码中不必要的CPU周期。
  • 切换到“较低的CPU影响”压缩编解码器:即从GZip到Snappy或“无压缩”。
  • 调整工作中映射器/缩减器的数量。

如果 IO 受限,并且您还剩下一些 CPU 容量:

    < li >启用压缩:这使CPU工作更努力,并减少磁盘必须做的工作。 < li >尝试各种压缩编解码器(我建议坚持使用Snappy或Gzip...我经常用Gzip)。 < li >调整您工作中映射器/缩小器的数量。
 类似资料:
  • 我是hadoop领域的新手,正在努力完成一个简单的任务。 有人能告诉我如何仅使用Map duce代码技术来获取字数示例的前n个值吗? 我不想为这个简单的任务使用任何hadoop命令。

  • 在实验了2个reducer之后,阅读了Hadoop Wiki中的HowManyMapsAndReduces,Hadoop:reducer的数量保持不变,并且设置了映射任务和reduce任务的数量,我得到的结论是: 如果我有1个map(我知道这个数字实际上是由Hadoop决定的)和2个reducer(实际上我只提供了1个带有reducer代码的文件,例如),那么下面会发生什么? null 我想第一个

  • 我的问题是。Apache Hadoop在其文档中提到了以下一个Hadoop流的示例代码: 现在我向这个流媒体提供一个文本文件。假设,文本文件只包含以下两行: hadoop流媒体命令工作得很好,没有问题。 但我无法回答以下问题,尽管我在网上多次阅读了上述链接材料和其他例子。假设只有一个映射器和一个减速机: 据我所知,Mapper获取(键、值)对作为输入。在上述两行中,什么是关键,什么是价值 我知道这

  • 问题内容: 我刚刚开始使用hadoop / hbase MapReduce工作(使用cloudera),但我有以下问题: 假设我们有一个带有主要和静态viariable的java类。该类定义与Mapper和Reducer任务相对应的内部类。在启动作业之前,主程序初始化静态变量。在Mapper类中读取此变量。然后使用群集上的“ hadoop jar”启动该类。 我的问题:我看不到其他节点上的Map和

  • 我很困惑为什么会发生这种情况。我已经在这方面工作了一段时间,我只是不明白。 我的Map代码工作时,我能够在它所在的目录中验证输出。 文件中的输出如下所示: 但是为什么我不能拆分

  • 我使用的是hadoop版本0.20和hadoop-core:1.2.0.jar 有没有可能使用新的hadoop API做到这一点?