gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:34:52 24 4
gpt4 key购买 nike

我正在使用 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 的限制。在 Map Reduce 文档的“输出选项”部分的“{内联:1}”项目符号下有一条关于此的注释。 http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-Outputoptions

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com