apache spark - pyspark 作业参数中的 --archives、--files、py-files 有什么区别



--archives, --files, --py-files, sc.addFilesc.addPyFile比较混乱,有人能解释清楚吗?

这些选项真是到处都是。

通常,通过--files--archives添加数据文件,通过--py-files添加代码文件。后者将被添加到类路径(c.f.,在这里),这样您就可以导入和使用。

可以想象,CLI参数实际上是由addFileaddPyFiles函数处理的(参见这里)

    从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

最新更新