Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Introducción a MapReduce

A medida que el número y el tipo de dispositivos de adquisición de datos crecen anualmente, el tamaño y la tasa de datos que se recolectan se expanden rápidamente. Estos conjuntos de datos grandes pueden contener gigabytes o terabytes de datos, y pueden crecer en el orden de megabytes o gigabytes por día. Si bien la recopilación de esta información presenta oportunidades para el conocimiento, también presenta muchos desafíos. La mayoría de los algoritmos no están diseñados para procesar conjuntos de datos grandes en una cantidad razonable de tiempo o con una cantidad razonable de memoria. MapReduce le permite conocer muchos de estos desafíos para obtener importantes conocimientos de grandes conjuntos de datos.

¿Qué es MapReduce?

MapReduce es una técnica de programación para analizar conjuntos de datos que no caben en la memoria. Es posible que esté familiarizado con Hadoop® MapReduce, que es una implementación popular que funciona con el sistema de archivos distribuido Hadoop (HDFS™). MATLAB® proporciona una implementación ligeramente diferente de la técnica MapReduce con la función mapreduce .

mapreduce utiliza un almacén de datos para procesar información en trozos pequeños que se ajustan individualmente a la memoria. Cada fragmento pasa por una fase de mapa, que da formato a los datos que se procesarán. A continuación, los trozos de datos intermedios pasan por una fase de reducción, que agrega los resultados intermedios para producir un resultado final. Las fases Map y reduce están codificadas por las funciones map y reduce , que son entradas primarias para mapreduce. Existen infinitas combinaciones de mapas y reducen las funciones para procesar los datos, por lo que esta técnica es flexible y extremadamente potente para abordar grandes tareas de procesamiento de datos.

mapreduce se presta a ser extendido para funcionar en varios ambientes. Para obtener más información acerca de estas capacidades, consulte Acelere e implemente MapReduce utilizando otros productos.

La utilidad de la función mapreduce radica en su capacidad para realizar cálculos en grandes colecciones de datos. Por lo tanto, mapreduce no es muy adecuado para realizar cálculos en conjuntos de datos de tamaño normal que pueden ser cargados directamente en la memoria de la computadora y analizados con técnicas tradicionales. En su lugar, utilice mapreduce para realizar un cálculo estadístico o analítico en un conjunto de datos que no quepa en la memoria.

Cada llamada al mapa o reducir la función por mapreduce es independiente de todas las demás. Por ejemplo, una llamada a la función Map no puede depender de entradas o resultados de una llamada anterior a la función map. Es mejor dividir estos cálculos en múltiples llamadas a mapreduce.

Fases del algoritmo MapReduce

mapreduce mueve cada fragmento de datos en el almacén de información de entrada a través de varias fases antes de llegar a la salida final. La siguiente figura describe las fases del algoritmo para mapreduce.

El algoritmo tiene los siguientes pasos:

  1. mapreduce lee un fragmento de datos del almacén de información de entrada mediante [data,info] = read(ds)y, a continuación, llama a la función Map para que funcione en ese fragmento.

  2. La función Map recibe el fragmento de datos, lo organiza o realiza un cálculo precursor y, a continuación, utiliza las funciones add y addmulti para agregar pares clave-valor a un objeto de almacenamiento de datos intermedio denominado KeyValueStore. El número de llamadas a la función Map por mapreduce es igual al número de trozos del almacén de datos de entrada.

  3. Una vez que la función Map funciona en todos los fragmentos de datos del almacén de información, mapreduce agrupa todos los valores del objeto KeyValueStore intermedio mediante una clave única.

  4. A continuación, mapreduce llama a la función reducir una vez por cada clave única Añadida por la función map. Cada clave única puede tener muchos valores asociados. mapreduce pasa los valores a la función reducir como un objeto ValueIterator , que es un objeto utilizado para recorrer en iteración los valores. El objeto ValueIterator para cada clave única contiene todos los valores asociados para esa clave.

  5. La función reducir utiliza las funciones hasnext y getnext para recorrer en iteración los valores del objeto ValueIterator uno a la vez. Luego, después de agregar los resultados intermedios de la función Map, la función reducir agrega pares de clave-valor finales a la salida utilizando las funciones add y addmulti . El orden de las claves en la salida es el mismo que el orden en el que la función reducir los agrega al objeto KeyValueStore final. Esto es, mapreduce no ordena explícitamente la salida.

    Nota

    La función reducir escribe los pares de clave-valor finales en un objeto KeyValueStore final. Desde este objeto, mapreduce tira de los pares clave-valor en el almacén de resultados de salida, que es un objeto KeyValueDatastore de forma predeterminada.

