2012-03-08 12 views
2

私はMongoDBパッケージv0.45でPerl v5.12を使用しています。Perl MongoDBパッケージを使用してMongoレプリカにリデュースする方法

MapReduceジョブを実行して新しいコレクションを作成し、後でそのためにカーソルを作成したいとします。 私のもう一つの望みは、この仕事はマスターではなくレプリカで実行されることです。

perl docで定義されているように、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を使用しようと、この問題が発生しました:

は、ここに私のコードですか? 正常に完了しましたか? もしそうなら、あなたがそれをした方法を教えてください。

答えて

2

セカンダリでMap/Reduce操作を実行する場合は、結果をインラインで戻す必要があります。セカンダリに書き込むことはできないため、結果は "results"オブジェクトとともに返され、ディスクに書き込むことはできません。結果がこのように出力されると、結果セットには16MBの制限があります。 Map Reduceドキュメントの「出力オプション」セクションの「{inline:1}」の箇条書きの下に注釈があります。 http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-Outputoptions

+0

データセットが継続的に増加しているため、インラインで結果を返すことはスケーラビリティにはならないと私は懸念しています。スレーブで新しいコレクションを作成できるようにする設定はありますか?そうすれば、MapReduce関数は正常に完了できますか? –

+0

遅延返信をお許しください。残念ながら違います。現在、セカンダリに強制的に書き込む方法はありません。 1つ目の回避策は、セカンダリを停止し、mongodを別のポート番号でスタンドアロンプ​​ロセスとして開始することです(重要ですので、RSの他のメンバーには見られません)、Map-Reduce操作を実行しますコレクションを必要な場所にコピーしてから、スタンドアロンのmongodプロセスを停止し、レプリカセットのメンバとして再起動します。 – Marc

+0

マスタースレーブレプリケーション(レプリカセットとは対照的に)を使用している場合、スレーブに強制的に書き込みを行うことができます。 Master-Slaveは推奨されていませんが、ドキュメントはhttp://www.mongodb.org/display/DOCS/Master+Slaveにあります。 – Marc

関連する問題