我有要求在包含大量文件的hdfs上刪除一個文件夾說1000000.這不是一次性任務,這是我的日常需求。目前我正在使用下面如何在hdfs上快速刪除大量文件的文件夾
Configuration c=new Configuration();
FileSystem fs = FileSystem.get(c);
fs.delete(folder,true);
但以上是需要更多的時間約3小時。有什麼辦法可以非常快地刪除整個文件夾。
我有要求在包含大量文件的hdfs上刪除一個文件夾說1000000.這不是一次性任務,這是我的日常需求。目前我正在使用下面如何在hdfs上快速刪除大量文件的文件夾
Configuration c=new Configuration();
FileSystem fs = FileSystem.get(c);
fs.delete(folder,true);
但以上是需要更多的時間約3小時。有什麼辦法可以非常快地刪除整個文件夾。
簡單的回答:你不能。
讓我解釋一下爲什麼。當您刪除文件夾時,您將刪除其中包含的所有文件(遞歸)的所有引用。有關這些文件(塊位置)的元數據保留在namenode中。
數據節點存儲數據塊,但基本上不知道它對應的實際文件。儘管技術上可以從namenode中刪除對文件夾的所有引用(這會使該文件夾顯示爲已刪除),但數據仍將保留在datanode上,因此無法知道數據是否「已死」。
因此,當您刪除一個文件夾時,您必須首先回收所有數據塊中的所有內存,這些數據塊分佈在整個羣集中用於所有文件。這可能需要很長時間,但基本上是不可避免的。
您可以簡單地在後臺線程中處理刪除操作。雖然這對於冗長的進程沒有幫助,但這至少會將該進程從應用程序中隱藏起來。
如果我使用一些map-reduce程序刪除這些文件,可能每個mapper有500個文件會對它有所幫助。或者與驅動程序需要時間來加載文件相同 –
@agarwal_achhnera爲什麼要用MR來刪除文件?重點是處理文件,通常不執行維護操作。 – Pierre
因爲假設有1000000個文件,現在我爲每個500個文件創建一個映射器,因此總共2000個映射器將同時發送對那裏有500個文件的刪除請求。不確定namenode會如此快速或無法工作,只是問它是否有幫助。 –
值得一試:https://stackoverflow.com/questions/34140344/how-to-delete-files-from-the-hdfs(禁用垃圾) –
@RC。當確定要永久刪除數據時,值得使用'-skipTrash'。然而,這種影響很可能是微不足道的(如果有的話)。該選項主要用於超額配額目錄。垃圾操作被實現爲簡單的元數據操作,無論目錄中文件的數量或每個文件的大小如何,該操作都可以快速完成。 – Pierre
@RC垃圾桶已被禁用,零間隔 –