2017-07-12 4 views
2

Ich habe Anforderung, einen Ordner bei hdfs mit einer großen Anzahl von Dateien sagen, sagen 1000000. Und das ist keine einmalige Aufgabe, das ist meine tägliche Anforderung. Derzeit verwende ich unterSo löschen Sie Ordner mit einer großen Anzahl von Dateien bei hdfs sehr schnell

Configuration c=new Configuration(); 
FileSystem fs = FileSystem.get(c); 
fs.delete(folder,true); 

Aber oben dauert viel mehr Zeit ca. 3 Stunden. Gibt es eine Möglichkeit, wie ich ganze Ordner sehr schnell löschen kann?

+0

einen Versuch wert: https://stackoverflow.com/questions/34140344/how-to-delete-files-from-the-hdfs (Deaktivieren des Papierkorbs) –

+0

@RC. Es lohnt sich, '-skipTrash' zu verwenden, wenn Sie sicher sind, dass die Daten dauerhaft gelöscht werden sollen. Die Auswirkungen werden jedoch höchstwahrscheinlich marginal sein (falls vorhanden). Die Option ist hauptsächlich nützlich für Verzeichnisse, die über Quoten verfügen. Die Papierkorboperation wird als einfache Metadatenoperation implementiert, die unabhängig von der Anzahl der Dateien im Verzeichnis oder der Größe der einzelnen Dateien schnell abgeschlossen wird. – Pierre

+0

@RC Papierkorb ist bereits mit Null-Intervall deaktiviert –

Antwort

2

Einfache Antwort: können Sie nicht.

Lassen Sie mich erklären, warum. Wenn Sie einen Ordner löschen, entfernen Sie alle Verweise auf alle rekursiv darin enthaltenen Dateien. Die Metadaten zu diesen Dateien (Chunk-Speicherorte) bleiben im Namenscode erhalten.

Die Datenknoten speichern Datenblöcke, haben aber im Grunde keine Ahnung von den tatsächlichen Dateien, denen sie entsprechen. Obwohl Sie technisch alle Verweise auf einen Ordner aus dem namenode entfernen könnten (was den Ordner als gelöscht erscheinen lassen würde), würden die Daten immer noch auf den Datenknoten verbleiben, die nicht wissen könnten, dass die Daten "tot" sind.

Wenn Sie also einen Ordner löschen, müssen Sie zuerst den gesamten Speicher aus allen Datenabschnitten zurückfordern, die für alle Dateien über den gesamten Cluster verteilt sind. Dies kann viel Zeit in Anspruch nehmen, ist aber grundsätzlich unvermeidbar.

Sie könnten einfach Löschungen in einem Hintergrundthread verarbeiten. Obwohl dies nicht mit dem langwierigen Prozess helfen wird, würde dies diesen Prozess zumindest vor der Anwendung verbergen.

+0

Wenn ich ein Map-Reduce-Programm verwende, um diese Datei zu löschen, können 500 Dateien pro Mapper helfen. Oder wird dasselbe sein, wie Treiberprogramm Zeit braucht, um Dateien zu laden –

+0

@agarwal_achhnera Warum würden Sie MR verwenden, um Dateien zu löschen? Der Zweck ist es, die Dateien zu bearbeiten, in der Regel keine Wartungsarbeiten durchzuführen. – Pierre

+0

Da angenommen wird, dass es 1000000 Dateien gibt, erstelle ich nun einen Mapper für jeweils 500 Dateien, so dass insgesamt 2000 Mapper gleichzeitig eine Löschanforderung für 500 Dateien senden. Nicht sicher, ob namenode so schnell funktioniert oder nicht, aber frag einfach, ob es hilft oder nicht. –

Verwandte Themen