Skip to content

MapReduce

by Cristian Requena on abril 16th, 2010

Lo que en un primer momento me pareció una característica que solamente aparecía en CouchDB he empezado a ver que es otro de los pilares donde se sustentan muchas de las implementaciones de bases de datos NoSQL.

A lo largo de este post se cubrirán los aspectos fundamentales de los frameworks MapReduce tales como Hadoop, una implementación open-source en Java que está mantenida, como Cassandra y CouchDB, por Apache.

En los lenguajes funcionales (Haskell, Erlang, OCaml, etc.) es muy corriente el uso de las funciones de alto nivel map y fold/reduce.

  • map(list[], oper) aplica la operacion oper a la lista list, retornando una nueva lista cuyos elementos han sido operados, individualmente, por oper.
    Por ejemplo, si disponemos de la lista list[1,2,3] y de la operación suma x = x+1 y realizamos la operación map(list, suma) el resultado de la misma será [2,3,4].
  • fold(list[], oper) aplica la operación oper a la lista list, retornando un elemento producto de la operación de los elementos de list entre sí.
    Por ejemplo, si disponemos de la lista list[1,2,3] y de la operación suma (x:xs) = x+suma(xs) y realizamos la operación fold(lista, suma), el resultado de la misma será 6.
    Debido a la posibilidad de que la operación no sea asociativa, los lenguajes de programación ofrecen, normalmente, dos operaciones: una “hacia la derecha”, o foldr y otra “hacia la izquierda”, o foldl.

En general, en el área de la computación distribuida Map se utiliza para fraccionar una operación compleja entre varios nodos y Fold/Reduce para recoger los resultados y unificarlos.

Por su parte, los frameworks MapReduce toman la base de las operaciones mencionadas anteriormente para crear una operación genérica y más compleja, cuyo funcionamiento es realmente útil para las bases de datos NoSQL: en vez de usarse sobre listas de valores unidimensionales, ésta toma como parámetros entrantes una lista de tuplas de tipo (clave, valor) y devuelve una lista de valores. Entre las operaciones map (distribuida) y reduce (normalmente localizada) se genera una lista de tuplas (clave, valor) con valores temporales, de las que reduce filtra solamente las que tengan una determinada clave.

Un ejemplo del uso de MapReduce por las bases de datos NoSQL puede venir dado por MongoDB. Esta implementación hace uso de MapReduce para realizar operaciones sobre los resultados devueltos por una consulta, por ejemplo de contaje de repeticiones.

En definitiva, MapReduce es fundamental en las bases de datos NoSQL para permitir la utilización de funciones de agregación de datos, ya que al carecer de esquema son mucho más complicadas que en las bases de datos relacionales clásicas (RDBMS).

From → NoSQL

3 Comments
  1. MapReduce es una de las funcionalidades de consulta más potentes que existen, en donde se pueden desarrollar a medida operaciones de agregación. En las bases de datos relacionales, estas operaciones están limitadas a las del fabricante, normalmente sum(), count(), avg(), max() y min(). Con MapReduce podemos incluso realizar agrupaciones y agregaciones complejas según nuestras necesidades.

    En MongoDB esta característica es muy importante. El enlace en castellano que facilitas en este blogspot es la siguiente:

    http://www.mongodb.org/display/DOCSES/MapReduce

    • Hola Rafael, gracias por el aporte.

      Sinceramente, y tal y como menciono en el artículo, creía que MapReduce era “una funcionalidad más” sin importancia. ¡Qué equivocado estaba! Cuando leí un par de líneas acerca de la misma, me dí cuenta de la dimensión de la equivocación 😉

      Saludos,

      Cristian Requena.

  2. Olvidé daros las gracias por vuestro enlace. Tenéis uno en Mongospanish.

    Cualquier tipo de colaboración es bienvenida.

Leave a Reply

Note: XHTML is allowed. Your email address will never be published.

Subscribe to this comment feed via RSS