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