繁体   English   中英

MongoDB中的MapReduce不输出

[英]MapReduce in MongoDB doesn't output

我试图在一个集群上使用带有mapReduce的MongoDB 2.4.3(也尝试过2.4.4),每个集合包含2个分片。 我有一个问题,mapReduce作业的结果没有减少到输出集合。 我尝试了增量贴图减少 我也试过“合并”而不是减少,但这也没有用。

map reduce命令在mongos上运行:( 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运行2条记录,导致输出2条记录。 但是在两个分片的postProcessCounts中,输入计数保持为0。

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

但是我在较早版本的MongoDB中注意到的事情(不确定这是否适用于你的情况)是,如果reduce阶段的“values array”有一个长度,那么将会跳过reduce。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM