Узнайте MongoDB MapReduce опид - PullRequest
       4

Узнайте MongoDB MapReduce опид

0 голосов
/ 21 февраля 2012

Я выполняю несколько длительных операций mapreduce на MongoDB, и я хотел бы получить опид для этой операции во время ее выполнения.Используя драйвер C #, MapReduce вызов блокируется, поэтому он возвращается после завершения операции.

Я хотел бы иметь возможность помечать операции 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;
    }
}

1 Ответ

0 голосов
/ 22 февраля 2012

Как насчет того, чтобы заставить MapReduceJob создать новый поток для выполнения вызова сокращения карты блокировки?Вы должны быть в состоянии легко определить, сокращает ли карта выполнение заданий, поддерживая правильно синхронизированный флаг, который сообщает вам, выполнено ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...