首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Riak在MapReduce查询时失败。使用哪种配置?

Riak在MapReduce查询时失败。使用哪种配置?
EN

Stack Overflow用户
提问于 2012-11-12 22:25:47
回答 1查看 936关注 0票数 6

我正在开发一个结合了riak / riak-js的nodejs应用程序,遇到了以下问题:

运行此请求

代码语言:javascript
复制
db.mapreduce
  .add('logs')
  .run();

对应返回存储在存储桶日志中的所有155.000项及其ID:

代码语言:javascript
复制
[ 'logs', '1GXtBX2LvXpcPeeR89IuipRUFmB' ],
[ 'logs', '63vL86NZ96JptsHifW8JDgRjiCv' ],
[ 'logs', 'NfseTamulBjwVOenbeWoMSNRZnr' ],
[ 'logs', 'VzNouzHc7B7bSzvNeI1xoQ5ih8J' ],
[ 'logs', 'UBM1IDcbZkMW4iRWdvo4W7zp6dc' ],
[ 'logs', 'FtNhPxaay4XI9qfh4Cf9LFO1Oai' ],
....

如果我指定一个map-Funktion并只使用存储桶日志中的几个项目

代码语言:javascript
复制
db.mapreduce
  .add([['logs', 'SUgJ2fhfgyR2WE87n7IVHyBi4C9'], ['logs', 'EMtywD1UFnsq9rNRuINLzDsHdh2'], ['logs', 'ZXPh5ws8mOdASQFEtLDk8CBRn8t']])
  .map( function(v) {return ["asd"]; } )
  .run();

一切运行正常,并返回以下预期输出:

代码语言:javascript
复制
[ 'asd', 'asd', 'asd' ]

如果我现在希望riak映射存储桶"logs“中的所有项(大约155.000个小json文档)。

代码语言:javascript
复制
db.mapreduce    
  .add('logs')  
  .map( function(v) {return ["asd"]; } )    
  .run();

我只收到错误:

代码语言:javascript
复制
{ [Error: [object Object]] message: '[object Object]', statusCode: 500 }

这里发生了什么?在Error-Object中没有写任何有用的东西。

更新: riak-console多次显示以下内容:

代码语言:javascript
复制
[notice] JS call failed: All VMs are busy.

在将riaks app.config中的map_js_vm_count递增到36之后,消息变为:

代码语言:javascript
复制
[error] Pipe worker startup failed:fitting was gone before startup

链接:Basho Labs Riak Driver riak-js

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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,布莱恩

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13345448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档