我在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个内核,对吗?
引用自“Hadoop The Delimited Guide,第3版”,第306页
由于MapReduce作业通常是I / O绑定的,因此拥有比处理器更多的任务以获得更好的利用率是有意义的。
超额订阅的数量取决于您运行的作业的 CPU 利用率,但一个好的经验法则是,任务的因子应比处理器多一到两个(同时计算 map 和 reduce 任务)。
上面引用的处理器相当于一个逻辑核。
但这只是理论上的,很可能每个用例都不同,就像Niels的详细解释一样,需要执行一些测试。
映射器和还原器的最佳数量与许多事情有关。
主要目标是在使用的CPU能力、传输的数据量(在映射器中、在映射器和减速器之间以及在减速器外)和磁盘“磁头移动”之间取得平衡。
如果mapreduce作业中的每个任务都能“以最小的磁头移动”读/写数据,则其工作效果最佳。通常称为“顺序读/写”。但是,如果任务受CPU限制,额外的磁头移动不会影响作业。
在我看来,在这个特定的案例中
处理这种情况的可能方法:
首先完全按照您所做的去做:做一些测试运行,看看对于这个特定的作业和您的特定集群,哪个设置执行得最好。
那么你有三个选择:
移载建议:
> < li>
如果CPU受限且所有CPU都满载,则减少CPU负载:
如果 IO 受限,并且您还剩下一些 CPU 容量:
我是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做到这一点?