簡體   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