ventajas desventajas datos erlang riak

desventajas - Completamente confundido acerca de MapReduce en el cliente riakc de Riak+Erlang



riak ventajas y desventajas (3)

Lo principal de lo que estoy confundido aquí (creo) es qué se supone que son los argumentos para el qfun y cuál debería ser el valor de retorno. El archivo README básicamente no dice nada sobre esto y el ejemplo que arroja arroja el segundo y tercer args.

En este momento solo intento comprender los argumentos y no usar Riak para nada práctico. Eventualmente, intentaré reconstruir nuestro sistema de informes financieros (lento, basado en MySQL). Entonces, ignorando la inutilidad de mi objetivo aquí, ¿por qué el siguiente me da una excepción de badfun ?

Los datos son solo tuplas (pares) de nombres y edades, con las claves siendo el nombre. No estoy haciendo ninguna conversión a JSON o tal antes de insertar los datos desde la consola de Erlang.

Ahora con algunos pares de {Name, Age} almacenados en <<"people">> Quiero usar MapReduce (sin otra razón que no sea para entender "cómo") para recuperar los valores, sin cambios en este primer uso.

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

Esto solo me da una mala jugada, sin embargo:

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

¿Cómo paso los datos a través de la función de mapa sin cambios? ¿Hay alguna mejor documentación del cliente de Erlang que lo que está en el archivo README? Ese LÉAME parece suponer que ya sabes cuáles son las entradas.


Creo que mi código es realmente correcto y mi problema radica en el hecho de que estoy tratando de usar el shell para ejecutar el código. Necesito compilar el código antes de que pueda ejecutarse en Riak. Esta es una limitación del shell de Erlang y la forma en que compila las diversiones.


Hay 2 clientes de Riak Erlang que sirven para diferentes propósitos.

El primero es el cliente Riak interno que está incluido en el módulo riak_kv (riak_client.erl y riak_object.erl). Esto se puede usar si está conectado a la consola Riak o si está escribiendo una función MapReduce o un enlace de confirmación. Como se ejecuta desde dentro de un nodo Riak, funciona bastante bien con qfuns.

El otro cliente es el cliente oficial de Riak para Erlang que es utilizado por aplicaciones externas y se conecta a Riak a través de la interfaz de búfers de protocolo. Esto es lo que estás usando en tu ejemplo anterior. Como esto se conecta a través de búferes de protocolo, generalmente se recomienda que las funciones de MapReduce en Erlang se compilan y se implementan en los nodos del clúster como funciones con nombre . Esto también los hará accesibles desde otras bibliotecas de clientes.


Después de unos días de jugar, aquí hay un truco ordenado que facilita el desarrollo. Aproveche el soporte de RPC de Erlang y el hecho de que tiene carga de códigos de tiempo de ejecución para distribuir su código a través de todos los nodos de 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).

Ahora puede referirse a cualquiera de las funciones en el módulo app_name_mapreduce y estarán visibles para el clúster Riak. El código se puede eliminar nuevamente con el código: delete / 1, si es necesario.