Ejemplo de cálculo MapReduce

En este ejemplo se utiliza un cálculo simple (la distancia media de desplazamiento en un conjunto de datos de vuelo) para ilustrar los pasos necesarios para ejecutar mapreduce.

Preparar datos

El primer paso para usar mapreduce es construir un almacén de datos para el conjunto de información. Junto con el mapa y las funciones de reducción, el almacén de datos para un conjunto es una entrada requerida para mapreduce, ya que permite a mapreduce procesar los datos en trozos.

mapreduce trabaja con todo tipo de almacenes. Por ejemplo, cree un objeto TabularTextDatastore para el conjunto de datos airlinesmall.csv .

ds = tabularTextDatastore('airlinesmall.csv','TreatAsMissing','NA')  ds =     TabularTextDatastore with properties:                        Files: {                              ' ...\matlab\toolbox\matlab\demos\airlinesmall.csv'                              }                FileEncoding: 'UTF-8'           ReadVariableNames: true               VariableNames: {'Year', 'Month', 'DayofMonth' ... and 26 more}    Text Format Properties:              NumHeaderLines: 0                   Delimiter: ','                RowDelimiter: '\r\n'              TreatAsMissing: 'NA'                MissingValue: NaN    Advanced Text Format Properties:             TextscanFormats: {'%f', '%f', '%f' ... and 26 more}          ExponentCharacters: 'eEdD'                CommentStyle: ''                  Whitespace: ' \b\t'     MultipleDelimitersAsOne: false    Properties that control the table returned by preview, read, readall:       SelectedVariableNames: {'Year', 'Month', 'DayofMonth' ... and 26 more}             SelectedFormats: {'%f', '%f', '%f' ... and 26 more}                    ReadSize: 20000 rows

Varias de las opciones descritas anteriormente son útiles en el contexto de mapreduce. La función mapreduce ejecuta read en el datastore para recuperar datos para pasar a la función map. Por lo tanto, puede utilizar las opciones SelectedVariableNames, SelectedFormatsy ReadSize para configurar directamente el tamaño del fragmento y el tipo de datos que mapreduce pasa a la función map.

Por ejemplo, para seleccionar la variable Distance (distancia total de vuelo) como la única variable de interés, especifique SelectedVariableNames.

ds.SelectedVariableNames = 'Distance';

Ahora, siempre que las funciones read, readallo preview actúan en ds, sólo devolverán información para la variable Distance . Para confirmarlo, puede obtener una vista previa de las primeras filas de datos en el almacén. Esto le permite examinar el formato de los datos que la función mapreduce pasará a la función map.

preview(ds)  ans =       Distance     ________      308          296          480          296          373          308          447          954      

Para ver los datos exacta que mapreduce pasará a la función Map, utilice read.

Para obtener información adicional y un resumen completo de las opciones disponibles, consulte Datastore.

Escribir mapa y reducir funciones

