sql >> Base de Datos >  >> RDS >> Database

Comprender los tipos y formatos de MapReduce

Hadoop utiliza el modelo de programación MapReduce para el procesamiento de datos de entrada y salida para el mapa y para reducir las funciones representadas como pares clave-valor. Están sujetos a la ejecución paralela de conjuntos de datos situados en una amplia gama de máquinas en una arquitectura distribuida. El paradigma de programación es esencialmente de naturaleza funcional al combinarse mientras se usa la técnica de mapear y reducir. Este artículo presenta el modelo MapReduce y, en particular, cómo se utilizan los datos en varios formatos, desde texto simple hasta objetos binarios estructurados.

Tipos de MapReduce

Mapeo es la técnica central de procesamiento de una lista de elementos de datos que vienen en pares de claves y valores. La función map se aplica a elementos individuales definidos como pares clave-valor de una lista y produce una nueva lista. La idea general de mapear y reducir la función de Hadoop se puede ilustrar de la siguiente manera:

map: (K1, V1) -> list (K2, V2)
reduce: (K2, list(V2)) -> list (K3, V3)

Los parámetros de entrada del par clave y valor, representados por K1 y V1 respectivamente, son diferentes del tipo de par de salida:K2 y V2. La función de reducción acepta el mismo formato de salida del mapa, pero el tipo de salida de la operación de reducción es diferente:K3 y V3. La API de Java para esto es la siguiente:

public interface Mapper<K1, V1, K2, V2> extends JobConfigurable,
      Closeable {
   void map(K1 key, V1 value, OutputCollector<K2, V2> output,
      Reporter reporter) throws IOException;
}

public interface Reducer<K2, V2, K3, V3> extends JobConfigurable,
      Closeable {
   void reduce(K2 key, Iterator<V2> values,
      OutputCollector<K3, V3> output, Reporter reporter)throws
         IOException;
}

El recolector de salida es la interfaz generalizada del marco Map-Reduce para facilitar la recopilación de datos de salida ya sea por el Mapper o el Reductor . Estas salidas no son más que salidas intermedias del trabajo. Por lo tanto, deben parametrizarse con sus tipos. El Reportero facilita la aplicación Map-Reduce para informar el progreso y actualizar los contadores y la información de estado. Sin embargo, si se usa la función de combinación, tiene la misma forma que la función de reducción y la salida se envía a la función de reducción. Esto se puede ilustrar de la siguiente manera:

map: (K1, V1) -> list (K2, V2)
combine: (K2, list(V2)) -> list (K2, V2)
reduce: (K2, list(V2)) -> list (K3, V3)

Tenga en cuenta que las funciones de combinar y reducir usan el mismo tipo, excepto en los nombres de variables donde K3 es K2 y V3 es V2.

La función de partición opera en los tipos intermedios de clave-valor. Controla la partición de las claves de las salidas del mapa intermedio. La clave deriva la partición utilizando una función hash típica. El número total de particiones es el mismo que el número de tareas de reducción para el trabajo. La partición está determinada solo por la clave que ignora el valor.

public interface Partitioner<K2, V2> extends JobConfigurable {
   int getPartition(K2 key, V2 value, int numberOfPartition);
}

Esta es la esencia clave de los tipos de MapReduce en resumen.

Formatos de entrada

Hadoop tiene que aceptar y procesar una variedad de formatos, desde archivos de texto hasta bases de datos. Una porción de entrada, llamada división de entrada , es procesado por un solo mapa. Cada división se divide a su vez en registros lógicos que se entregan al mapa para que los procese en un par clave-valor. En el contexto de la base de datos, la división significa leer un rango de tuplas de una tabla SQL, como lo hace el DBInputFormat y producir LongWritables que contiene números de registro como claves y DBWritables como valores. La API de Java para divisiones de entrada es la siguiente:

public interface InputSplit extends Writable {
   long getLength() throws IOException;
   String[] getLocations() throws IOException;
}

La División de entrada representa los datos a ser procesados ​​por un Mapper . Devuelve la longitud en bytes y tiene una referencia a los datos de entrada. Presenta una vista orientada a bytes en la entrada y es responsabilidad del RecordReader del trabajo para procesar esto y presentar una vista orientada a registros. En la mayoría de los casos, no tratamos con InputSplit directamente porque son creados por un InputFormat . Es responsabilidad del InputFormat para crear las divisiones de entrada y dividirlas en registros.

public interface InputFormat<K, V> {
   InputSplit[] getSplits(JobConf job, int numSplits) throws
      IOException;

   RecordReader<K, V> getRecordReader(InputSplit split,
      JobConf job, throws IOException;
}

JobClient invoca el getSplits() método con el número apropiado de argumentos divididos. El número dado es una pista, ya que el número real de divisiones puede ser diferente del número dado. Una vez que se calcula la división, se envía al rastreador de trabajos. El rastreador de trabajos programa tareas de mapa para los rastreadores de tareas utilizando la ubicación de almacenamiento. Luego, el rastreador de tareas pasa la división invocando getRecordReader() método en InputFormat para obtener RecordReader para la división.

El formato de entrada de archivo es la clase base para el origen de datos del archivo. Tiene la responsabilidad de identificar los archivos que se incluirán como entrada del trabajo y la definición para generar la división.

Hadoop también incluye el procesamiento de datos no estructurados que a menudo vienen en formato de texto. El formato de entrada de texto es el InputFormat predeterminado para tales datos.

El formato de entrada de secuencia toma entradas binarias y almacena secuencias de pares clave-valor binarios.

De manera similar, DBInputFormat brinda la capacidad de leer datos de una base de datos relacional usando JDBC.

Formatos de salida

Las clases de formato de salida son similares a sus clases de formato de entrada correspondientes y funcionan en la dirección inversa.

Por ejemplo, el TextOutputFormat es el formato de salida predeterminado que escribe registros como archivos de texto sin formato, mientras que los valores-clave pueden ser de cualquier tipo y los transforma en una cadena invocando toString() método. El carácter de clave-valor está separado por el carácter de tabulación, aunque esto se puede personalizar manipulando la propiedad del separador del formato de salida de texto.

Para la salida binaria, hay SequenceFileOutputFormat para escribir una secuencia de salida binaria en un archivo. Las salidas binarias son especialmente útiles si la salida se convierte en entrada para otro trabajo de MapReduce.

Los formatos de salida para bases de datos relacionales y para HBase son manejados por DBOutputFormat . Envía la salida reducida a una tabla SQL. Por ejemplo, el TableOutputFormat de HBase permite que el programa MapReduce funcione con los datos almacenados en la tabla HBase y los utiliza para escribir resultados en la tabla HBase.

Conclusión

Este es, en resumen, el quid de los tipos y formatos de MapReduce. Consulte la lista en la referencia a continuación para obtener más detalles sobre ellos. Hay muchos detalles intrincados sobre las funciones de las API de Java que se vuelven más claros solo cuando uno se sumerge en la programación. Consulte los documentos de la API Java de Apache Hadoop para obtener más detalles y comience a codificar algunas prácticas.

Referencias

  • Tom White, Hadoop La guía definitiva , O'Reilly
  • Documentos de la API Java de Apache Hadoop