Python批量删除HDFS超10天旧文件遇Arguments too long报错如何解决
HDFS批量删除过期文件解决方案
问题说明
HDFS目录下存储了1.5万个以不同日期命名的文件,需要删除距今10天以上的旧文件,经统计待删文件共约1万个。最初开发时遇到两个问题:
- 将所有待删文件路径拼成列表后一次性传给
hdfs dfs -rm命令执行,系统抛出OSError: [Errno 7] Argument list too long: '/bin/sh'错误 - 尝试使用find搭配xargs的写法,未做参数配置时仅支持逐文件删除,性能较低无法满足批量删除需求
初始尝试代码
delete_cmd = 'hadoop fs -find /test/folder/* -name ' +filepath+ ' | xargs hadoop fs -rm -r -skipTrash'
调整后可运行的Python实现代码
from datetime import datetime import subprocess folder = '/test/folder/*' no_of_days = 10 now_dt = datetime.now() def list_files(): hdfs_cmd = "hdfs dfs -ls -r " + folder + " | grep / " hdfs_output = subprocess.getoutput(hdfs_cmd) return hdfs_output def delete_cmd(filepath): delete_cmd = 'hdfs dfs -rm -r -skipTrash ' + filepath delete_output = subprocess.getoutput(delete_cmd) print(delete_output) def delete_olderfiles(): hdfs_outputfun = list_files() delete_list = [] filepath_list = [line.split(' ')[-1] for line in hdfs_outputfun.splitlines()] for filepath in filepath_list: filename = filepath.split('/')[-1] filename_dt = datetime.strptime(filename, '%Y%m%d.csv') diff_days = (now_dt - filename_dt).days if diff_days > no_of_days: delete_list.append(filepath) delete_folders = " ".join(delete_list) delete_cmd(delete_folders) delete_olderfiles()
超大量文件场景优化
如果待删文件数量过多,依然可能触发单命令参数长度上限,可将待删文件列表按固定批次拆分后分批删除,修改delete_olderfiles中的批量删除逻辑即可:
# 每批删除100个文件,可根据实际情况调整批次大小 batch_size = 100 for i in range(0, len(delete_list), batch_size): batch_files = delete_list[i:i+batch_size] delete_folders = " ".join(batch_files) delete_cmd(delete_folders)
更简洁的原生Shell实现方案
无需Python代码,直接通过HDFS自带命令搭配xargs参数即可实现相同功能:
hdfs dfs -find /test/folder -name "*.csv" -mtime +10 | xargs -n 100 hdfs dfs -rm -r -skipTrash
参数说明:
-mtime +10:直接匹配修改时间距今超过10天的文件-n 100:指定xargs每批传递100个文件路径给删除命令,既不会触发参数过长错误,也能保证批量删除的性能
内容的提问来源于stack exchange,提问作者Vijju
相关产品推荐
相关产品推荐