La función mapreduce llama automáticamente al mapa y reduce las funciones durante la ejecución, por lo que estas funciones deben cumplir ciertos requisitos para ejecutarse correctamente.

  1. Las entradas a la función Map son data, infoy intermKVStore:

    • data y info son el resultado de una llamada a la función read en el datastorede entrada, que mapreduce se ejecuta automáticamente antes de cada llamada a la función map.

    • intermKVStore es el nombre del objeto KeyValueStore intermedio al que la función Map necesita agregar pares clave-valor. Las funciones add y addmulti utilizan este nombre de objeto para agregar pares clave-valor. Si ninguna de las llamadas a la función Map agrega pares clave-valor a intermKVStore, entonces mapreduce no llama a la función reducir y el almacén de resultados resultante está vacío.

    Un ejemplo simple de una función de mapa es:

    function MeanDistMapFun(data, info, intermKVStore)     distances = data.Distance(~isnan(data.Distance));     sumLenValue = [sum(distances)  length(distances)];     add(intermKVStore, 'sumAndLength', sumLenValue); end

    Esta función de mapa tiene sólo tres líneas, que realizan algunos roles sencillos. La primera línea filtra todos los valores de NaN en el fragmento de datos de distancia. La segunda línea crea un vector de dos elementos con la distancia total y cuenta para el fragmento, y la tercera línea añade ese vector de valores a intermKVStore con la clave, 'sumAndLength'. Después de que esta función de mapa se ejecute en todos los trozos de datos de ds, el objeto intermKVStore contiene la distancia total y el conteo de cada fragmento de datos de distancia.

    Guarde esta función en su carpeta actual como MeanDistMapFun.m.

  2. Las entradas a la función de reducción son intermKey, intermValItery outKVStore:

    • intermKey es para la clave activa añadida por la función map. Cada llamada a la función reducir por mapreduce especifica una nueva clave única de las claves del objeto KeyValueStore intermedio.

    • intermValIter es el ValueIterator asociado a la clave activa, intermKey. Este objeto ValueIterator contiene todos los valores asociados a la clave activa. Desplácese por los valores utilizando las funciones hasnext y getnext .

    • outKVStore es el nombre del objeto final KeyValueStore al que la función reducir necesita agregar pares clave-valor. mapreduce toma los pares clave-valor de salida de outKVStore y los devuelve en el datastorede salida, que es un objeto KeyValueDatastore de forma predeterminada. Si ninguna de las llamadas a la función reducir agrega pares clave-valor a outKVStore, mapreduce devuelve un almacén de valores vacío.

    Un ejemplo simple de una función de reducción es:

    function MeanDistReduceFun(intermKey, intermValIter, outKVStore)     sumLen = [0 0];     while hasnext(intermValIter)         sumLen = sumLen + getnext(intermValIter);     end     add(outKVStore, 'Mean', sumLen(1)/sumLen(2)); end

    Esto reduce los bucles de función a través de cada uno de los valores de distancia y conteo en intermValIter, manteniendo un total de la distancia en funcionamiento y contando después de cada pasada. Después de este bucle, la función reducir calcula la distancia promedio total de vuelo con una división simple y, a continuación, agrega una sola clave a outKVStore.

    Guarde esta función en su carpeta actual como MeanDistReduceFun.m.

Para obtener información sobre cómo escribir un mapa más avanzado y reducir las funciones, consulte Escribir una función de mapa y Escribir una función reducir.

Ejecutar MapReduce

Una vez que tenga un almacén de almacenamiento de los mismos, una función de mapa y una función de reducción, puede llamar a mapreduce para realizar el cálculo. Para calcular la distancia de vuelo promedio en el conjunto de datos, llame a mapreduce utilizando ds, MeanDistMapFun.my MeanDistReduceFun.m.

outds = mapreduce(ds, @MeanDistMapFun, @MeanDistReduceFun); ******************************** *      MAPREDUCE PROGRESS      * ******************************** Map   0% Reduce   0% Map  16% Reduce   0% Map  32% Reduce   0% Map  48% Reduce   0% Map  65% Reduce   0% Map  81% Reduce   0% Map  97% Reduce   0% Map 100% Reduce 100%

De forma predeterminada, la función mapreduce muestra la información de progreso en la línea de comandos y devuelve un objeto KeyValueDatastore que apunta a los archivos de la carpeta actual. Puede ajustar las tres opciones utilizando los argumentos de par Name,Value para 'OutputFolder', 'OutputType'y 'Display'. Para obtener más información, consulte la página de referencia de mapreduce.

Ver resultados

Utilice la función readall para leer los pares clave-valor del almacén de resultados de la salida.

readall(outds)  ans =        Key        Value        ______    __________      'Mean'    [702.1630]

Consulte también

|

Temas relacionados