Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark PySpark提交命令带--files参数错误_Apache Spark_Pyspark_Apache Spark Sql_Spark Submit - Fatal编程技术网

Apache spark PySpark提交命令带--files参数错误

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 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')
打开(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).