在我们的Datalake(Hadoop / Mapr / Redhat)中,我们有一个包含超过40M文件的目录。我们无法运行ls命令。
我已经尝试启动hadoop命令getmerge来合并文件,但我没有输出。
Hadoop fs -rm也不行。
有没有其他方法可以查看此文件夹的内容?如何在没有扫描的情况下从中清除旧文件?
谢谢
答案 0 :(得分:1)
一些事情。如果您可以访问namenode或secondary,则可以使用hdfs oiv
将HDFS转储到脱机分隔文件,然后找到您在那里寻找的路径。
Hadoop有一个名为.har
的现有文件格式,代表Hadoop存档。如果您想保留文件,则应使用该文件代替getmerge
。
您可以使用distcp
删除目录。
您可以在/ tmp中创建一个空的HDFS目录,然后使用distcp
将空目录复制到包含40M文件的目录中,并使用更多映射器执行删除操作。
$ hdfs dfs -mkdir /tmp/empty_dir
$ hadoop distcp -m 20 -delete /tmp/empty_dir /PATH-OF-MILLION-FILES-DIR
fs -rm -r
是单线程的,而distcp
是基于映射器并行运行的。您应该将-delete
选项与distcp
一起使用。
参考文献:
答案 1 :(得分:0)
fs -rm
将移至HDFS垃圾箱,因此您实际上并未删除任何记录,只是移动它们。
您需要添加-skipTrash
才能进行清除。如果建议你分批清洗
例如,删除所有以字母a
hdfs dfs -rm -R -skipTrash /path/data/a*
' getmerge`将所有记录下载到本地计算机,因此您最好确保有足够的磁盘空间
在HDFS中合并的唯一方法是MapReduce或Spark任务。
这取决于您的文件格式,但FileCrush是您可以查看的库。但是,请记住,如果要合并任何内容,则需要至少120%的HDFS额外容量才能复制临时文件的数据和开销