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. |