当我对 Hadoop 进行一些性能调整时,我遇到了一个非常奇怪的情况。我正在运行一个具有大量中间输出的作业(例如没有组合器的 InvertedIndex 或 WordCount),网络和计算资源都是同质的。根据 mapreduce 的工作方式,当WAVES更多时对于reduce任务,由于map和shuffle之间的重叠较少,因此整体运行时间应该更慢,但事实并非如此。事实证明,具有 5 WAVES 减少任务的作业比仅具有 1 个 WAVE 任务的作业快 10%。我检查了日志,结果发现当reduce任务较少时,map任务的执行时间较长,而且当任务较少时,reduce阶段的整体计算时间(不是shuffle或merge)较长。我试图通过将reduce slow-start factor设置为1来排除其他因素,这样map和shuffle之间就没有重叠,我还将它限制为同时执行一个reduce任务,所以没有重叠在 reduce 任务之间,我修改了调度程序以强制 mapper 和 reducer 定位在不同的机器上,这样就不会出现 I/O 拥塞。即使采用上述方法,同样的事情仍然会发生。(我还将映射内存缓冲区设置为足够大,并将 io.sort.factor 设置为 32 甚至更大,并且 io.sort.mb 相应地大于 320)
我真的想不出导致这个问题的任何其他原因,所以任何建议将不胜感激!
以防万一,我遇到的问题是:
0. 我正在比较在所有其他相同配置下运行同一作业的 1 个 reduce 任务与 5 个 reduce 任务的性能。减少计算只有一个任务跟踪器。
1.我强制所有reduce任务顺序执行,在这两种情况下只有一个tasktracker用于redcue任务,mapred.tasktracker.reduce.tasks.maximum=1,所以在reduce阶段不会有任何并行性
2. 我设置了 mapred.reduce.slowstart.completed.maps=1 所以在所有 map 完成之前没有一个 reducer 会开始拉数据
3. 事实证明,拥有一个 reduce 任务比拥有 5 个 SEQUENTIAL 任务要慢!
4. 即使我设置了 set mapred.reduce.slowstart.completed.maps=0.05 以允许 map 和 shuffle 之间的重叠,(因此当只有一个 reduce 任务时,重叠应该更多,它应该运行得更快,因为 5 reduce 任务按顺序执行)5-reduce-task 仍然比 1-reduce 任务快,1-reduce 任务的 map 阶段变得更慢!