Cómo escribir programas MapReduce en Hadoop
La siguiente figura muestra las etapas por las que pasa un trabajo de principio a fin, y el controlador de cada etapa (usuario o framework Hadoop).
La siguiente figura muestra en detalle el trabajo que los usuarios deben realizar al escribir trabajos de MapReduce y el trabajo que el marco Hadoop completa automáticamente:
Cuando los usuarios escriben programas mapreduce, especifican entradas a través de InputFormat y OutputFormat respectivamente y el formato de salida, y defina Mapper y reducer para especificar el trabajo a completar en las fases de Mapa y Reducción. En Mapper o Reducer, los usuarios solo necesitan especificar un par de lógica de procesamiento clave/valor, y el marco Hadoop analizará automática e iterativamente todas las claves/valores en secuencia y entregará cada par de claves/valores a Mapper o Reductor para procesamiento. En la superficie, Hadoop limita el formato de datos a clave/valor, lo cual es demasiado simple y no puede resolver problemas complejos. De hecho, se puede guardar información múltiple mediante una combinación de claves o valores (por ejemplo, se guardan varios campos en la clave o valor, cada campo está separado por un delimitador o el valor es un objeto serializado, que se deserializa). cuando se usa en Mapper, etc.) para resolver aplicaciones con formatos de entrada complejos.
2.2 Trabajo del usuario
Los usuarios necesitan implementar clases o métodos para escribir MapReduce:
(1) Interfaz de formato de entrada
Los usuarios necesitan implementar Esta interfaz se utiliza para especificar el formato de contenido del archivo de entrada. Esta interfaz tiene dos métodos.
La función getSplits divide todos los datos de entrada en numSplits y cada división se entrega a una tarea de mapa para su procesamiento. La función getRecordReader proporciona un objeto iterador para que los usuarios analicen la división, que analiza cada registro de la división en un par clave/valor.
Hadoop en sí proporciona algunos formatos de entrada:
(2) Interfaz Mapper
Los usuarios deben heredar la interfaz Mapper para implementar su propio Mapper, que debe implementarse en Mapper Las funciones son
mapa vacío (tecla K1,
valor V1,
colector de salida ltK2, V2 gt; salida,
Reporter reporter
) lanza IOException
Entre ellos,
El propio Hadoop proporciona algunos mapeadores para que los utilicen los usuarios:
(3) Interfaz del particionador
Los usuarios deben heredar esta interfaz para implementar su propio particionador y especificar qué tarea de reducción procesará los pares clave/valor generados por la tarea de mapa. Un buen divisor puede hacer que los datos procesados por cada tarea de reducción sean similares para lograr el equilibrio de carga. Las funciones a implementar en el particionador son
Obtener la partición (?K2? clave, valor V2, parte entera)
Esta función devuelve
Si el El usuario no proporciona un divisor y Hadoop utilizará el predeterminado (en realidad, una función hash).
(4) Combinador
El combinador reduce en gran medida la cantidad de transmisión de datos entre tareas de mapas y tareas reducidas, y puede mejorar significativamente el rendimiento. En la mayoría de los casos, los combinadores son lo mismo que los reductores.
(5) Interfaz Reducer
Los usuarios deben heredar la interfaz Reducer para implementar su propio Reducer. Las funciones que deben implementarse en Reducer son
Hadoop. en sí mismo proporciona algunos Reductores para que los usen los usuarios:
(6) Formato de salida
Los usuarios especifican el formato de contenido del archivo de salida a través de OutputFormat, pero no hay división.
Cada tarea de reducción escribe sus datos en su propio archivo part-nnnnn, donde nnnnn es el ID de la tarea de reducción.
El propio Hadoop proporciona varios formatos de salida:
3. Caché distribuido
Haoop viene con caché distribuido, es decir, objetos de caché distribuidos, lo que facilita las tareas de mapas. Comparte algunos. información entre ellos o entre tareas reducidas. Por ejemplo, en algunas aplicaciones prácticas, si todas las tareas del mapa quieren leer el mismo archivo de configuración o diccionario, entonces el archivo de configuración o diccionario se puede colocar en la caché distribuida.
4.? Escriba trabajos de MapReduce en varios idiomas
Hadoop está escrito en Java, por lo que Hadoop naturalmente admite trabajos de escritura en Java. Sin embargo, en aplicaciones reales, a veces debido a la necesidad de utilizar bibliotecas de terceros que no sean Java u otras razones, los trabajos de MapReduce deben escribirse en C/C u otros lenguajes. En este momento, se pueden utilizar algunas herramientas proporcionadas por Hadoop.