Cor*_*ale 6 javascript database mapreduce riak
我正在与riak/riak-js结合使用nodejs应用程序并遇到以下问题:
运行此请求
db.mapreduce
.add('logs')
.run();
Run Code Online (Sandbox Code Playgroud)
通过ID识别存储在存储桶日志中的所有155.000项:
[ 'logs', '1GXtBX2LvXpcPeeR89IuipRUFmB' ],
[ 'logs', '63vL86NZ96JptsHifW8JDgRjiCv' ],
[ 'logs', 'NfseTamulBjwVOenbeWoMSNRZnr' ],
[ 'logs', 'VzNouzHc7B7bSzvNeI1xoQ5ih8J' ],
[ 'logs', 'UBM1IDcbZkMW4iRWdvo4W7zp6dc' ],
[ 'logs', 'FtNhPxaay4XI9qfh4Cf9LFO1Oai' ],
....
Run Code Online (Sandbox Code Playgroud)
如果我指定了map-Funktion并且只使用了bucket日志中的一些项目
db.mapreduce
.add([['logs', 'SUgJ2fhfgyR2WE87n7IVHyBi4C9'], ['logs', 'EMtywD1UFnsq9rNRuINLzDsHdh2'], ['logs', 'ZXPh5ws8mOdASQFEtLDk8CBRn8t']])
.map( function(v) {return ["asd"]; } )
.run();
Run Code Online (Sandbox Code Playgroud)
一切正常,并返回以下预期输出:
[ 'asd', 'asd', 'asd' ]
Run Code Online (Sandbox Code Playgroud)
如果我现在想让riak在桶中"映射"所有项目(大约155.000个小json文档)
db.mapreduce
.add('logs')
.map( function(v) {return ["asd"]; } )
.run();
Run Code Online (Sandbox Code Playgroud)
我只收到错误:
{ [Error: [object Object]] message: '[object Object]', statusCode: 500 }
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?在Error-Object中没有任何用处.
更新:riak-console多次说:
[notice] JS call failed: All VMs are busy.
Run Code Online (Sandbox Code Playgroud)
将riaks app.config中的map_js_vm_count增加到36后,消息变为:
[error] Pipe worker startup failed:fitting was gone before startup
Run Code Online (Sandbox Code Playgroud)
basho.com 的 Bryan 回答了我的问题:
嗨,科尼利厄斯。您能描述一下您的 Riak 配置吗?具体来说,您的集群中有多少个节点,app.config 中的ring_creation_size 是多少?
例如,如果您在单节点开发集群上使用默认设置 {ring_creation_size, 64},则很可能出现这种情况。155,000 个项目足以让所有 64 个虚拟节点正常工作。
在第一种情况下,在提高map_js_vm_count之前,这64个虚拟节点仅争夺8个Javascript虚拟机,因此有些节点可能会因饥饿而超时,这将导致“所有虚拟机都忙”日志消息。
在第二种情况下,在提高 map_js_vm_count 后,这 36 个 Javascript VM 可能无法在查询超时到来之前处理所有 155,000 个项目。“启动前安装已消失”日志消息表示运行查询的管道已关闭,但仍有输入到达虚拟节点。
在没有映射函数的简单情况下,您不会看到这些行为,因为不需要与 Javascript VM 进行交互。此外,在这种情况下,甚至不会从磁盘中读取对象,从而进一步缓解了资源争用。
我期望最有帮助的两个配置解决方案是降低ring_creation_size 和提高查询超时。将ring_creation_size降低到16,甚至在单节点集群上降低到8将减少Javascript VM的争用,因为在映射函数处理中尝试并行性会减少。提高查询超时(应该是“运行”函数的参数,或类似的参数,但我不熟悉 riak-js 客户端),将为查询提供更多时间在关闭之前完成,这可能是必要的克服处理速度慢的问题。
在 Erlang 中重写映射函数也应该有所帮助,因为它会更快,并且不会出现相同类型的 VM 争用。但是,我知道,这在早期开发中并不那么容易使用。
HTH,布莱恩
| 归档时间: |
|
| 查看次数: |
928 次 |
| 最近记录: |