java - que - oracle big data appliance
¿Cómo obtener el contenido del archivo/archivo como entrada de clave/valor para MAP al ejecutar un trabajo de Hadoop MapReduce? (3)
Como alternativa a su enfoque, tal vez agregue los archivos binarios a hdfs directamente. A continuación, cree un archivo de entrada que contenga las rutas dfs para todos los archivos binarios. Esto podría hacerse dinámicamente usando la clase FileSystem de Hadoop . Por último, cree un asignador que procese la entrada abriendo las secuencias de entrada, de nuevo usando FileSystem.
Estoy creando un programa para analizar archivos PDF, DOC y DOCX. Estos archivos se almacenan en HDFS.
Cuando comienzo mi trabajo de MapReduce, quiero que la función de mapa tenga el nombre de archivo como clave y el contenido binario como valor. Luego quiero crear un lector de flujo que pueda pasar a la biblioteca del analizador PDF. ¿Cómo puedo lograr que el par clave / valor para la Fase del Mapa sea el nombre del archivo / archivo?
Estoy usando Hadoop 0.20.2
Este es un código anterior que inicia un trabajo:
public static void main(String[] args) throws Exception {
JobConf conf = new JobConf(PdfReader.class);
conf.setJobName("pdfreader");
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);
conf.setMapperClass(Map.class);
conf.setReducerClass(Reduce.class);
conf.setInputFormat(TextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);
FileInputFormat.setInputPaths(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path(args[1]));
JobClient.runJob(conf);
}
Sé que hay otros tipos de formatos de entrada. ¿Pero hay uno que haga exactamente lo que quiero? Encuentro la documentación bastante vaga. Si hay uno disponible, ¿cómo deberían verse los tipos de entrada de la función Mapa?
¡Gracias por adelantado!
La solución a esto es crear su propia clase FileInputFormat que hace esto. Usted tiene acceso al nombre del archivo de entrada del FileSplit que este FileInputFormat recibe (getPath). Asegúrese de anular el isSplitable de su FileInputformat para que siempre devuelva false.
También necesitará un RecordReader personalizado que devuelva todo el archivo como un único valor "Record".
Tenga cuidado al manejar archivos que son demasiado grandes. Efectivamente cargará todo el archivo en la RAM y la configuración predeterminada para un rastreador de tareas es tener solo 200 MB de RAM disponibles.
Puede usar WholeFileInputFormat ( https://code.google.com/p/hadoop-course/source/browse/HadoopSamples/src/main/java/mr/wholeFile/?r=3 )
En el nombre del mapeador del archivo puede obtener este comando:
public void map(NullWritable key, BytesWritable value, Context context) throws
IOException, InterruptedException
{
Path filePath= ((FileSplit)context.getInputSplit()).getPath();
String fileNameString = filePath.getName();
byte[] fileContent = value.getBytes();
}