【问题标题】:Riak fails at MapReduce queries. Which configuration to use?Riak 在 MapReduce 查询中失败。使用哪种配置?
【发布时间】:2012-11-12 14:25:46
【问题描述】:

我正在结合 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 映射存储桶“日志”中的所有项目(大约 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

【问题讨论】:

    标签: javascript database mapreduce riak


    【解决方案1】:

    来自 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 时关闭。

    在没有地图功能的简单情况下,您不会看到这些行为,因为不需要与 Javascript 虚拟机交互。 此外,在这种情况下,甚至不会从磁盘中读取对象,从而进一步减轻了资源争用。

    我预计最有帮助的两个配置解决方案是降低 ring_creation_size 和提高查询超时。在单节点集群上将 ring_creation_size 降低到 16 甚至 8 将减少对 Javascript VM 的争用,因为在 map 函数处理中尝试的并行性会减少。提高查询超时(应该是 'run' 函数的参数,或类似的,但我不熟悉 riak-js 客户端),将使查询有更多时间在关闭之前完成,这可能是必要的克服缓慢的处理。

    在 Erlang 中重写你的 map 函数也应该会有所帮助,因为它会更快,并且不会有相同类型的 VM 争用。但是,据我了解,这在早期开发中并不容易使用。

    HTH, 布莱恩

    【讨论】:

    • 嗨,Bryan,感谢您的出色回答,这对加深对 riak 的了解很有帮助。你是对的,我使用的是默认单节点开发集群。如您所说,将戒指尺寸减小到 8 后,一切正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多