参数太长导致删除10k文件异常- python -HDFS



我在HDFS文件夹中有15k个不同日期的文件。我试图删除超过10天的文件,其中我有10k文件要从HDFS删除。当我试图通过传递到列表来一次删除这些10k文件时,我得到了错误。你能帮我整理一下这个问题吗?我尝试使用find和xargs,但它接受单个文件,而不是多个文件。

delete_cmd = 'hadoop fs -find /test/folder/* -name ' +filepath+ ' | xargs hadoop fs -rm -r -skipTrash'

OSError: [Errno 7]参数列表太长:'/bin/sh'

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)
string = " " 
delete_folders = string.join(delete_list)
delete_cmd(delete_folders)
delete_olderfiles()

输出删除文件:hdfs dfs -rm -r -skipTrash file20210901.csv file20210801.csv file20210903.csv…10kfiles

我认为问题是命令行只能接受这么多数据作为参数,如下所示:https://unix.stackexchange.com/questions/45583/argument-list-too-long-how-do-i-deal-with-it-without-changing-my-command

在Linux上,命令参数的最大空间是可用堆栈空间的1/4。因此,一个解决方案是增加堆栈可用的空间量。

短版本:运行类似

ulimit -s 65536

另一个解决方案是每个文件调用rm命令一次:

for item in delete_list:
delete_cmd(item)

并将此代码放在delete_olderfiles()的末尾(并且不要在所有要删除的文件的连接列表中调用delete_cmd())。

相关内容

  • 没有找到相关文章

最新更新