2012-11-12 26 views
6

我在組合的NodeJS應用程序的工作與了Riak /了Riak-JS和遇到以下問題:Riak在MapReduce查詢失敗。使用哪種配置?

運行這個請求

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

corretly返回存儲與剷鬥日誌中的所有155,000物品的編號:

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

如果我指定地圖的Funktion並使用只有少數的項目在桶登錄

db.mapreduce 
    .add([['logs', 'SUgJ2fhfgyR2WE87n7IVHyBi4C9'], ['logs', 'EMtywD1UFnsq9rNRuINLzDsHdh2'], ['logs', 'ZXPh5ws8mOdASQFEtLDk8CBRn8t']]) 
    .map(function(v) {return ["asd"]; }) 
    .run(); 

一切工作正常,並返回以下,預期輸出:

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

如果我現在想了Riak映射在鬥「日誌」的所有項目(約155,000小JSON文檔)

db.mapreduce  
    .add('logs') 
    .map(function(v) {return ["asd"]; })  
    .run(); 

我只收到錯誤:

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

是什麼發生在這裏?在錯誤對象中沒有任何用處。

更新: 的了Riak控制檯說以下多次:

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

在riaks遞增map_js_vm_count後的app.config到36,消息變爲:

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

鏈接: 從basho.com Basho Labs Riak Driver riak-js

回答

4

布賴恩回答我的問題:

嗨,哥尼流。你能否描述一下你的Riak配置? 具體來說,您的羣集中有多少個節點,以及您的app.config中的ring_creation_size是什麼?

如果,例如,您使用的是默認設置{ring_creation_size,64}一個單節點集羣的發展上,這種行爲是非常可能的。 155,000項足以讓所有64個vnode正常工作。

在第一種情況下,在提出map_js_vm_count之前,這64個vnodes只與8個Javascript虛擬機戰鬥,所以有些虛擬機可能會被迫停止超時,這會導致「所有虛擬機都忙」日誌消息。

在第二種情況下,提高map_js_vm_count之後,很可能是那些36個的Javascript虛擬機只是不能夠處理所有項目155000查詢超時到來之前。 「配件在啓動之前已經結束」日誌消息說,在仍然有輸入到達vnodes時,運行查詢的管道關閉。

在沒有map函數的簡單情況下,您沒有看到這兩種行爲,因爲不需要與JavaScript VM進行交互。另外,在這種情況下,對象甚至不會從磁盤讀取,進一步緩解資源爭用。

我期望的兩種配置解決方案將幫助大多數人降低ring_creation_size,並引發查詢超時。將單個節點集羣上的ring_creation_size降低爲16或甚至8將導致對Javascript VM的爭用較少,因爲在映射函數處理中嘗試的並行性會較少。提高查詢超時(應該是'run'函數或類似的參數,但我不熟悉riak-js客戶端),會在查詢關閉之前有更多時間完成查詢,這可能是必要的克服處理速度慢。

在Erlang中重寫你的map函數也應該有所幫助,因爲它會更快,並且不會有相同類型的虛擬機爭用。但是,我明白,在早期階段的開發中使用並不容易。

HTH, 布萊恩

+1

喜布賴恩,感謝您的出色答卷,它幫助了很多的了Riak有較深造詣。你是對的,我正在使用默認的單節點開發集羣。正如你所提到的,將環的大小減少到8之後,一切正常。 –