我正在使用以下命令在Spark 2.3集群中运行PySpark作业。
spark-submit
--deploy-mode cluster
--master yarn
--files ETLConfig.json
PySpark_ETL_Job_v0.2.py
ETLConfig.json具有传递给PySpark脚本的参数。我在主块中引用了以下配置json文件:
configFilePath = os.path.join(SparkFiles.getRootDirectory(), 'ETLConfig.json')
with open(configFilePath, 'r') as configFile:
configDict = json.load(configFile)
但是,该命令将引发以下错误。
No such file or directory: u'/tmp/spark-7dbe9acd-8b02-403a-987d-3accfc881a98/userFiles-4df4-5460-bd9c-4946-b289-6433-drgs/ETLConfig.json'
我可以知道我的脚本出了什么问题吗?我也尝试使用SparkFiles.get()
命令,但也没有用。
答案 0 :(得分:4)
您使用cluster
部署模式。在这种情况下,--files
路径不是指您用来提交的计算机上的本地路径,而是指用于生成驱动程序的工作程序上的本地路径,该驱动程序是集群中的任意节点。
如果要使用群集模式分发文件,则应将这些文件存储在每个节点都可以访问的存储器中。例如,您可以使用:
答案 1 :(得分:1)
您应该能够从正在运行的驱动程序中的PWD加载它。 Yarn将在--files
转储文件所在的文件夹中启动主容器过程。对于客户端模式可能会有所不同,但是对于群集模式,它应该可以正常工作。例如,这对我有用:
driver.py
from pyspark import SparkContext, SparkFiles
import os
with SparkContext() as sc:
print "PWD: " + os.getcwd()
print "SparkFiles: " + SparkFiles.getRootDirectory()
data = open('data.json')
print "Success!"
火花提交
spark-submit --deploy-mode cluster --master yarn --files data.json driver.py
已更新(比较路径):
我更新了代码,以同时打印PWD(有效)和SparkFiles.getRootDirectory
(无效)。由于某些原因,路径不同。我不确定为什么会这样..但是直接从PWD加载文件是我从驱动程序访问文件的一贯做法。
这是打印的路径:
PWD: /var/lib/hadoop-yarn/cache/yarn/nm-local-dir/usercache/rwidmaier/appcache/application_1539970334177_0004/container_1539970334177_0004_01_000001
SparkFiles: /var/lib/hadoop-yarn/cache/yarn/nm-local-dir/usercache/rwidmaier/appcache/application_1539970334177_0004/spark-e869ac40-66b4-427e-a928-deef73b34e40/userFiles-a1d8e17f-b8a5-4999-8
更新#2
显然,它的工作方式是--files
,这是弟兄们只能保证在执行程序的SparkFiles.get(..)
文件夹中提供文件,而不是在驱动程序中。但是,为了将它们发送给执行者,Spark首先将它们下载到驱动程序上的PWD,这使您可以从那里访问它。
实际上,它仅在帮助文本中提到执行程序,而不是驱动程序。
--files FILES Comma-separated list of files to be placed in the working
directory of each executor. File paths of these files
in executors can be accessed via SparkFiles.get(fileName).
作为参考,here是将文件下载到驱动程序的位置。