2012-02-21 96 views
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; 
    } 
} 

回答

0

如何使MapReduceJob創建一個新線程來執行阻塞映射reduce調用?您應該能夠通過維護一個正確同步的標誌來告訴您它是否完成,從而可以輕鬆判斷地圖是否縮短作業的完成時間。

+0

不完全。如果作業運行超時,則MapReduce調用將引發超時異常,但作業將繼續運行。它也不讓我跟蹤進度,這可能使用'currentOp'輸出。 – 2012-02-22 04:11:45

+0

在這種情況下,您確實必須輪詢地圖縮減作業的$ cmd.sys.inprog集合。我並不十分熟悉C#驅動程序的API,但實際上可以在js:m.r. )。但是,這隻適用於你的m和r函數很小的情況,否則它會顯示「查詢不記錄(太大)」。 – Ren 2012-02-22 16:02:55