Esta puede ser una pregunta básica, pero no pude encontrar una respuesta para ella en Google.
Tengo un trabajo map-reduce que crea múltiples archivos de salida en su directorio de salida. Mi aplicación Java ejecuta este trabajo en un clúster remoto de hadoop y, una vez finalizado el trabajo, debe leerse la salida de forma programática utilizando la API org.apache.hadoop.fs.FileSystem
. ¿Es posible?
La aplicación conoce el directorio de salida, pero no los nombres de los archivos de salida generados por el trabajo map-reduce. Parece que no hay forma de enumerar programáticamente los contenidos de un directorio en la API del sistema de archivos hadoop. ¿Cómo se leerán los archivos de salida?
Parece un escenario tan común, que estoy seguro de que tiene una solución. Pero me falta algo muy obvio.Lectura programática del resultado del programa Mapreduce de Hadoop
Respuesta
El método que está buscando se llama listStatus (Path). Simplemente devuelve todos los archivos dentro de una ruta como una matriz FileStatus. Luego puede simplemente recorrerlos creando un objeto de ruta y leerlo.
FileStatus[] fss = fs.listStatus(new Path("/"));
for (FileStatus status : fss) {
Path path = status.getPath();
SequenceFile.Reader reader = new SequenceFile.Reader(fs, path, conf);
IntWritable key = new IntWritable();
IntWritable value = new IntWritable();
while (reader.next(key, value)) {
System.out.println(key.get() + " | " + value.get());
}
reader.close();
}
Para Hadoop 2.x se puede configurar el lector de la siguiente manera:
SequenceFile.Reader reader =
new SequenceFile.Reader(conf, SequenceFile.Reader.file(path))
Usted tiene algunas opciones: aquí hay dos que a veces uso.
Método # 1: Dependiendo del tamaño de los datos, es hacer uso de los siguientes comandos de HDFS (encontrados here, artículo 6)
hadoop fs -getmerge hdfs-output-dir local-file
// example
hadoop fs -getmerge /user/kenny/mrjob/ /tmp/mrjob_output
// another way
hadoop fs -cat /user/kenny/mrjob/part-r-* > /tmp/mrjob_output
"Este concatena el HDFS archivos hdfs-output- dir/part- * en un solo archivo local. "
Luego puede leer en un solo archivo. (Tenga en cuenta que está en el almacenamiento local y no HDFS)
Método # 2: Crear un método de ayuda: (tengo una clase llamada HDFS que contiene la configuración, las instancias de sistema de archivos como así como otros métodos de ayuda)
public List<Path> matchFiles(String path, final String filter) {
List<Path> matches = new LinkedList<Path>();
try {
FileStatus[] statuses = fileSystem.listStatus(new Path(path), new PathFilter() {
public boolean accept(Path path) {
return path.toString().contains(filter);
}
});
for(FileStatus status : statuses) {
matches.add(status.getPath());
}
} catch(IOException e) {
LOGGER.error(e.getMessage(), e);
}
return matches;
}
a continuación, puede llamar a través de un comando como este: hdfs.matchFiles("/user/kenny/mrjob/", "part-")
FSDataInputStream inputStream = fs.open(path);
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String record;
while((record = reader.readLine()) != null) {
int blankPos = record.indexOf(" ");
System.out.println(record+"blankPos"+blankPos);
String keyString = record.substring(0, blankPos);
String valueString = record.substring(blankPos + 1);
System.out.println(keyString + " | " + valueString);
}
- 1. Algoritmo del coeficiente de agrupamiento local distribuido (MapReduce/Hadoop)
- 2. Error en Hadoop MapReduce
- 3. ¿Cómo se usa MapReduce/Hadoop?
- 4. Comenzando con MapReduce/Hadoop
- 5. Salida intermedia de Hadoop MapReduce
- 6. Ordenando datos grandes usando MapReduce/Hadoop
- 7. python: lectura del resultado del subproceso en hilos
- 8. Lectura del script de shell Resultado en C# .Net Program
- 9. Lectura del resultado de syslog en una Mac
- 10. reutilizar JVM en trabajos mapreduce de Hadoop
- 11. Idea de proyecto con Hadoop MapReduce
- 12. Configuración de Hadoop: mapred. * Vs mapreduce. *
- 13. Recuento de palabras ordenadas usando Hadoop MapReduce
- 14. ejecutando múltiples trabajos de MapReduce en hadoop
- 15. Hadoop: ¿Cómo funciona OutputCollector durante MapReduce?
- 16. Hadoop o Hadoop Streaming para MapReduce en AWS
- 17. Lectura programática de una página web
- 18. Lectura programática de archivos PDF en C#
- 19. Hadoop mapreduce la transmisión desde HBase
- 20. Encontrar componentes conectados usando Hadoop/MapReduce
- 21. Hadoop MapReduce - un archivo de salida para cada entrada
- 22. Paralelización del "Reducir" en "MapReduce"
- 23. Cómo imprimir en la consola durante la ejecución del trabajo de MapReduce en hadoop
- 24. Hadoop MapReduce: Tamaño de archivo de entrada apropiado?
- 25. ¿Dónde hadoop mapreduce framework envía mis sentencias System.out.print()? (stdout)
- 26. Edición programática del contenido Wiki de Sharepoint
- 27. Hadoop MapReduce: Driver para encadenar creadores de mapas dentro de un trabajo MapReduce
- 28. Encadenando múltiples tareas de mapreduce en la transmisión de Hadoop
- 29. lectura asíncrona stdout del subproceso.Popen
- 30. Unir dos conjuntos de datos en Mapreduce/Hadoop
muchas gracias por su ayuda. – nabeelmukhtar
@Thomas, listStatus también parece devolver otros archivos, p. Ej. _SUCCESS –
Sí, pero ese no es mi problema;) Tienes que filtrar por ti mismo –