perl - 如何使用 Perl MongoDB 包在 Mongo 副本上进行 MapReduce

标签 perl mongodb mapreduce master-slave

我使用 Perl v5.12 和 MongoDB 包 v0.45。

我想运行 MapReduce 作业来创建一个新集合,然后为稍后创建一个游标。 我的另一个愿望是该作业在副本上运行,而不是在主服务器上运行。

根据 perl 文档中的定义,MapReduce 作业将使用 run_command 方法执行。 当我执行 perl 脚本时,我得到:

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

在阅读了 CPAN 上的 MongoDB 文档后,似乎只有一种方法可以让游标从副本中读取。因此该方法不适用于对 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 的问题吗? 你成功了吗? 如果是这样,您能分享一下您是如何做到的吗?

最佳答案

在辅助节点上执行 Map/Reduce 操作时,必须内联返回结果。输出必须与“结果”对象一起返回,并且不能写入磁盘,因为无法写入辅助对象。当以这种方式输出结果时,结果集的大小限制为 16MB。 MapReduce 文档的“输出选项”部分中的“{ inline : 1}”项目符号下有对此的注释。 http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-Outputoptions

关于perl - 如何使用 Perl MongoDB 包在 Mongo 副本上进行 MapReduce,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9621480/

相关文章:

perl - "$$q"在 Perl 中是什么意思?

perl - 如何在两个文件中找到两个匹配的ID,然后用它们的值来计算

Docker 中的 MongoDB - 容器关闭时的备份数据库

hadoop - HBase mapreduce job - 多次扫描 - 如何设置每次扫描的表

apache - 当我在 CentOS 7 上安装 Request Tracker 时,为什么会出现错误 'Can' tlocate Plack/Handler/Apache2.pm in @INC'?

javascript - Express 没有得到查询 Mongodb 的其他函数的返回

python - pymongo 64 位无符号整数

hadoop - 如何检索失败的hadoop reduce任务,使用成功的 map 计算

hadoop - 如何将 ZooKeeper 与 Hadoop 一起用于在 reducer 之间共享读/写变量

perl - 如何开始为 CPAN 编写模块?