java hadoop hdfs filewriter

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.!!