2012-11-12 10 views
6

私はRiakに/ Riakに-JSとの組み合わせでnodejsアプリケーションで作業して、次の問題に遭遇しています:MapReduceクエリでRiakが失敗します。どの設定を使用するのですか?

がcorretlyこの要求

db.mapreduce 
    .add('logs') 
    .run(); 

を実行するには、そのバケットのログに保存されているすべての155.000のアイテムを返しますID:

[ 'logs', '1GXtBX2LvXpcPeeR89IuipRUFmB' ], 
[ 'logs', '63vL86NZ96JptsHifW8JDgRjiCv' ], 
[ 'logs', 'NfseTamulBjwVOenbeWoMSNRZnr' ], 
[ 'logs', 'VzNouzHc7B7bSzvNeI1xoQ5ih8J' ], 
[ 'logs', 'UBM1IDcbZkMW4iRWdvo4W7zp6dc' ], 
[ 'logs', 'FtNhPxaay4XI9qfh4Cf9LFO1Oai' ], 
.... 

私はマップ-Funktionを指定し、バケツにアイテムのほんの数を使用している場合は、

をログに記録します

すべてが正常に動作していると、次の、予想される出力が返されます。

[ 'asd', 'asd', 'asd' ] 

私は今、Riakには

db.mapreduce  
    .add('logs') 
    .map(function(v) {return ["asd"]; })  
    .run(); 
バケット「ログ」内のすべての項目(約155.000小さなJSONドキュメント)をマッピングする場合

私はエラーを受け取ります。ここで起こるん

{ [Error: [object Object]] message: '[object Object]', statusCode: 500 } 

何?エラーオブジェクトには有用なものは書かれていません。

更新:

[error] Pipe worker startup failed:fitting was gone before startup 

リンク::

[notice] JS call failed: All VMs are busy. 

riaksでmap_js_vm_countをインクリメントした後、メッセージがに変わり、36にApp.configファイル: Riakにコンソールには、以下の複数回言う Basho Labs Riak Driver riak-js

答えて

4

ブライアンbasho.comからの質問:

こんにちは、コーネリアス。 Riakの設定をちょっと説明してください。 具体的には、クラスタにいくつのノードがあり、app.configのring_creation_sizeは何ですか?

例えば、1ノードの開発クラスタでデフォルトのセットアップ{ring_creation_size、64}を使用している場合は、この動作が考えられます。 155,000項目で、すべての64個のvnodeが動作するのに十分です。

最初のケースでは、map_js_vm_countを上げる前に、これらの64個のvnodeがわずか8個のJavascript VMで対戦しているため、「すべてのVMがビジー状態です」というログメッセージ。

2番目のケースでは、map_js_vm_countを上げた後、クエリタイムアウトが到着する前に、36個のJavascript VMが155,000アイテムすべてを処理できない可能性があります。 「起動前にフィッティングが終了しました」というログメッセージは、入力がまだvnodeに到着している間にクエリを実行しているパイプがシャットダウンしたことを示しています。

Javascript VMとのやりとりが不要なため、マップ機能のない単純なケースでは、これらの動作のいずれも表示されません。 さらに、この場合、オブジェクトはディスクから読み取られず、リソースの競合をさらに緩和します。

私が期待している2つの設定ソリューションは、ring_creation_sizeを下げてクエリのタイムアウトを引き上げるのに役立ちます。単一ノード・クラスタでring_creation_sizeを16、または8に下げると、Javascript VMの競合が少なくなります。これは、マップ関数処理での並列処理が少なくなるためです。クエリのタイムアウトを引き上げる( 'run'関数などの引数にする必要がありますが、私はriak-jsクライアントに慣れていません)、クエリを終了する前に終了する必要があります。遅い処理を克服する。

Erlangでマップ関数を書き直すと、速くなり、同じ種類のVM競合が発生しないため、役立つはずです。しかし、初期段階の開発ではそれほど簡単ではありません。

HTH、 ブライアン

+1

こんにちはブライアンは、あなたの優れた答えのためのおかげで、それはRiakにのより深い知識をたくさん助け。あなたは正しいです、私はデフォルトの1ノード開発クラスターを使用しています。あなたが言ったようにリングのサイズを8に減らした後、すべて正常に動作します。 –

関連する問題