我在Java中编写了一个简单的Map / Reduce程序,用于两个文本文件的关系连接操作。该算法在许多地方都有描述,它们在Reduce任务中进行连接。
我想调整它以获得更好的性能。首先要尝试不同数量的Reduce任务。目前我只在一台具有4核的计算机上运行,但实际上是在分布式文件系统中。
我遇到了这个奇怪的现象,就是说,如果我运行4个或32个减少任务的壁时间(时间统计到时间结束)甚至更长一点,比我只运行1个减少任务的时间:< / p>
1 reducer: 22.4 seconds
4 reducer: 23.3 seconds
32 reducer: 26.1 seconds
通过观察这一趋势,我无法解释。第一印象是瓶颈会在I / O中,因为我在一台机器上运行,高I / O操作并不是真正的并行。但是,通过查看CPU统计信息,I / O等待时间非常短(输入数据在我的测试数据中只有几兆字节),所以它看起来不是一个好的解释。
有一点需要注意的是,我在运行map / reduce程序时监视不同内核的CPU使用情况,而且我发现大多数时候CPU占用率仅限于一个内核,并且看起来并不像并行
我还怀疑运行更多减速器的好处可以通过额外的map / reduce开销来消除。
您如何看待这个?
[更新]我发现了声明(也通过一些时序观察证明),在单个JVM中,map和reduce任务只能以串行方式运行,而不能以多线程方式运行。这将解释为什么结果是更多的时间与更多的减速器任务。
我看到Hadoop使用MultithreadedMapper类支持多线程映射器,我试过,不幸的是结果再次变得更糟。
但我不知道为什么会有一个名为MultithreadedMapper的类,但为什么还有另一个类似MultithreadedReducer?
答案 0 :(得分:1)
应根据可用的reduce任务槽配置减少器数量。 4/32减速器的应用时间更长是因为: 1)机器是4芯,因此减速器的理想数量应该在2左右。 2)输入数据非常小,因此初始化reduce任务所花费的时间多于并行处理。
为了在相同硬件上获得更好的基准测试,请使用reducers测试应用程序为1,2和最多3.另外,使用一些较重的数据集(至少几个块,即512 MB到1 GB)。
答案 1 :(得分:0)
对于这个问题,我想我找到了答案。当我以独立模式运行时,Hadoop根本不会尝试在多线程中运行映射器和reducer。这完美地解释了我在时间上的发现。
另一方面,我看到文章和帖子说在Pseduo模式下运行将启用并发运行(或更精确的多进程)。 我试过但有一些问题。但是我认为这是一个新问题所以可以回答这个问题。