我试图通过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;失败,这不是很有用。谁能帮助我实现这个功能呢?
答案 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
目录就是这样一个地方。
请参阅文档: