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.

Analizar Big Data en MATLAB utilizando MapReduce

Este ejemplo muestra cómo utilizar las funciones y para procesar una gran cantidad de datos basados en archivos.datastoremapreduce El algoritmo MapReduce es un pilar de muchas aplicaciones modernas de "Big Data". Este ejemplo funciona en un único equipo, pero el código se puede escalar verticalmente para usar Hadoop®.

A lo largo de este ejemplo, el conjunto de datos es una colección de registros para vuelos de aerolíneas nacionales de EE. UU. entre 1987 y 2008. Si ha experimentado con "Big Data" antes, es posible que ya esté familiarizado con este conjunto de datos. El conjunto de datos completo se puede descargar desde.https://stat-computing.org/dataexpo/2009/the-data.html Un pequeño subconjunto del conjunto de datos también se incluye con MATLAB® para permitirle ejecutar este y otros ejemplos sin descargar todo el conjunto de datos.

Introducción adatastore

La creación de una permite acceder a una colección de datos de forma basada en fragmentos.datastore A puede procesar arbitrariamente grandes cantidades de datos, y los datos incluso se pueden propagar a través de varios archivos.datastore Puede crear un para muchos tipos de archivo, incluida una colección de archivos de texto tabular (que se muestra aquí), una base de datos SQL (se requiere Database Toolbox™) o un sistema de archivos distribuido de Hadoop® (HDFS™).datastore

Cree un almacén de datos para una colección de archivos de texto tabular y previsualice el contenido.

ds = datastore('airlinesmall.csv'); dsPreview = preview(ds); dsPreview(:,10:15)
ans=8×6 table
    FlightNum    TailNum    ActualElapsedTime    CRSElapsedTime    AirTime    ArrDelay
    _________    _______    _________________    ______________    _______    ________

      1503        'NA'              53                 57           'NA'          8   
      1550        'NA'              63                 56           'NA'          8   
      1589        'NA'              83                 82           'NA'         21   
      1655        'NA'              59                 58           'NA'         13   
      1702        'NA'              77                 72           'NA'          4   
      1729        'NA'              61                 65           'NA'         59   
      1763        'NA'              84                 79           'NA'          3   
      1800        'NA'             155                143           'NA'         11   

El datastore analiza automáticamente los datos de entrada y hace una mejor suposición en cuanto al tipo de datos en cada columna. En este caso, utilice el argumento de par nombre-valor para reemplazar correctamente los valores que faltan.'TreatAsMissing'datastore Para las variables numéricas (por ejemplo), reemplaza cada instancia de con un valor, que es la representación aritmética de IEEE para no-a-Number.'AirTime'datastore'NA'NaN

ds = datastore('airlinesmall.csv', 'TreatAsMissing', 'NA'); ds.SelectedFormats{strcmp(ds.SelectedVariableNames, 'TailNum')} = '%s'; ds.SelectedFormats{strcmp(ds.SelectedVariableNames, 'CancellationCode')} = '%s'; dsPreview = preview(ds); dsPreview(:,{'AirTime','TaxiIn','TailNum','CancellationCode'})
ans=8×4 table
    AirTime    TaxiIn    TailNum    CancellationCode
    _______    ______    _______    ________________

      NaN       NaN       'NA'            'NA'      
      NaN       NaN       'NA'            'NA'      
      NaN       NaN       'NA'            'NA'      
      NaN       NaN       'NA'            'NA'      
      NaN       NaN       'NA'            'NA'      
      NaN       NaN       'NA'            'NA'      
      NaN       NaN       'NA'            'NA'      
      NaN       NaN       'NA'            'NA'      

Busque filas de interés

objetos contienen un puntero interno para realizar un seguimiento de qué fragmento de datos devuelve la función a continuación.datastoreread Use las funciones y para recorrer todo el conjunto de datos y filtre el conjunto de datos a solo las filas de interés.hasdataread En este caso, las filas de interés son los vuelos en United Airlines ("UA") saliendo desde Boston ("BOS").

subset = [];  while hasdata(ds)     t = read(ds);     t = t(strcmp(t.UniqueCarrier, 'UA') & strcmp(t.Origin, 'BOS'), :);     subset = vertcat(subset, t); end  subset(1:10,[9,10,15:17])
ans=10×5 table
    UniqueCarrier    FlightNum    ArrDelay    DepDelay    Origin
    _____________    _________    ________    ________    ______

        'UA'            121          -9           0       'BOS' 
        'UA'           1021          -9          -1       'BOS' 
        'UA'            519          15           8       'BOS' 
        'UA'            354           9           8       'BOS' 
        'UA'            701         -17           0       'BOS' 
        'UA'            673          -9          -1       'BOS' 
        'UA'             91          -3           2       'BOS' 
        'UA'            335          18           4       'BOS' 
        'UA'           1429           1          -2       'BOS' 
        'UA'             53          52          13       'BOS' 

Introducción amapreduce

MapReduce es una técnica algorítmica para "dividir y conquistar" los problemas de Big Data. En MATLAB, requiere tres argumentos de entrada:mapreduce

  1. A para leer datos dedatastore

  2. Una función de "asignador" a la que se le da un subconjunto de los datos para operar. La salida de la función MAP es un cálculo parcial. llama a la función de asignador una vez para cada fragmento en el, con cada llamada operando de forma independiente.mapreducedatastore

  3. Una función de "reductor" a la que se le dan las salidas agregadas de la función de asignador. La función reductor finaliza el cálculo Iniciado por la función de asignador y emite la respuesta final.

Se trata de una simplificación en cierta medida, ya que la salida de una llamada a la función de asignador se puede barajar y combinar de formas interesantes antes de pasar a la función reductor. Esto se examinará más adelante en este ejemplo.

Se utiliza para realizar un cálculomapreduce

Un simple uso de es encontrar el tiempo de vuelo más largo en todo el conjunto de datos de la aerolínea.mapreduce Para hacer esto:

  1. La función "asignador" calcula el máximo de cada fragmento desde el.datastore

  2. A continuación, la función "reductor" calcula el valor máximo entre todos los máximos calculados por las llamadas a la función de asignador.

Primero, restablezca y filtre las variables a una columna de interés.datastore

reset(ds); ds.SelectedVariableNames = {'ActualElapsedTime'};

Escriba la función de asignador,.maxTimeMapper.m Se necesitan tres argumentos de entrada:

  1. Los datos de entrada, que es una tabla obtenida mediante la aplicación de la función a la.readdatastore

  2. Una colección de información contextual y de configuración,.info Esto se puede ignorar en la mayoría de los casos, ya que está aquí.

  3. Un objeto de almacenamiento de datos intermedio, que registra los resultados de los cálculos de la función de asignador. Utilice la función para añadir pares clave/valor a esta salida intermedia.add En este ejemplo, el nombre de la clave () es arbitrario.'MaxElapsedTime'

Guarde la siguiente función de asignador () en la carpeta actual.maxTimeMapper.m

type maxTimeMapper
function maxTimeMapper(data, ~, intermKVStore) %  % Copyright 2014 The MathWorks, Inc.  maxElaspedTime = max(data{:,:}); add(intermKVStore, 'MaxElaspedTime',maxElaspedTime); end 

A continuación, escriba la función de reductor. También toma tres argumentos de entrada:

  1. Un conjunto de "teclas" de entrada. Las claves se discutirán más adelante, pero pueden ser ignoradas en algunos problemas simples, ya que están aquí.

  2. Un objeto de entrada de datos intermedio que pasa a la función reductor.mapreduce Estos datos se encuentran en forma de pares clave/valor y se utilizan las funciones y para recorrer en iteración los valores de cada clave.hasnextgetnext

  3. Un objeto de almacenamiento de datos de salida final. Utilice las funciones y para agregar directamente pares clave/valor a la salida.addaddmulti

Guarde la siguiente función reductor () en la carpeta actual.maxTimeReducer.m

type maxTimeReducer
function maxTimeReducer(~, intermValsIter, outKVStore) %  % Copyright 2014 The MathWorks, Inc.  maxElaspedTime = -inf; while hasnext(intermValsIter)     maxElaspedTime = max(maxElaspedTime, getnext(intermValsIter)); end add(outKVStore, 'MaxElaspedTime', maxElaspedTime); end 

Una vez que las funciones de asignador y reductor se escriben y se guardan en la carpeta actual, puede llamar mediante la función de asignador y reductor.mapreducedatastore Si tiene Parallel Computing Toolbox (PCT), MATLAB iniciará automáticamente un grupo y paralelizará la ejecución. Utilice la función para mostrar los resultados del algoritmo MapReduce.readall

result = mapreduce(ds, @maxTimeMapper, @maxTimeReducer);
******************************** *      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   0% Map 100% Reduce 100% 
readall(result)
ans=1×2 table
          Key           Value 
    ________________    ______

    'MaxElaspedTime'    [1650]

El uso de llaves enmapreduce

El uso de llaves es una característica importante y poderosa de.mapreduce Cada llamada a la función de asignador agrega resultados intermedios a uno o más denominados "Buckets", denominados claves. El número de llamadas a la función de asignador corresponde al número de fragmentos en el.mapreducedatastore

