it-swarm.com.de

Anhängen von Daten an eine vorhandene Datei in HDFS Java

Ich habe Probleme beim Anhängen von Daten an eine vorhandene Datei in HDFS. Ich möchte, dass, wenn die Datei vorhanden ist, eine Zeile angehängt wird, andernfalls eine neue Datei mit dem angegebenen Namen erstellt wird.

Hier ist meine Methode zum Schreiben in 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();

Tatsächlich schreibt diese Methode in HDFS und erstellt eine Datei, die aber wie gesagt nicht anhängt.

So teste ich meine Methode:

RunTimeCalculationHdfsWrite.hdfsWriteFile("RunTimeParserLoaderMapperTest2", "Error message test 2.2", context, null);

Der erste Parameter ist der Name der Datei, der zweite die Nachricht und die anderen beiden Parameter sind nicht wichtig.

Also hat jemand eine Idee was ich vermisse oder falsch mache?

19
kennechu

Sie können tatsächlich an eine HDFS-Datei anhängen:

Aus der Perspektive des Clients ruft der append-Vorgang zuerst das Anhängen von DistributedFileSystem auf. Dieser Vorgang würde ein Stream-Objekt FSDataOutputStream zurückgeben. Wenn der Client Daten an diese Datei anhängen muss, könnte er out.write zum Schreiben aufrufen und out.close zum Schließen.

Ich habe HDFS-Quellen geprüft, es gibt eine DistributedFileSystem#append-Methode:

 FSDataOutputStream append(Path f, final int bufferSize, final Progressable progress) throws IOException

Einzelheiten finden Sie unter Präsentation .

Sie können auch über die Befehlszeile hinzufügen:

hdfs dfs -appendToFile <localsrc> ... <dst>

Zeilen direkt aus stdin hinzufügen:

echo "Line-to-add" | hdfs dfs -appendToFile - <dst>
36

HDFS erlaubt keine append-Vorgänge. Eine Möglichkeit, dieselbe Funktionalität wie das Anhängen zu implementieren, ist:

  • Überprüfen Sie, ob eine Datei vorhanden ist. 
  • Wenn die Datei nicht vorhanden ist, erstellen Sie eine neue Datei und schreiben Sie in eine neue Datei
  • Wenn eine Datei vorhanden ist, erstellen Sie eine temporäre Datei. 
  • Zeile aus Originaldatei lesen und dieselbe Zeile in temporäre Datei schreiben (Newline nicht vergessen)
  • Schreiben Sie die Zeilen, die Sie an die temporäre Datei anhängen möchten.
  • Löschen Sie schließlich die Originaldatei und verschieben Sie die temporäre Datei in die Originaldatei.
3
Chaos

Gelöst .. !!

Anhängen wird in HDFS unterstützt.

Sie müssen nur einige Konfigurationen und einfachen Code wie unten gezeigt ausführen:

Schritt 1 : setze dfs.support.append in hdfs-site.xml auf true:

<property>
   <name>dfs.support.append</name>
   <value>true</value>
</property>

Stoppen Sie alle Ihre Daemon-Dienste mit stop-all.sh und starten Sie sie erneut mit start-all.sh 

Schritt 2 (optional) : Nur Wenn Sie einen Singlenode-Cluster haben, müssen Sie den Replikationsfaktor wie folgt auf 1 setzen:

Über die Befehlszeile: 

./hdfs dfs -setrep -R 1 filepath/directory

Oder Sie können dasselbe zur Laufzeit durch Java-Code ausführen: 

fShell.setrepr((short) 1, filePath);  

Schritt 3 : Code zum Erstellen/Anhängen von Daten in die Datei:

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();
        }
    }
}

Bitte lassen Sie mich für weitere Hilfe wissen.

Prost.!!

2