1

我有一个 MapReduce 作业,我只想在辅助服务器上运行。MapReduce 输出将创建一个临时集合来存储结果,我想从该集合中读取结果,然后删除该集合。

4

2 回答 2

2

您不能运行输出到 MongoDB 辅助节点上的集合的 MapReduce 作业。您只能在 MongoDB 主节点上直接插入/更新数据。

但是,您可以使用以下参数内联返回MapReduce输出:out

out: { inline: 1 }

请注意,内联输出仅限于最大文档大小(在 MongoDB 2.4 中为 16 兆字节)。

于 2013-08-29T04:27:05.833 回答
0

上面的答案是准确的。仅提及其他信息:

  • Map-Reduce(和聚合管道作业)必须是只读的(从数据库的角度来看)才能在辅助节点上运行。
  • 对于 MR,需要传递设置inline参数outline

示例(来源):

RS-replica-0:PRIMARY> db.txns.findOne()
{
    "_id" : ObjectId("584a3b71cdc1cb061957289b"),
    "custid" : "cust_66",
    "txnval" : 100,
    "items" : [{"sku": sku1", "qty": 1, "pr": 100}, ...],
...
}
RS-replica-0:PRIMARY> var mapFunc = function() { emit(this.custid, this.txnval); }
RS-replica-0:PRIMARY> var reduceFunc = function(key, values) { return Array.sum(values); }
RS-replica-0:PRIMARY> db.txns.mapReduce(mapFunc, reduceFunc, {out: { inline: 1 }})
{
    "results" : [
        {
            "_id" : "cust_0",
            "value" : 72734
        },
        {
            "_id" : "cust_1",
            "value" : 67737
        },
...
    ]
    "timeMillis" : 215,
    "counts" : {
        "input" : 10000,
        "emit" : 10000,
        "reduce" : 909,
        "output" : 101
    },
    "ok" : 1

}
  • 在分片集群的情况下,即使遵循所有规则(Source),MapReduce 作业也不会在辅助节点上运行。这是一个已知的错误,请投票,以便 MongoDB 人员在这些天修复它。:)
于 2017-01-30T07:36:12.973 回答