【问题标题】:How to run a Python project (package) on AWS EMR serverless如何在 AWS EMR 无服务器上运行 Python 项目(包)
【发布时间】:2022-11-05 06:07:53
【问题描述】:

我有一个包含多个模块、类和依赖项文件(requirements.txt 文件)的 python 项目。我想将它打包到一个包含所有依赖项的文件中,并将文件路径提供给 AWS EMR 无服务器,它将运行它。

问题是我不明白如何打包一个包含所有依赖项的 python 项目,EMR 可以使用哪个文件等。我找到的所有示例都使用了一个 python 文件。

简单来说,如果我的python项目不是单个文件而是比较复杂怎么办?

任何人都可以提供一些细节吗?

【问题讨论】:

    标签: amazon-emr


    【解决方案1】:

    使用 EMR Serverless 有几种方法可以做到这一点。无论您选择哪种方式,您都需要为 EMR Serverless StartJobRun 命令提供一个主入口点 Python 脚本。

    假设你有一个这样的工作结构,其中main.py 是你的入口点,它创建一个 Spark 会话并运行你的工作,job1job2 是你的本地模块。

    ├── jobs
    │   └── job1.py
    │   └── job2.py
    ├── main.py
    ├── requirements.txt
    

    选项 1. 将 --py-files 与您的压缩本地模块一起使用,并将 --archives 与您的外部依赖项的打包虚拟环境一起使用

    • 压缩您的工作文件
    zip -r job_files.zip jobs
    
    • 使用 venv-pack 和您的依赖项创建一个虚拟环境。

    注意:这必须使用与 EMR Serverless 类似的操作系统和 Python 版本来完成,因此我更喜欢使用带有自定义输出的多阶段 Dockerfile。

    FROM --platform=linux/amd64 amazonlinux:2 AS base
    
    RUN yum install -y python3
    
    ENV VIRTUAL_ENV=/opt/venv
    RUN python3 -m venv $VIRTUAL_ENV
    ENV PATH="$VIRTUAL_ENV/bin:$PATH"
    
    RUN python3 -m pip install --upgrade pip && 
        python3 -m pip install venv-pack==0.2.0 && 
        python3 -m pip install -r requirements.txt
    
    RUN mkdir /output && venv-pack -o /output/pyspark_deps.tar.gz
    
    FROM scratch AS export
    COPY --from=base /output/pyspark_deps.tar.gz /
    

    如果您运行DOCKER_BUILDKIT=1 docker build --output . .,您现在应该在本地系统上有一个pyspark_deps.tar.gz 文件。

    • main.pyjob_files.zippyspark_deps.tar.gz 上传到 S3 上的某个位置。

    • 使用如下命令运行您的 EMR 无服务器作业(替换 APPLICATION_IDJOB_ROLE_ARNYOUR_BUCKET):

    aws emr-serverless start-job-run 
        --application-id $APPLICATION_ID 
        --execution-role-arn $JOB_ROLE_ARN 
        --job-driver '{
            "sparkSubmit": {
                "entryPoint": "s3://<YOUR_BUCKET>/main.py",
                "sparkSubmitParameters": "--py-files s3://<YOUR_BUCKET>/job_files.zip --conf spark.archives=s3://<YOUR_BUCKET>/pyspark_deps.tar.gz#environment --conf spark.emr-serverless.driverEnv.PYSPARK_DRIVER_PYTHON=./environment/bin/python --conf spark.emr-serverless.driverEnv.PYSPARK_PYTHON=./environment/bin/python --conf spark.executorEnv.PYSPARK_PYTHON=./environment/bin/python"
            }
        }'
    

    选项 2. 将本地模块打包为 Python 库,并将 --archives 与打包的虚拟环境一起使用

    这可能是最可靠的方式,但需要您使用setuptools。您可以使用简单的pyproject.toml 文件以及现有的requirements.txt

    [project]
    name = "mysparkjobs"
    version = "0.0.1"
    dynamic = ["dependencies"]
    [tool.setuptools.dynamic]
    dependencies = {file = ["requirements.txt"]}
    

    然后,您可以使用多阶段 Dockerfile 和 custom build outputs 将您的模块和依赖项打包到虚拟环境中。

    注意:这需要您启用Docker Buildkit

    FROM --platform=linux/amd64 amazonlinux:2 AS base
    
    RUN yum install -y python3
    
    ENV VIRTUAL_ENV=/opt/venv
    RUN python3 -m venv $VIRTUAL_ENV
    ENV PATH="$VIRTUAL_ENV/bin:$PATH"
    
    WORKDIR /app
    COPY . .
    RUN python3 -m pip install --upgrade pip && 
        python3 -m pip install venv-pack==0.2.0 && 
        python3 -m pip install .
    
    RUN mkdir /output && venv-pack -o /output/pyspark_deps.tar.gz
    
    FROM scratch AS export
    COPY --from=base /output/pyspark_deps.tar.gz /
    

    现在你可以运行DOCKER_BUILDKIT=1 docker build --output . . 并且将生成一个pyspark_deps.tar.gz 文件,其中包含你所有的依赖项。将此文件和您的 main.py 脚本上传到 S3。

    假设您将两个文件都上传到 s3://&lt;YOUR_BUCKET&gt;/code/pyspark/myjob/,请像这样运行 EMR Serverless 作业(替换 APPLICATION_IDJOB_ROLE_ARNYOUR_BUCKET

    aws emr-serverless start-job-run 
        --application-id <APPLICATION_ID> 
        --execution-role-arn <JOB_ROLE_ARN> 
        --job-driver '{
            "sparkSubmit": {
                "entryPoint": "s3://<YOUR_BUCKET>/code/pyspark/myjob/main.py",
                "sparkSubmitParameters": "--conf spark.archives=s3://<YOUR_BUCKET>/code/pyspark/myjob/pyspark_deps.tar.gz#environment --conf spark.emr-serverless.driverEnv.PYSPARK_DRIVER_PYTHON=./environment/bin/python --conf spark.emr-serverless.driverEnv.PYSPARK_PYTHON=./environment/bin/python --conf spark.executorEnv.PYSPARK_PYTHON=./environment/bin/python"
            }
        }'
    

    请注意附加的sparkSubmitParameters,它指定了您的依赖关系,并为python 的正确路径配置驱动程序和执行程序环境变量。

    【讨论】:

      猜你喜欢
      • 2022-01-16
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      • 2018-03-18
      • 2022-09-26
      • 1970-01-01
      相关资源
      最近更新 更多