Apache spark PySpark提交命令带--files参数错误
我正在Spark 2.3集群中使用以下命令运行PySpark作业Apache spark PySpark提交命令带--files参数错误,apache-spark,pyspark,apache-spark-sql,spark-submit,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(),'ET
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')
打开(configFilePath,'r')作为配置文件:
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()
命令,但它也不起作用。您使用的是集群部署模式。在这种情况下,--files
path指的不是您用来提交的机器上的本地路径,而是用于生成驱动程序的工作进程上的本地路径,驱动程序是集群中的任意节点
如果要以群集模式分发文件,则应将这些文件存储在每个节点都可以访问的存储器中。例如,您可以使用:
- HTTP/HTPPS URL
- HDFSURL
您应该能够从正在运行的驱动程序中的PWD加载它。纱线将在与--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提交
spark-submit --deploy-mode cluster --master yarn --files data.json driver.py
更新(比较路径):
我更新了代码以打印PWD(有效)和SparkFiles.getRootDirectory(无效)。由于某些原因,路径不同。我不知道为什么。。但是直接从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).
这就是我们所说的:
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).
作为参考,是文件下载到驱动程序的地方。您需要使用sparkContext.addPyFile(文件名)
。如果文件在s3上,可能也会有帮助。谢谢Tim…将尝试addPyFile
只是addFile
,这也会将它添加到PYTHONPATH。此外,在OP的例子中,他试图从驱动程序读取文件,因此从驱动程序添加文件不会给他带来任何好处。在那一点上,驱动程序已经可以访问了<代码>--files
指定提交作业的机器上的文件路径,而不是驱动程序最终运行的纱线节点。嗨,Ryan。。。在群集模式下使用spark submit执行脚本时,文件“data.json”保存在哪里?它应该是运行spark submit的系统上本地文件的路径。它可以是您的群集的一部分,也可以只是有权提交到您的群集。谢谢Ryan。。它起作用了。。使用的命令:我将.py和.json放在本地节点中,并从保存这些文件的路径执行spark submit。。。。执行时,它会在执行时将文件复制到HDFS中的名称节点。。
--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).