Si la función de asignador agrega valores a varias claves, esto conduce a varias llamadas a la función de reductor, con cada llamada trabajando en solo los valores intermedios de una clave. La función gestiona automáticamente este movimiento de datos entre el mapa y reduce las fases del algoritmo.mapreduce

Esta flexibilidad es útil en muchos contextos. El ejemplo siguiente utiliza claves de una manera relativamente obvia con fines ilustrativos.

Cálculo de métricas grupales conmapreduce

El comportamiento de la función de asignador en esta aplicación es más complejo. Para cada transportista de vuelo que se encuentra en los datos de entrada, utilice la función para añadir un vector de valores.add Este vector es un recuento del número de vuelos de ese transportista en cada día en los más de 21 años de datos. El código de portadora es la clave para este vector de valores. Esto garantiza que todos los datos de cada portadora se agruparán cuando se pasen a la función reductor.mapreduce

Guarde la siguiente función de asignador () en la carpeta actual.countFlightsMapper.m

type countFlightsMapper
function countFlightsMapper(data, ~, intermKVStore) %  % Copyright 2014 The MathWorks, Inc.  dayNumber = days((datetime(data.Year, data.Month, data.DayofMonth) - datetime(1987,10,1)))+1; daysSinceEpoch = days(datetime(2008,12,31) - datetime(1987,10,1))+1;  [airlineName, ~, airlineIndex] = unique(data.UniqueCarrier, 'stable');  for i = 1:numel(airlineName)     dayTotals = accumarray(dayNumber(airlineIndex==i), 1, [daysSinceEpoch, 1]);     add(intermKVStore, airlineName{i}, dayTotals); end end 

La función reductor es menos compleja. Simplemente recorre en iteración los valores intermedios y agrega los vectores juntos. Al finalizar, genera los valores de este vector agregado. Tenga en cuenta que la función reductor no necesita ordenar ni examinar los valores; cada llamada a la función de reductor solo pasa los valores de un transportista aéreo.intermediateKeysInmapreduce

Guarde la siguiente función reductor () en la carpeta actual.countFlightsReducer.m

type countFlightsReducer
function countFlightsReducer(intermKeysIn, intermValsIter, outKVStore) %countFlightsReducer Reducer function for mapreduce to count flights  % Copyright 2014 The MathWorks, Inc.  daysSinceEpoch = days(datetime(2008,12,31) - datetime(1987,10,1))+1; dayArray = zeros(daysSinceEpoch, 1);  while hasnext(intermValsIter)     dayArray = dayArray + getnext(intermValsIter); end add(outKVStore, intermKeysIn, dayArray); end 

Restablezca y seleccione las variables de interés.datastore Una vez que las funciones de asignador y reductor se escriben y se guardan en la carpeta actual, puede llamar mediante la función de asignador y reductor.mapreducedatastore

reset(ds); ds.SelectedVariableNames = {'Year', 'Month', 'DayofMonth', 'UniqueCarrier'};  result = mapreduce(ds, @countFlightsMapper, @countFlightsReducer);
******************************** *      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   0% Map 100% Reduce  10% Map 100% Reduce  21% Map 100% Reduce  31% Map 100% Reduce  41% Map 100% Reduce  52% Map 100% Reduce  62% Map 100% Reduce  72% Map 100% Reduce  83% Map 100% Reduce  93% Map 100% Reduce 100% 
result = readall(result);

En caso de que este ejemplo se ejecuto solo con el conjunto de datos de ejemplo, cargue los resultados del algoritmo ejecutado en todo el conjunto de datos.mapreduce

load airlineResults

Visualizando los resultados

Utilizando sólo los 7 principales portadores, aplicar un filtro a los datos para suavizar los efectos del viaje de fin de semana. Esto de lo contrario abarrotaría la visualización.

lines = result.Value; lines = horzcat(lines{:}); [~,sortOrder] = sort(sum(lines), 'descend'); lines = lines(:,sortOrder(1:7)); result = result(sortOrder(1:7),:);  lines(lines==0) = nan; for carrier=1:size(lines,2)     lines(:,carrier) = filter(repmat(1/7, [7 1]), 1, lines(:,carrier)); end

Graficar los datos.

figure('Position',[1 1 800 600]); plot(datetime(1987,10,1):caldays(1):datetime(2008,12,31),lines) title ('Domestic airline flights per day per carrier') xlabel('Date') ylabel('Flights per day (7-day moving average)') legend(result.Key, 'Location', 'South')

La trama muestra la aparición de Southwest Airlines (WN) durante este período de tiempo.

Aprender más

Este ejemplo sólo raye la superficie de lo que es posible con.mapreduce Consulte la documentación para obtener más información, incluida la información sobre cómo usarla con Hadoop y MATLAB® Parallel Server™.mapreduce

Consulte también

|

Temas relacionados