我对 Hadoop MapReduce 有几个基本问题。
- 假设如果执行了 100 个映射器并且零减速器。它会生成100个文件吗?所有个体都排序?对所有映射器输出进行排序?
- reducer 的输入是 Key -> Values。对于每个键,所有值都排序?
- 假设是否执行了 50 个减速器。它会生成50个文件吗?所有单个文件都已排序?对所有减速器输出进行排序?
在 MapReduce 中是否有保证排序发生的地方?
1.假设如果执行了 100 个映射器并且零减速器。它会生成100个文件吗?
是的。
所有个体都排序?
不,如果没有使用 reducer,那么 mapper 的输出不会被排序。只有在减少阶段时才会进行排序。
对所有映射器输出进行排序?
不,出于与上述相同的原因。
2.reducer 的输入是 Key -> Values。对于每个键,所有值都排序?
不,但是,键是排序的。在reducer获取映射器的输出的混洗阶段之后,它对映射器的排序输出键进行合并排序(因为存在一个reduce阶段),当它开始reducer时,对键进行排序。
3.假设如果执行了 50 个 reducer。它会生成50个文件吗?
是的。(除非您使用MultipleOutputs)
所有单个文件都已排序?
不,排序后的输入并不能保证排序后的输出。输出取决于您在 reduce 方法中使用的算法。
对所有减速器输出进行排序?
不,出于与上述相同的原因。但是,如果您使用 Identity Reducer,即,您只需在得到它时编写 reducer 的输入,reducer 的输出将按 PER REDUCER 排序,而不是全局排序。
在 MapReduce 中是否有保证排序发生的地方?
当存在 reduce 阶段时会进行排序,并将其应用于每个 mapper 的输出键和每个 reducer 的输入键。如果要对减速器的输入进行全局排序,可以使用单个减速器,也可以使用TotalOrderPartitioner,这有点棘手......