Adjuntar datos a un archivo existente en HDFS Java
hadoop filewriter (3)
En realidad, puede adjuntar a un archivo HDFS:
Desde la perspectiva del Cliente, la operación de adición en primer lugar llama a la aplicación adjunta de DistributedFileSystem, esta operación devolverá un objeto de flujo FSDataOutputStream. Si el Cliente necesita adjuntar datos a este archivo, podría llamar a out.write para escribir, y llamar a out.close para cerrar.
Revisé las fuentes HDFS, hay un método de DistributedFileSystem#append
:
FSDataOutputStream append(Path f, final int bufferSize, final Progressable progress) throws IOException
Para más detalles, ver slideshare.net/dataera/inside-hdfs-append .
También puedes adjuntar a través de la línea de comando:
hdfs dfs -appendToFile <localsrc> ... <dst>
Añadir líneas directamente desde stdin:
echo "Line-to-add" | hdfs dfs -appendToFile - <dst>
Tengo problemas para agregar datos a un archivo existente en HDFS. Quiero que si el archivo existe, a continuación, agregue una línea, si no, cree un nuevo archivo con el nombre dado.
Aquí está mi método para escribir en HDFS.
if (!file.exists(path)){
file.createNewFile(path);
}
FSDataOutputStream fileOutputStream = file.append(path);
BufferedWriter br = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
br.append("Content: " + content + "/n");
br.close();
En realidad, este método escribe en HDFS y crea un archivo, pero como mencioné no está adjuntando.
Así es como pruebo mi método:
RunTimeCalculationHdfsWrite.hdfsWriteFile("RunTimeParserLoaderMapperTest2", "Error message test 2.2", context, null);
El primer parámetro es el nombre del archivo, el segundo el mensaje y los otros dos parámetros no son importantes.
Entonces, ¿alguien tiene una idea de lo que me estoy perdiendo o haciendo mal?
HDFS no permite operaciones de append
. Una forma de implementar la misma funcionalidad que anexar es:
- Compruebe si el archivo existe.
- Si el archivo no existe, cree un nuevo archivo y escríbalo
- Si el archivo existe, cree un archivo temporal.
- Lea la línea del archivo original y escriba la misma línea en el archivo temporal (no olvide la nueva línea)
- Escriba las líneas que desea agregar al archivo temporal.
- Finalmente, elimine el archivo original y mueva (cambie el nombre) el archivo temporal al archivo original.
Resuelto .. !!
Anexar es compatible con HDFS.
Solo tiene que hacer algunas configuraciones y un código simple como se muestra a continuación:
Paso 1 : establezca dfs.support.append como verdadero en hdfs-site.xml:
<property>
<name>dfs.support.append</name>
<value>true</value>
</property>
Detenga todos los servicios de su demonio usando stop-all.sh y reinícielo nuevamente usando start-all.sh
Paso 2 (Opcional) : solo si tiene un clúster de cadena única, por lo que debe establecer el factor de replicación en 1 como se muestra a continuación:
A través de la línea de comando:
./hdfs dfs -setrep -R 1 filepath/directory
O puede hacer lo mismo en tiempo de ejecución a través del código Java:
fShell.setrepr((short) 1, filePath);
Paso 3 : Código para crear / agregar datos en el archivo:
public void createAppendHDFS() throws IOException {
Configuration hadoopConfig = new Configuration();
hadoopConfig.set("fs.defaultFS", hdfsuri);
FileSystem fileSystem = FileSystem.get(hadoopConfig);
String filePath = "/test/doc.txt";
Path hdfsPath = new Path(filePath);
fShell.setrepr((short) 1, filePath);
FSDataOutputStream fileOutputStream = null;
try {
if (fileSystem.exists(hdfsPath)) {
fileOutputStream = fileSystem.append(hdfsPath);
fileOutputStream.writeBytes("appending into file. /n");
} else {
fileOutputStream = fileSystem.create(hdfsPath);
fileOutputStream.writeBytes("creating and writing into file/n");
}
} finally {
if (fileSystem != null) {
fileSystem.close();
}
if (fileOutputStream != null) {
fileOutputStream.close();
}
}
}
Por favor, hágamelo saber para cualquier otra ayuda.
Aclamaciones.!!