AWS EMR从S3导入pyfile

时间:2018-12-08 19:04:42

标签: pyspark amazon-emr

我正在努力了解如何使用pyspark将文件导入为库。

假设我有以下内容

HappyBirthday.py

def run():
    print('Happy Birthday!')

sparky.py

from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession
import HappyBirthday
sc = SparkContext(appName="kmeans")

HappyBirthday.run()
sc.stop()

它们都存储在S3的同一文件夹中。

在使用时如何确定

spark-submit --deploy-mode cluster s3://<PATH TO FILE>/sparky.py

,还导入了HappyBirthday.py吗?

2 个答案:

答案 0 :(得分:1)

您要在此处使用--py-files的{​​{1}}参数。在Spark文档的submitting applications页面上:

  

对于Python,您可以使用spark-submit的--py-files参数添加.py,.zip或.egg文件,以与您的应用程序一起分发。如果您依赖多个Python文件,我们建议将它们打包为.zip或.egg。

以您的示例为例,

spark-submit

答案 1 :(得分:0)

如果您尝试运行sparky.py并在HappyBirthday.py中使用一个函数,则可以尝试类似的操作。

spark-submit \
--deploy-mode cluster --master yarn \
--py-files s3://<PATH TO FILE>/HappyBirthday.py \
s3://<PATH TO FILE>/sparky.py

请记住,s3没有“文件夹”的概念,因此您只需要提供文件或文件组的确切路径即可。

如果您的项目中有一堆依赖项,则可以将它们全部捆绑到一个带有必需的 init .py文件的.zip文件中,并可以导入任何功能在库中。

例如-我将sqlparse库作为依赖项,其中包含一堆python文件。我有一个打包的zip文件,如下所示。

unzip -l packages.zip
Archive:  packages.zip
        0  05-05-2019 12:44   sqlparse/
     2249  05-05-2019 12:44   sqlparse/__init__.py
     5916  05-05-2019 12:44   sqlparse/cli.py
...
      110  05-05-2019 12:44   sqlparse-0.3.0.dist-info/WHEEL
---------                     -------
   125034                     38 files

此文件已上传到S3,然后在作业中使用。

spark-submit --deploy-mode cluster --master yarn --py-files s3://my0-test-bucket/artifacts/packages.zip s3://my-test-script/script/script.py

我的文件可以包含如下所示的导入内容。

import pyspark
import sqlparse # Importing the library
from pprint import pprint