在 Hadoop 中,reduce 任务什么时候开始?它们是否在一定比例(阈值)的映射器完成后开始?如果是这样,这个阈值是固定的吗?通常使用什么样的阈值?
最佳答案
reduce 阶段有 3 个步骤:shuffle、sort、reduce。 Shuffle 是 reducer 从每个 mapper 收集数据的地方。这可能在映射器生成数据时发生,因为它只是数据传输。另一方面,排序和归约只能在所有映射器完成后才能开始。您可以通过查看 reducer 完成百分比来判断 MapReduce 在做什么:0-33% 表示它在做 shuffle,34-66% 是排序,67%-100% 是 reduce。这就是为什么您的 reducer 有时似乎“停滞”在 33%——它正在等待映射器完成。
Reducers 根据已完成的映射器百分比阈值开始洗牌。您可以更改参数以使 reducer 早晚启动。
为什么尽早启动 reducer 是一件好事?因为它随着时间的推移分散了从映射器到缩减器的数据传输,如果您的网络是瓶颈,这是一件好事。
为什么过早启动 reducer 是一件坏事?因为他们“占用”减少了插槽,同时只复制数据并等待映射器完成。稍后开始的另一个实际使用 reduce 插槽的作业现在无法使用它们。
您可以通过更改 mapred-site.xml
中 mapred.reduce.slowstart.completed.maps
的默认值来自定义 reducer 何时启动。 1.00
的值将在启动 reducer 之前等待所有映射器完成。 0.0
的值将立即启动 reducer 。 0.5
的值将在一半映射器完成时启动缩减器。您还可以逐个作业更改 mapred.reduce.slowstart.completed.maps
。 在新版本的 Hadoop(至少 2.4.1)中调用的参数是 mapreduce.job.reduce.slowstart.completedmaps
(感谢用户 yegor256)。
通常,如果系统同时运行多个作业,我喜欢将 mapred.reduce.slowstart.completed.maps
保持在 0.9
以上。这样,当 reducers 除了复制数据之外什么都不做时,工作就不会占用 reducers。如果您一次只运行一个作业,则执行 0.1
可能是合适的。
关于hadoop - Hadoop 中的 reduce 任务什么时候开始?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11672676/