PySpark spark-submit命令带有--files参数错误

时间:2018-09-16 09:49:08

标签: apache-spark pyspark apache-spark-sql spark-submit

我正在使用以下命令在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()命令,但也没有用。

2 个答案:

答案 0 :(得分:4)

您使用cluster部署模式。在这种情况下,--files路径不是指您用来提交的计算机上的本地路径,而是指用于生成驱动程序的工作程序上的本地路径,该驱动程序是集群中的任意节点。

如果要使用群集模式分发文件,则应将这些文件存储在每个节点都可以访问的存储器中。例如,您可以使用:

  • HTTP / HTPPS URL。
  • HDFS URL。

答案 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是将文件下载到驱动程序的位置。