--archives
, --files
, --py-files
, sc.addFile
和sc.addPyFile
比较混乱,有人能解释清楚吗?
这些选项真是到处都是。
通常,通过--files
或--archives
添加数据文件,通过--py-files
添加代码文件。后者将被添加到类路径(c.f.,在这里),这样您就可以导入和使用。
可以想象,CLI参数实际上是由addFile
和addPyFiles
函数处理的(参见这里)
- 从http://spark.apache.org/docs/latest/programming-guide.html
在幕后,
pyspark
调用更通用的spark-submit
脚本。你可以添加Python .zip, .egg或.py文件到运行时路径通过传递一个逗号分隔的列表到
--py-files
- 从http://spark.apache.org/docs/latest/running-on-yarn.html
--files
和--archives
选项支持使用#指定文件名,类似于Hadoop。例如,你可以指定:——files localtest.txt#appSees.txt,这将把你在本地命名为localtest.txt的文件上传到HDFS,但它将通过名称appSees.txt链接,并且你的应用程序应该使用该名称作为appSees.txt在YARN上运行时引用它。
- 从http://spark.apache.org/docs/latest/api/python/pyspark.html?highlight=addpyfile pyspark.SparkContext.addPyFile
addFile(path)
在每个节点上与此Spark作业一起添加要下载的文件。传递的路径可以是本地文件,HDFS(或其他hadoop支持的文件系统)中的文件,也可以是HTTP、HTTPS或FTP的URI。
addPyFile(path)
为将来在此SparkContext上执行的所有任务添加.py或.zip依赖项。传递的路径可以是本地文件,HDFS(或其他hadoop支持的文件系统)中的文件,也可以是HTTP、HTTPS或FTP的URI。
这也让我很困惑,今天在Spark 3.0的实验之后,我终于明白了这些选项是如何工作的。
我们可以把这些选项分为两类。
第一类是数据文件,数据文件是指spark只将指定的文件添加到容器中,不会再执行其他命令。在这个类别中有两个选项:
-
--archives
:使用此选项,您可以提交存档,spark将为您提取其中的文件,spark支持zip
,tar
…格式。 -
--files
:使用此选项,您可以提交文件,spark将把它放在容器中,不会做任何其他事情。sc.addFile
是这个的编程api。
第二类是代码依赖。在spark应用中,代码依赖项可以是JVM依赖项或者python依赖项。
-
--jars
:这个选项用于提交JVM依赖的Jar文件,spark会自动将这些Jar文件添加到CLASSPATH
中,以便JVM可以加载它们。 -
--py-files
:该选项用于提交Python依赖项,它可以是.py
、.egg
或.zip
。spark会将这些文件添加到PYTHONPATH
中,以便python解释器可以找到它们。sc.addPyFile
是这个的编程api。PS:对于单个
.py
文件,spark将其添加到__pyfiles__
文件夹中,其他文件将添加到CWD中。
所有这四个选项都可以指定多个文件,用,
分割,对于每个文件,您可以通过{URL}#{ALIAS}
格式指定别名。不要在--py-files
选项中指定别名,因为spark不会在PYTHONPATH
选项中添加别名。
BTW,每个文件支持多方案,如果没有指定,默认为file
:
-
file
:驱动程序将这些文件通过HTTP传输到Executor,如果是cluster
部署模式,Spark将首先将这些文件上传到集群驱动程序。 -
hdfs
:,http
:,https
:,ftp
: Driver and executor将从对应的fs下载指定的文件。 -
local
:该文件预计在每个工作节点上作为本地文件存在。
- https://spark.apache.org/docs/latest/submitting-applications.html