我在 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 节点中。
您可以将
--files
传递给 spark-submit
,它会自动为您将文件上传到 HDFS(好吧,在 YARN 执行器目录中),但随后您就无需复制该文件。
您的问题的一般解决方案是不使用 Spark 运行所示的代码。只需使用
python
,或者使用包装 hadoop fs -copyFromLocal
和 spark-submit
的 shell 脚本