我有一个脚本可以使用Hadoop CLI将文件上传到HDFS
以下是摘录:
def hdfs_put(file_path, topic):
print(file_path)
print(topic)
call(["/usr/local/hadoop-2.5.1/bin/hadoop fs -put", file_path, "/" + topic]
, shell=True
, stderr=STDOUT)
这是我得到的(请注意参数不为空):
avro/hdfs_1_2014-11-05.avro
hdfs
-put: Not enough arguments: expected 1 but got 0
Usage: hadoop fs [generic options] -put [-f] [-p] <localsrc> ... <dst>
答案 0 :(得分:2)
当shell=True
时,args
应包含要在shell中运行的单个字符串。您只需删除shell=True
并稍微修改一下命令:
check_call(["/usr/local/hadoop-2.5.1/bin/hadoop", "fs", "-put", file_path, "/" + topic]
, stderr=STDOUT)
我将其更改为使用check_call
,因为这是检查错误的简便方法。
答案 1 :(得分:1)
您正在滥用shell = True选项。
如果为True,则命令按原样传递给shell。您无需将其分解为列表。
def hdfs_put(file_path, topic):
print(file_path)
print(topic)
call("/usr/local/hadoop-2.5.1/bin/hadoop fs -put " + file_path + " /" + topic
, shell=True
, stderr=STDOUT)
或者如果你想让参数作为列表,那么你将不得不放弃Shell = True:
def hdfs_put(file_path, topic):
print(file_path)
print(topic)
call(["/usr/local/hadoop-2.5.1/bin/hadoop", "fs", "-put", file_path, "/" + topic]
, stderr=STDOUT)