【问题标题】:MapReduce in MongoDB doesn't outputMongoDB中的MapReduce不输出
【发布时间】:2013-06-03 01:14:06
【问题描述】:

我试图在一个集群上使用 MongoDB 2.4.3(也尝试过 2.4.4)和 mapReduce,该集群有 2 个分片,每 3 个副本。我对 mapReduce 作业的结果没有减少到输出集合有疑问。我试过Incremental Map Reduce。我也尝试过“合并”而不是减少,但这也没有用。

在 mongos 上运行 map reduce 命令:(coll 未分片)

db.coll.mapReduce(map, reduce, {out: {reduce: "events", "sharded": true}})

产生以下输出:

{
    "result" : "events",
    "counts" : {
        "input" : NumberLong(2),
        "emit" : NumberLong(2),
        "reduce" : NumberLong(0),
        "output" : NumberLong(28304112)
    },
    "timeMillis" : 418,
    "timing" : {
        "shardProcessing" : 11,
        "postProcessing" : 407
    },
    "shardCounts" : {
        "stats2/192.168.…:27017,192.168.…" : {
            "input" : 2,
            "emit" : 2,
            "reduce" : 0,
            "output" : 2
        }
    },
    "postProcessCounts" : {
        "stats1/192.168.…:27017,…" : {
            "input" : NumberLong(0),
            "reduce" : NumberLong(0),
            "output" : NumberLong(14151042)
        },
        "stats2/192.168.…:27017,…" : {
            "input" : NumberLong(0),
            "reduce" : NumberLong(0),
            "output" : NumberLong(14153070)
        }
    },
    "ok" : 1,
}

所以我看到 mapReduce 运行了 2 条记录,这导致输出了 2 条记录。然而,在两个分片的 postProcessCounts 中,输入计数保持为 0。还尝试通过搜索 _id 来查找记录不会产生任何结果。在 MongoDB 的日志文件中,我找不到与此相关的错误消息。

在尝试使用新创建的输出集合重现这一点后,我还在散列 _id 上进行了分片,并且我还提供了相同的索引,但我无法重现这一点。将相同的输入输出到不同的集合时

db.coll.mapReduce(map, reduce, {out: {reduce: "events_test2", "sharded": true}})

结果存储在输出集合中,我得到以下输出:

{
    "result" : "events_test2",
    "counts" : {
        "input" : NumberLong(2),
        "emit" : NumberLong(2),
        "reduce" : NumberLong(0),
        "output" : NumberLong(4)
    },
    "timeMillis" : 321,
    "timing" : {
        "shardProcessing" : 68,
        "postProcessing" : 253
    },
    "shardCounts" : {
        "stats2/192.168.…:27017,…" : {
            "input" : 2,
            "emit" : 2,
            "reduce" : 0,
            "output" : 2
        }
    },
    "postProcessCounts" : {
        "stats1/192.168.…:27017,…" : {
            "input" : NumberLong(2),
            "reduce" : NumberLong(0),
            "output" : NumberLong(2)
        },
        "stats2/192.168.…:27017,…" : {
            "input" : NumberLong(2),
            "reduce" : NumberLong(0),
            "output" : NumberLong(2)
        }
    },
    "ok" : 1,
}

当在第二个集合中再次使用相同的输入输出再次运行脚本时,它表明它在 postProcessCounts 中正在减少。所以 map 和 reduce 函数可以很好地完成它们的工作。为什么它不适用于较大的第一个集合?我在这里做错了吗?可用作 map-reduce 输出的集合是否有任何特殊限制?

【问题讨论】:

  • 为简单起见,既然这个集合没有分片(而且很小),为什么不将 mapreduce 运行到非共享输出集合中?
  • 最初你说 coll 没有被分片,但后来你说你再次尝试使用你分片的新集合。所以你让我不知道初始集合是否被分片以及为什么要对输出集合进行分片。
  • 输入集合没有分片,但输出集合是分片的。所以,问题是:在第一个分片集合中没有写入输出,尽管在第二个分片集合中被写入。出于测试目的,我在这里使用了一个小输入,以便更容易看到发生了什么,我计划在未来使用更大的输入来做到这一点。此外,更新现有记录(使用 reduce,请参阅 docs.mongodb.org/manual/tutorial/perform-incremental-map-reduce )非常方便。
  • 我已经尝试过您描述的多种排列方式,但无法重现您的问题。
  • 我在使用 Mongo 3.04 时遇到了同样的问题,您找到解决方法了吗?

标签: mongodb mapreduce


【解决方案1】:

mapReduce 运行 2 条记录,结果输出 2 条记录。然而,在两个分片的 postProcessCounts 中,输入计数保持为 0。

地图运行超过 2 条记录。如果这两条记录具有不同的键,则 Map 将输出 2 个键和每个键的值。这是正常的。

但是我在旧版本的 MongoDB 中注意到的一些事情(不确定这是否适用于您的情况)是,如果 reduce 阶段的“值数组”有长度,那么 reduce 将被跳过。

第一种情况下输出集合是空的吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 2012-03-09
    相关资源
    最近更新 更多