map/reduce墙时间对reduce任务的数量不敏感

2ul0zpep  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(276)

我用java编写了一个简单的map/reduce程序,用于两个文本文件的关系连接操作。该算法在很多地方都有描述,即在reduce任务中进行连接。
我想把它调得更好。第一件事是尝试不同数量的reduce任务。目前我只在一台4核的计算机上运行,但实际上是在分布式文件系统中运行。
我遇到了一个奇怪的现象,如果我运行4个或32个reduce任务,墙时间(time stat直到time finish)甚至比我只运行1个reduce任务的时间还要长:

1 reducer:  22.4 seconds
4 reducer:  23.3 seconds
32 reducer:  26.1 seconds

从这个趋势来看,我真的无法解释。第一个印象是瓶颈在i/o,因为我在一台机器上运行,高i/o操作并不是真正并行的。但是,通过查看cpu stat,i/o等待时间非常小(并且输入数据在我的测试数据中只有几兆字节),因此这看起来不是一个很好的解释。
值得一提的是,我在运行map/reduce程序时监视了不同内核的cpu使用情况,我发现大多数情况下cpu使用情况仅限于一个内核,看起来不像是并行的。
我还怀疑运行更多reducer的好处被额外的map/reduce开销所抵消。
你觉得这个怎么样?
[更新]我发现了这样一种说法(通过一些计时观察也证明了这一点),即在单个jvm中,map和reduce任务只能串行运行,而不是多线程运行。这将解释为什么结果是更多的时间与更多的任务。
我看到hadoop使用multi-threadedmapper类支持多线程Map器,我尝试了,不幸的是结果再次变得更糟。
但是我不知道为什么会有一个类叫做multi-threadedmapper,但是为什么会有另一个类似multi-threadedreducer的类呢?

2admgd59

2admgd591#

减速器的数量应根据可用的减速器任务插槽进行配置。使用4/32减速机所需时间较长是因为:1)机器是4芯的,所以理想的减速机数量应该在2个左右。2) 输入数据非常小,因此初始化reduce任务所花费的时间比并行处理要多。
为了在同一硬件上更好地进行基准测试,请使用1、2和最多3个减速机来测试应用程序。另外,使用一些较重的数据集(至少几个块,即512 mb到1 gb)。

jgwigjjp

jgwigjjp2#

对于这个问题,我想我找到了答案。当我以独立模式运行mapper和reducer时,hadoop根本不尝试在多线程中运行mapper和reducer。这很好地解释了我在计时中的发现。
另一方面,我看到一些文章和帖子说,在psedio模式下运行将允许并发运行(或者更确切地说是多进程)。我试过了,但有点问题。不过,我认为这是一个新问题,所以这个问题可以说是回答了。

相关问题