Cómo permitir que hadoop lea archivos con formato de texto que terminan en gz
A partir de la excepción anterior, inmediatamente supuse que debido a que mi archivo terminaba en gz, Hadoop lo consideró como un archivo comprimido y luego intentó descomprimirlo y leerlo, pero la descompresión falló. Entonces le pregunté a Google, pero no pude encontrar una respuesta que pudiera resolver directamente mi problema, pero encontré el código fuente relevante aquí: LineRecordReader.java, así que intenté leer el código para resolver el problema. , heredado de RecordReader, y no vi que la función next y la función readLine deberían ser implementadas por la clase base. Rápidamente encontré los nombres en clave relacionados con la compresión y decodificación:
private CompressionCodecFactory compresiónCodecs = null;
...
...
compressionCodecs = new CompresiónCodecFactory(trabajo);
códec CompressionCodec final = compresiónCodecs.getCodec(archivo);
...
if (códec ! = null) {
in = new LineReader(codec.createInputStream(fileIn), trabajo);
}
else{
. ..
in = new LineReader(fileIn, job);
}
El archivo aquí es la ruta del archivo. Puede ver que debería. Se pasa la función CompressionCode.getCode (archivo), obtiene la clase de códec y luego lee la excepción lanzada cuando ocurre la excepción. Entonces, ¿cómo se consigue que un programa MapReduce trate los archivos .gz como archivos de texto normales? Luego haga clic para ver el código en CompressionCodeFactory.java. El código de la función getCodec es el siguiente:
/**
* Encuentra el códec de compresión relevante para un archivo determinado según su
* sufijo de nombre de archivo. .
* @param file El nombre del archivo que se va a comprobar
* @return codec object
*/
public CompressionCodec getCodec (Ruta file ) {
Resultado de CompressionCodec = null;
if (codecs != null) {
String filename = file.getName();
String reversedFilename = new StringBuffer(filename).reverse().toString();
SortedMap
if ( !subMap.isEmpty()) {
Cadena potencialSuffix = subMap.lastKey();
if (reversedFilename.startsWith(potentialSuffix)){
resultado = codecs.get(potentialSuffix)
}
}
}
}
devuelve resultado;
}