翻译或纠错本页面

Map-Reduce和分片集合

MongoDB支持在分片集合上进行Map-reduce运算,既可以将分片集合作为运算的输入,也可以作为输出。本章节将会讲解分片集合上 mapReduce 的注意事项.

将分片集合作为输入

当使用分片集合作为map-reduce的输入时, mongos 会自动将map-reduce任务分发到所有分片服务器以并行执行,不需要额外的选项, mongos 会等待所有分片返回运算结果。

将分片集合作为输出

如果 mapReduce 命令的 out 字段有 sharded 值,MongoDB会用 _id 做片键将输出进行分片.

将结果输出到分片集合中

  • 如果输出的集合不存在,MongoDB会创建并使用 _id 作为片键.

  • 对于新的或者空的分片集合,MongoDB使用map-reduce最初阶段产生的结果进行 数据块 的初始化。

  • mongos 并发的为每个拥有数据块的分片分发map-reduce的后处理命令.在后处理阶段,每个分片服务器会从其他分片读取属于自己分块的数据,执行最终的reduce/finalize,并把结果写到本地的输出集合。

注解

  • 在之后的map-reduce任务中,MongoDB根据需要进行数据块的分裂.

  • 在后处理阶段,为避免并发问题,数据块的迁移被自动停止.

在MongoDB 2.0中

  • mongos 从每个分片获得结果,并对结果进行合并排序,如果需要会进行reduce步骤。之后 mongos 将结果输出到分片集合中.

  • 这种模型即使数据量很大,也只需要少量内存即可进行.

  • 集群中的数据块在写入时不会进行自动分裂,需要人工干预使得数据均衡.

重要

For best results, only use the sharded output options for mapReduce in version 2.2 or later.