我在Spark脚本中使用以下代码。这里,我想将数据文件从本地复制到HDFS位置。当从shell手动运行HDFS命令时,它工作正常。但是通过py-spark脚本,它失败了。
process = subprocess.Popen(["hdfs", "dfs", "-copyFromLocal", "-f", local_file,table_hdfs_location], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
return_code = process.wait()
if return_code == 0:
print("File copy successful")
else:
print(f"File copy failed. Return code: {return_code}")
error_output = process.stderr.read().decode('utf-8')
if error_output:
print("Error message:")
print(error_output)
字符串
错误信息:copyFromLocal:`/data/Infiles/Sales. csv ':没有这样的文件或目录
这是本地目录(在Linux上)。路径存在,文件也存在。
是因为spark无法找到所有节点的位置吗?如果我从spark脚本运行这个hdfs命令,这个本地文件夹如何需要存在于所有hadoop节点中?
1条答案
按热度按时间sigwle7e1#
您可以将
--files
传递给spark-submit
,它会自动将文件上传到HDFS(在YARN executor目录中),但这样您就不必要地复制文件,每个executor都会尝试将相同的文件复制到相同的HDFS位置。对于你的问题,一般的解决方案是不使用Spark来运行所示的代码。只需使用
python
,或者 Packagehadoop fs -copyFromLocal
和spark-submit
的shell脚本