2013-04-11 77 views
0

我对这里(我认为)感到困惑的主要问题是qfun的参数应该是什么以及返回值应该是什么。 README基本上没有说这个,它给出的例子抛弃了第二和第三个参数。关于Riak + Erlang的riakc客户端中的MapReduce完全困惑

现在我只是试图理解参数,并没有使用任何实际的Riak。最终,我将试图用它重建我们的(基于MySQL的慢速)财务报告系统。所以在这里忽略我的目标毫无意义,为什么以下给我一个badfun异常?

数据只是名称和年龄的元组(对),其中的键是名称。在从Erlang控制台插入数据之前,我没有对JSON进行任何转换。

现在存储在<<"people">>一些{Name, Age}双我想使用的MapReduce(没有其他原因,比理解“如何”),以获取值回来了,不变,这第一次使用。

riakc_pb_socket:mapred(
    Pid, <<"people">>, 
    [{map, {qfun, fun(Obj, _, _) -> [Obj] end}, none, true}]). 

这只是给了我一个badfun,但是:

{error,<<"{\"phase\":0,\"error\":\"{badfun,#Fun<erl_eval.18.17052888>}\",\"input\":\"{ok,{r_object,<<\\\"people\\\">>,<<\\\"elaine\\\">"...>>} 

如何我刚刚经历我的地图功能不变传递数据? Erlang客户端的文档是否比自述文件中有更好的文档?该自述文件似乎假定您已经知道输入是什么。

回答

0

经过几天的游戏,这里有一个简单的技巧,使开发更容易。利用Erlang的RPC支持,它运行时代码加载事实上,在所有的了Riak节点分发代码:

%% Call this somewhere during your app's initialization routine. 
%% Assumes you have a list of available Riak nodes in your app's env. 
load_mapreduce_in_riak() -> 
    load_mapreduce_in_riak(application:get_env(app_name, riak_nodes, [])). 

load_mapreduce_in_riak([]) -> 
    ok; 
load_mapreduce_in_riak([{Node, Cookie}|Tail]) -> 
    erlang:set_cookie(Node, Cookie), 
    case net_adm:ping(Node) of 
    pong -> 
     {Mod, Bin, Path} = code:get_object_code(app_name_mapreduce), 
     rpc:call(Node, code, load_binary, [Mod, Path, Bin]); 
    pang -> 
     io:format("Riak node ~p down! (ping <-> pang)~n", [Node]) 
    end, 
    load_mapreduce_in_riak(Tail). 

现在你可以指任何的功能模块app_name_mapreduce中,他们将是可见Riak集群。如果需要,可以使用代码再次删除代码:delete/1。

0

我想我的代码实际上是正确的,我的问题在于我试图使用shell来执行代码。我需要在可以在Riak中运行之前实际编译代码。这是Erlang shell的一个限制,也是它编译funs的方式。

+2

我不这么认为:请参阅http://stackoverflow.com/questions/2123004/mapreduce-with-riak?rq=1了解shell – 2013-04-13 12:18:50

1

有2个Riak Erlang客户服务于不同的目的。

第一个是riak_kv模块(riak_client.erl和riak_object.erl)中包含的内部Riak客户端。如果您连接到Riak控制台,或者正在编写MapReduce函数或提交挂钩,则可以使用此选项。因为它是从Riak节点运行的,所以它在qfuns中运行得很好。

另一个客户端是官方Riak client for Erlang,由外部应用程序使用并通过协议缓冲区接口连接到Riak。这是你在上面的例子中使用的。由于这通过协议缓冲区进行连接,通常建议编译Erlang中的MapReduce函数并编译deployed on the nodes of the cluster as named functions。这也将使他们可以从其他客户端库访问它们。

+0

中的示例我现在正在连接到Riak集群并执行我的应用启动时的远程代码加载。这使我的应用程序从Riak集群中分离出来并使开发更容易。我会举一个例子。 – d11wtq 2013-04-14 07:44:44