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.