Как сделать MapReduce на реплике Mongo с помощью пакета Perl MongoDB - PullRequest
2 голосов
/ 08 марта 2012

Я использую Perl v5.12 с пакетом MongoDB v0.45.

Я хотел бы запустить задание MapReduce, чтобы создать новую коллекцию, а затем создам курсор для дальнейшего использования. Другое мое желание - чтобы эта работа выполнялась на реплике, а не на мастере.

Как определено в perl doc, задания MapReduce должны выполняться с использованием метода run_command. Когда я выполняю Perl-скрипт, я получаю:

Mongo error: not master at perlib/Connections.pm line 63.

После прочтения документации MongoDB по CPAN, кажется, есть только способ, позволяющий курсорам читать из реплик. Так что этот метод не применим к вызовам run_command().

Вот мой код:

sub get_data {
    my $self = shift;
    my $dbh = shift;
    my $collection_h = shift;   
    my $since_time = $self->get_date_time(shift);
    my $loop_limit = $self->get_data_limit(shift);

    my %data = ();
    my $ctr = 0;

    my $temp_collection='temp_collection';

    my $ids = $dbh->run_command([
         "mapreduce" => $collection_h->{'name'}
        ,"map" => _get_map()
        ,"reduce" => _get_reduce()
        ,"query"    =>  {'to.id' => {'$exists'=>'true'}, 'updatedDate' => { '$gte' => $since_time }}
        ,"out" => $temp_collection      
    ]);

    die ("Mongo error: $ids") unless ref($ids) eq 'HASH';

        # next we create a cursor to this new collection
    my $cfs_h = $dbh->$temp_collection;
    my $id_cursor = $cfs_h->find()->limit($loop_limit);

    $id_cursor->slave_okay(1);
    $id_cursor->immortal(1);
    ...
}

sub _get_map {
    return "function() {emit(this.to.id, 1);}"; 
}

sub _get_reduce {

    return "function(k,vals) {return 1;}"
}

Кто-нибудь сталкивался с этой проблемой при попытке использовать MapReduce на реплике? Вы сделали это успешно? Если да, не могли бы вы поделиться, как вы это сделали.

1 Ответ

2 голосов
/ 08 марта 2012

При выполнении операции Map / Reduce для вторичного устройства результаты должны быть возвращены встроенными.Вывод должен быть возвращен с объектом «results» и не может быть записан на диск, потому что вторичные файлы не могут быть записаны.Когда результаты выводятся таким образом, для набора результатов существует ограничение в 16 МБ.Об этом есть примечание под маркером «{inline: 1}» в разделе «Параметры вывода» документации Map Reduce.http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-Outputoptions

...