Hadoop - Transmisión

La transmisión de Hadoop es una utilidad que viene con la distribución de Hadoop. Esta utilidad le permite crear y ejecutar trabajos de Map / Reduce con cualquier ejecutable o script como mapeador y / o reductor.

Ejemplo usando Python

Para la transmisión de Hadoop, estamos considerando el problema del recuento de palabras. Cualquier trabajo en Hadoop debe tener dos fases: mapeador y reductor. Hemos escrito códigos para el asignador y el reductor en el script de Python para ejecutarlo en Hadoop. También se puede escribir lo mismo en Perl y Ruby.

Código de fase del asignador

!/usr/bin/python

import sys

# Input takes from standard input for myline in sys.stdin: 
   # Remove whitespace either side 
   myline = myline.strip() 

   # Break the line into words 
   words = myline.split() 

   # Iterate the words list
   for myword in words:
      # Write the results to standard output 
      print '%s\t%s' % (myword, 1)

Asegúrese de que este archivo tenga permiso de ejecución (chmod + x / home / expert / hadoop-1.2.1 / mapper.py).

Código de fase del reductor

#!/usr/bin/python

from operator import itemgetter 
import sys 

current_word = ""
current_count = 0 
word = "" 

# Input takes from standard input for myline in sys.stdin: 
   # Remove whitespace either side 
   myline = myline.strip() 

   # Split the input we got from mapper.py word, 
   count = myline.split('\t', 1) 

   # Convert count variable to integer 
   try: 
      count = int(count) 

   except ValueError: 
      # Count was not a number, so silently ignore this line continue

   if current_word == word: 
   current_count += count 
   else: 
      if current_word: 
         # Write result to standard output print '%s\t%s' % (current_word, current_count) 
   
      current_count = count
      current_word = word

# Do not forget to output the last word if needed! 
if current_word == word: 
   print '%s\t%s' % (current_word, current_count)

Guarde los códigos del asignador y reductor en mapper.py y reducer.py en el directorio de inicio de Hadoop. Asegúrese de que estos archivos tengan permiso de ejecución (chmod + x mapper.py y chmod + x reducer.py). Como Python es sensible a la sangría, el mismo código se puede descargar desde el siguiente enlace.

Ejecución del programa WordCount

$ $HADOOP_HOME/bin/hadoop jar contrib/streaming/hadoop-streaming-1.
2.1.jar \
   -input input_dirs \ 
   -output output_dir \ 
   -mapper <path/mapper.py \ 
   -reducer <path/reducer.py

Donde "\" se usa para la continuación de la línea para una legibilidad clara.

Por ejemplo,

./bin/hadoop jar contrib/streaming/hadoop-streaming-1.2.1.jar -input myinput -output myoutput -mapper /home/expert/hadoop-1.2.1/mapper.py -reducer /home/expert/hadoop-1.2.1/reducer.py

Cómo funciona la transmisión

En el ejemplo anterior, tanto el asignador como el reductor son scripts de Python que leen la entrada desde la entrada estándar y emiten la salida a la salida estándar. La utilidad creará un trabajo Mapa / Reducir, enviará el trabajo a un clúster apropiado y supervisará el progreso del trabajo hasta que se complete.

Cuando se especifica un script para los mapeadores, cada tarea del mapeador iniciará el guión como un proceso separado cuando se inicializa el mapeador. A medida que se ejecuta la tarea del asignador, convierte sus entradas en líneas y alimenta las líneas a la entrada estándar (STDIN) del proceso. Mientras tanto, el asignador recopila las salidas orientadas a la línea de la salida estándar (STDOUT) del proceso y convierte cada línea en un par clave / valor, que se recopila como la salida del asignador. De forma predeterminada, el prefijo de una línea hasta el primer carácter de tabulación es la clave y el resto de la línea (excluyendo el carácter de tabulación) será el valor. Si no hay un carácter de tabulación en la línea, toda la línea se considera la clave y el valor es nulo. Sin embargo, esto se puede personalizar, según sea necesario.

Cuando se especifica una secuencia de comandos para reductores, cada tarea de reductor iniciará la secuencia de comandos como un proceso independiente y luego se inicializará el reductor. A medida que se ejecuta la tarea de reducción, convierte sus pares clave / valores de entrada en líneas y alimenta las líneas a la entrada estándar (STDIN) del proceso. Mientras tanto, el reductor recopila las salidas orientadas a la línea de la salida estándar (STDOUT) del proceso, convierte cada línea en un par clave / valor, que se recopila como la salida del reductor. De forma predeterminada, el prefijo de una línea hasta el primer carácter de tabulación es la clave y el resto de la línea (excluyendo el carácter de tabulación) es el valor. Sin embargo, esto se puede personalizar según los requisitos específicos.

Comandos importantes

Parámetros Opciones Descripción
-directorio de entrada / nombre-archivo Necesario Ingrese la ubicación para el mapeador.
-nombre-directorio de salida Necesario Ubicación de salida para reductor.
-mapper ejecutable o script o JavaClassName Necesario Mapeador ejecutable.
-reducer ejecutable o script o JavaClassName Necesario Reductor ejecutable.
-archivo nombre-archivo Opcional Hace que el mapeador, reductor o combinador ejecutable esté disponible localmente en los nodos de cálculo.
-inputformat JavaClassName Opcional La clase que proporcione debe devolver pares clave / valor de la clase Text. Si no se especifica, TextInputFormat se utiliza como predeterminado.
-outputformat JavaClassName Opcional La clase que proporcione debe incluir pares clave / valor de la clase de texto. Si no se especifica, TextOutputformat se utiliza como predeterminado.
-particionador JavaClassName Opcional Clase que determina a qué reducción se envía una clave.
-comando streamingCommand o JavaClassName Opcional Combiner ejecutable para salida de mapas.
-cmdenv nombre = valor Opcional Pasa la variable de entorno a los comandos de transmisión.
lector de entrada Opcional Para compatibilidad con versiones anteriores: especifica una clase de lector de registros (en lugar de una clase de formato de entrada).
-verboso Opcional Salida detallada.
-lazyOutput Opcional Crea resultados de forma perezosa. Por ejemplo, si el formato de salida se basa en FileOutputFormat, el archivo de salida se crea solo en la primera llamada a output.collect (o Context.write).
-numReduceTasks Opcional Especifica el número de reductores.
-mapdebug Opcional Script para llamar cuando falla la tarea de mapa.
-reducebug Opcional Script para llamar cuando falla la tarea de reducción.