Diez años más tarde MapReduce se encuentra en el núcleo del BigData, especialmente a través de Hadoop. Todas o casi todas las grandes compañías que ofertan bigdata ofrecen algún tipo de implementación de Hadoop a sus clientes.
Pero Hadoop es una implementación que no sólo incluye un algoritmo, sino también un sistema de archivos (Hadoop Filesystem, HDFS, basado a su vez en el Google File System, GFS) y todos los mecanismos de control necesario para llevar a cabo el tratamiento de datos a gran escala.
Entonces, si lo que queremos es entender el cambio de paradigma que supone MapReduce para tratar datos, ¿Necesitamos instalar Hadoop o un similar para entender el funcionamiento de MapReduce? Si lo que quieres probar son tus scripts con un pequeño conjunto de datos, no.
cat archivo.csv | ./mapper.php
#!/usr/bin/php
$stdin = fopen( 'php://stdin', 'r' );while( $line = fgetcsv( $stdin, 10000) ) {
// Procesar/mapear los datos y ejecutar un echo sprintf:
echo sprintf("%s\n", $line[0]);
}
?>
En el caso del script de reducer (reducer.php), lo que haremos es contar cuántas veces aparece cada cadena en el listado (es decir que ignoraremos el valor numérico). El script es bastante similar al del mapper, pero ahora mantendremos un contador de las veces que aparece la clave, y cuando ésta cambie, la imprimiremos:
#!/usr/bin/php
$stdin = fopen( 'php://stdin', 'r' );
$currentKey = null;
$currentCount = 0;
while( $line = fgets( $stdin ) ) {
// Generas el proceso de 'reducción'
if ($line !== $currentKey) {
echo sprintf("%s\t%s\n", $currentKey, $currentCount);
$currentKey = $fields[0];
$currentCount = 0;
}
$currentCount++;
}
if ($currentKey !== null) {
echo sprintf("%s\t%s", $currentKey, $currentCount);
}
?>
chmod +x mapper.php reducer.php
cat archivo.csv | ./mapper.php | sort | ./reducer.php
El resto de la implementación de MapReduce (replicación de datos, gestión de recursos, partición del dataset, etc.) es imprescindible para operar con un gran conjunto de datos, pero no para entender el concepto de base: procesar datos de forma paralela.
Nota final: Aunque Hadoop requiere el uso de Java para desarrollar trabajos MapReduce, incorpora también una funcionalidad llamada Hadoop Streaming que permite la ejecución de scripts MapReduce en prácticamente cualquier lenguaje de programación. La contrapartida es un mayor uso de recursos y mayor lentitud, pero desde luego ayuda a realizar pruebas sencillas con scripts de PHP, python o similares.
© 2007 and beyond Mario Alberich, licensed under CC-BY-SA unless stated otherwise.