que comandos hadoop nested mapreduce directory-walk

comandos - Hadoop MapReduce proporciona directorios anidados como entrada de trabajo



comandos hdfs dfs (5)

Encuentro que los datos de forma recursiva pueden ser peligrosos ya que puede haber archivos de registro persistentes de un distcp o algo similar. Déjame proponer una alternativa:

Haga el recorrido recursivo en la línea de comando y luego pase las rutas en un parámetro delimitado por espacios en su programa MapReduce. Agarra la lista de argv :

$ hadoop jar blah.jar "`hadoop fs -lsr recursivepath | awk ''{print $8}'' | grep ''/data.*/.txt'' | tr ''/n'' '' ''`"

Perdón por la larga bash, pero hace el trabajo bien. Podría envolver la cosa en un script bash para dividir las cosas en variables.

Personalmente, me gusta el enfoque pass-in-filepath para escribir mis trabajos de mapreduce para que el código en sí no tenga rutas codificadas y es relativamente fácil para mí configurarlo para que se ejecute en una lista más compleja de archivos.

Estoy trabajando en un trabajo que procesa una estructura de directorios anidados, que contiene archivos en múltiples niveles:

one/ ├── three/ │   └── four/ │   ├── baz.txt │   ├── bleh.txt │   └── foo.txt └── two/ ├── bar.txt └── gaa.txt

Cuando agrego one/ como ruta de entrada, no se procesan los archivos, ya que ninguno está inmediatamente disponible en el nivel raíz.

Leí sobre job.addInputPathRecursively(..) , pero parece haber quedado obsoleto en las versiones más recientes (estoy usando hadoop 1.0.2). He escrito un código para recorrer las carpetas y agregar cada directorio con job.addInputPath(dir) , que funcionó hasta que el trabajo se bloqueó al tratar de procesar un directorio como un archivo de entrada por algún motivo, por ejemplo, intentando fs.open(split.getPath()) , cuando split.getPath() es un directorio (Esto sucede dentro de LineRecordReader.java ).

Estoy tratando de convencerme de que tiene que haber una manera más simple de proporcionar un trabajo con una estructura de directorios anidados. ¿Algunas ideas?

EDITAR - aparentemente hay un error abierto en esto.


No encontré ningún documento sobre esto, pero */* funciona. Entonces, es -input ''path/*/*'' .


No sé si sigue siendo relevante, pero al menos en hadoop 2.4.0 puede establecer la propiedad mapreduce.input.fileinputformat.input.dir.recursive en true y resolverá su problema.


import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;

FileInputFormat.setInputDirRecursive (job, true);

No, gracias, solo llámame LeiFeng!


solo use FileInputFormat.addInputPath ("con patrón de archivo"); Estoy escribiendo mi primer programa hadoop para el análisis de gráficos donde la entrada es de diff dir en formato .gz ... ¡funcionó para mí!