如何在python中一次将多个文件从本地服务器移动到hdfs?

ejk8hzay  于 2021-05-29  发布在  Hadoop
关注(0)|答案(3)|浏览(439)

我在服务器上使用pythonv3.4,经常需要将多个文件从本地目录复制/移动到hdfs目录。我的所有文件都在子目录中,而子目录又在mydir中。这是我使用的命令- $ hdfs dfs -copyFromLocal MyDir/* /path/to/hdfs/ 这个命令在服务器上运行得很好,但是当我在python中使用subprocess使用相同的命令时 >>> subprocess.call(['hdfs', 'dfs', '-copyFromLocal', 'MyDir/*', '/path/to/hdfs/']) 它给出了以下错误-

copyFromLocal: `MyDir/*': No such file or directory
1

p、 我也试过了 ['hadoop', 'fs', '-put'....] 而不是 ['hdfs', 'dfs', '-copyFromLocal'....] ,它也不起作用。
有人能帮我吗?任何帮助都将不胜感激。
编辑-我需要移动文件和子目录。

fae0ux8s

fae0ux8s1#

我将编写一个带有子进程的函数,它将为您提供输出和错误:

import subprocess
def run_cmd(args_list):
    """
    run linux commands
    """
    # import subprocess
    print('Running system command: {0}'.format(' '.join(args_list)))
    proc = subprocess.Popen(args_list, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    s_output, s_err = proc.communicate()
    s_return =  proc.returncode
    return s_return, s_output, s_err

然后:

import os
 for file in os.listdir('your-directory'):
     run_cmd(['hadoop', 'fs', '-put', 'your-directory/{0}'.format(file), 'target-directory'])

它应该遍历目录中的所有文件,并将它们放在所需的hdfs目录中

vd8tlhqk

vd8tlhqk2#

将命令中的所有内容附加到单个字符串中,并给出参数shell=true

subprocess.call('hdfs dfs -copyFromLocal MyDir/* /path/to/hdfs/', shell = True)
jei2mxaa

jei2mxaa3#

添加 shell=True :

>>> subprocess.call(['hdfs', 'dfs', '-copyFromLocal', 'MyDir/*', '/path/to/hdfs/'], shell=True)

阅读本文:subprocess中“shell=true”的实际含义

相关问题