如何通过HTTP将erlang函数源发送到riak mapreduce?

时间:2015-02-26 08:47:20

标签: riak

我试图通过http使用Riak的mapreduce。他是我发送的:

{
"inputs":{
    "bucket":"test",
    "key_filters":[["matches", ".*"]]
},
"query":[
    {
        "map":{
            "language":"erlang",
            "source":"value(RiakObject, _KeyData, _Arg) -> Key = riak_object:key(RiakObject), Count = riak_kv_crdt:value(RiakObject, <<\"riak_kv_pncounter\">>), [ {Key, Count} ]."
        }
    }
]}

Riak以&#34; [worker_startup_failed]&#34;失败,这不是很有用。谁能帮助我实现这个功能呢?

2 个答案:

答案 0 :(得分:1)


警告

通过map-reduce允许任意Erlang函数存在安全风险。可以执行任何有效的Erlang,包括将整个数据集发送到异地或格式化硬盘驱动器。

你被警告了。


但是,如果您隐式信任可能连接到群集的任何客户端,则可以通过在app.config的riak_kv部分中设置{allow_strfun, true}来允许在map-reduce请求中传递Erlang源,(或者如果你使用的是riak.conf,请在advanced.config中。)

一旦你允许在map-reduce阶段传递一个Erlang函数,你需要传递一个fun(RiakObject,KeyData,Arg) -> [result] end.形式的函数。注意这必须是一个匿名的乐趣,所以fun是一个关键字,不是名称,必须以结尾结束 您的函数应该处理将{error,notfound}作为第一个参数而不是对象传递的情况。只需在函数中添加一个catch-all子句就可以实现这一点。 也许是这样的事情:

{
"inputs":{
    "bucket":"test",
    "key_filters":[["matches", ".*"]]
},
"query":[
    {
        "map":{
            "language":"erlang",
            "source":"fun(RiakObject, _KeyData, _Arg) -> 
                           Key = riak_object:key(RiakObject), 
                           Count = riak_kv_crdt:value(
                                            RiakObject, 
                                            <<\"riak_kv_pncounter\">>), 
                           [ {Key, Count} ];
                       (_,_,_) -> [{error,0}]
                       end."
        }
    }
]}

在开发和调试时,允许在请求中传递源非常有用。对于生产,您确实应该将函数放在专用的预编译模块中,然后将其复制到每个节点的代码路径中,以便相位规范可以按名称指定模块和函数,而不是提供任意代码。

{"map":{
   "language":"erlang",
   "module":"yourprecompiledmodule",
   "function":"functionname"}}

答案 1 :(得分:1)

您需要在群集中的所有节点上启用allow_strfun。要在Riak 2中执行此操作,您需要使用advanced.config文件将其添加到riak_kv配置中:

[
    {riak_kv, [
        {allow_strfun, true}
    ]}
].

另一个选择是使用Riak附带的编译器创建自己的Erlang模块,并将*.beam文件放在一个众所周知的位置供Riak查找。 basho-patches目录就是这样一个地方。

请参阅文档: