0
我在MongoDB上運行多個長時間運行的mapreduce操作,我想在運行時獲取該操作的opid。使用C#驅動程序,MapReduce
調用被阻塞,所以在操作完成後它會回來。找出MongoDB MapReduce opid
我希望能夠標記mapreduce操作,以便我可以檢查他們的進度,我現在唯一能想到的方法是創建一個具有唯一標識符的JavaScript變量,並遍歷db.currentOp
的輸出爲那個變量。有沒有更好的方法來做到這一點?
代碼的問題:
MongoCollection<BsonDocument> logCollection = database.GetCollection<BsonDocument>("source_collection");
BsonJavaScript map = new BsonJavaScript(@"function() { //map }");
BsonJavaScript reduce = new BsonJavaScript(@"function(key,values){ //reduce }");
var builder = new MapReduceOptionsBuilder();
builder.SetOutput("output_collection");
MapReduceResult mapReduceResult = logCollection.MapReduce(map, reduce, builder); //<--- Blocks until the mapreduce job completes
我會喜歡要做的就是提交的MapReduce的工作異步和檢查進度,因爲它運行像這樣(注意是由MapReduceJob
類):
MongoCollection<BsonDocument> logCollection = database.GetCollection<BsonDocument>("source_collection");
BsonJavaScript map = new BsonJavaScript(@"function() { //map }");
BsonJavaScript reduce = new BsonJavaScript(@"function(key,values){ //reduce }");
var builder = new MapReduceOptionsBuilder();
builder.SetOutput("output_collection");
MapReduceJob job = logCollection.StartMapReduce(map, reduce, builder); //<--- Returns straight away
while (true)
{
Thread.Sleep(1000);
var operationDoc = database.GetCurrentOp();
var operations = operationDoc["inprog"].AsBsonArray;
var thisOperation = operations.FirstOrDefault(op => op["opid"] == job.OpId);
if (thisOperation == null)
break;
}
}
不完全。如果作業運行超時,則MapReduce調用將引發超時異常,但作業將繼續運行。它也不讓我跟蹤進度,這可能使用'currentOp'輸出。 – 2012-02-22 04:11:45
在這種情況下,您確實必須輪詢地圖縮減作業的$ cmd.sys.inprog集合。我並不十分熟悉C#驅動程序的API,但實際上可以在js:m.r. )。但是,這隻適用於你的m和r函數很小的情況,否則它會顯示「查詢不記錄(太大)」。 – Ren 2012-02-22 16:02:55