Existe numerosa bibliografía sobre Map-Reduce por lo que no vale la pena comenzar explicando la técnica pero si es interesante
contar con código de ejemplo para fijar ideas. Esto es lo que vamos a intentar hacer. El lenguaje que vamos a utilizar es Python
y la implementación de Map-Reduce se llama Mincemeat. Se puede descargar libremente en el siguiente repositorio:
Las instrucciones son sencillas y es una buena implementación de Map-Reduce que nos permite hacer pruebas rápidas y ajustar algoritmos.
Por otro lado necesitamos un dataset y algo para hacer con el dataset. El dataset lo descargamos de
La idea es trazar un mapa de la cantidad de alumnos por provincia y por nivel para después confeccionar una infografía.
Con este dataset cualquier programador principiante o cualquiera que maneje mínimamente el Excel puede, en pocos minutos,
hacer una tabla de datos. Pero aquí decidimos utilizar Map-Reduce simplemente porque es mas deportivo.
Nuestro dataset tiene la siguiente estructura:
Como vemos tiene 9 columnas, solo nos van a interesar la 1 y la la 8 y mas delante la 7 porque los vamos a discriminar
por nivel. Por ahora la columna 1 es la provincia y la 8 es la cantidad de alumnos, recuerden que la primer columna es la 0.
El archivo está desagregado por departamento, sector, modalidad y nivel. Nosotros vamos a obtener un consolidado por provincia.
Lo primero que tenemos que hacer es cargar el csv, no nos olvidemos que debemos obtener los datos de la forma
{clave:valor}
para de esa forma poder entregarsela al mapper. La lectura la hacemos con el siguiente código en Python:
Como vemos estamos armando un diccionario que tiene un índice como clave y algo de la forma "provincia,cantidad"
como valor esto es lo que va a recibir el mapper. La última parte es para llamar al mincemeat. Entonces pasemos al mapper.
El mapper lo único que hace es tomar los valores del diccionario que habíamos armado, los separa en dos para eso
le pusimos la coma (recordar que lo que recibió el mapper es de la forma {indice:provincia,cantidad}) descarta el
índice y toma como clave para el reducer la provincia y como valor la cantidad de alumnos. Ahora vamos a ver la función reduce:
Nuevamente es muy sencilla, lo único que hace es sumar la cantidad de alumnos. Recordemos que el reducer lo que hace
es clasificar por clave y, en este caso sumar las cantidades y devuelve todo al servidor.
El código completo se puede descargar del repositorio
Github--> gvillamayor / MREducacion1
Están todos los archivos incluidos los datos. Para ejecutarlo hay que tener el Python 2.7 instalado con las slibrerías correspondientes
fundamentalmente la librería csv, y ejecutar primero el archivo "secundario.bat" esto va a correr el servidor. Una vez
que tengamos funcionando el servidor ejecutamos el archivo "cliente.bat". La salida a trvez de la instrucción print de la funcion reducefn se
redirecciona a un archivo que se llama "salida.txt" además de devolver los datos al servidor. La salida que obtuvimos es la siguiente:
Se pueden ejecutar tantas copias de "cliente.bat" como se quiera solo hay que cambiar el nombre del archivo de salida
incluso en distintos equipos para esto hay que colocarle la dirección IP del equipo donde está el servidor en la linea de comando
Por ejemplo ejecutando dos copias se obtienen los siguientes archivos de salida:
Se ve claramente que el servidor repartió el trabajo entre los dos clientes. Esta es la idea de Map-Reduce