【问题标题】:How to MapReduce on Mongo replica using the Perl MongoDB package如何使用 Perl MongoDB 包在 Mongo 副本上进行 MapReduce
【发布时间】:2012-03-26 03:52:36
【问题描述】:

我正在使用 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 的问题? 你成功了吗? 如果是这样,您能否分享一下您是如何做到的。

【问题讨论】:

    标签: perl mongodb mapreduce master-slave


    【解决方案1】:

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

    【讨论】:

    • 我担心随着数据集的不断增长,内联返回结果将无法扩展。是否有可以在从属设备中创建新集合的设置?这样,MapReduce 功能是否可以成功完成?
    • 请原谅延迟回复。不幸的是没有。当前无法强制写入辅助节点。一种可能的解决方法是停止辅助,在不同的端口号上将 mongod 作为独立进程启动(这很重要,因此 RS 的其他成员看不到它),执行 Map-Reduce 操作,将集合复制到需要的地方,然后停止独立的mongod进程并作为副本集的成员重新启动它。
    • 如果您使用主从复制(而不是副本集),则可以强制写入从属。 Master-Slave 已被弃用,但可以在此处找到文档:mongodb.org/display/DOCS/Master+Slave
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    相关资源
    最近更新 更多