2012-04-10 22 views
6

En mi trabajo, tengo la necesidad de analizar muchos registros históricos. Los clientes individuales (hay miles) pueden tener cientos de subdirectorios de registro desglosados ​​por fecha. Por ejemplo:¿Pasar directorios no archivos a hadoop-streaming?

  • logs/Customer_One/2011-01-02-001
  • logs/Customer_One/2012-02-03-001
  • logs/Customer_One/2012-02-03-002
  • logs/Customer_Two/2009-03-03-001
  • logs/Customer_Two/2009-03-03-002

Cada conjunto de registro individual puede ser en sí mismo cinco o seis niveles de profundidad y contienen miles de archivos.

Por lo tanto, realmente quiero que los trabajos de mapas individuales se manejen recorriendo los subdirectorios: ¡simplemente enumerar archivos individuales es parte de mi problema de computación distribuida!

Desafortunadamente, cuando intento pasar un directorio que contiene solo subdirectorios de registro a Hadoop, se queja de que no puedo pasar esos subdirectorios a mi asignador. (Una vez más, he escrito a aceptar como entrada subdirectorios):

$ hadoop jar "${HADOOP_HOME}/contrib/streaming/hadoop-streaming-${HADOOP_VERSION}.jar" -input file:///mnt/logs/Customer_Name/ -file mapper.sh -mapper "mapper.sh" -file reducer.sh -reducer "reducer.sh" -output .

[ . . . ]

12/04/10 12:48:35 ERROR security.UserGroupInformation: PriviledgedActionException as:cloudera (auth:SIMPLE) cause:java.io.IOException: Not a file: file:/mnt/logs/Customer_Name/2011-05-20-003 12/04/10 12:48:35 ERROR streaming.StreamJob: Error Launching job : Not a file: file:/mnt/logs/Customer_Name/2011-05-20-003 Streaming Command Failed! [[email protected] ~]$

¿Hay una manera fácil de convencer a Hadoop-streaming de que me permita asignar directorios como elementos de trabajo?

+0

wildcarding/globs debería funcionar, intente '-input file: /// mnt/logs/Customer _ */**/*. Log' –

+0

Globos no es la respuesta: Primero, encontraría solo archivos en un dado nivel en el árbol de directorios en lugar de niveles múltiples; segundo, como describí originalmente, el número de directorios y subdirectorios es enorme (de hecho, mucho más allá de los reinos de un shell para expandir sin xargs) y el tiempo para recorrer ese árbol es exactamente parte del problema que quiero distribuir. (Realizar solo los globbing de los que está hablando tomaría días, literalmente, con 1 ms rt). –

+1

Por un momento tuve algún recuerdo de que hadoop admitía globs recursivos con la notación de doble estrella (**), pero una prueba rápida en mi consola dice lo contrario –

Respuesta

1

Supongo que debe investigar escribir un archivo de entrada personalizado que también puede pasar el directorio raíz, creará una división para cada cliente y luego el lector de registros para cada división hará el recorrido del directorio y empujará el contenido del archivo en sus mapeadores

+0

No está claro para mí que hadoop-streaming puede aceptar cualquier otro formato de entrada. ¿Puede? –

+0

http://hadoop.apache.org/mapreduce/docs/r0.21.0/streaming.html - vea el parámetro '-inputformat' –

+0

Sí. Pero si lo cambio a un InputFormat existente diferente (por ejemplo, org.apache.hadoop.mapred.KeyValueTextInputFormat), sigue quejándose de "no es un archivo"." –

0

Hadoop admite las rutas de entrada como expresión regular. No he experimentado con muchos regex complejos, pero los marcadores de posición simples ? y * funciona.

Así que en su caso creo que si tiene lo siguiente como su ruta de entrada que va a funcionar:

file:///mnt/logs/Customer_Name/*/* 

El último asterisco podría no ser necesario ya que todos los archivos en el directorio definitivo se añaden automáticamente como entrada camino.

+0

¿Puedo saber por qué se votó negativamente? Esta es una forma sencilla y dulce de pasar el directorio como su ruta de entrada, solo que necesita saber la profundidad de antemano. Lo he usado con éxito muchas veces. – Amar

+0

No funciona. Encuentra solo archivos en un nivel dado. – Liton

Cuestiones relacionadas