nir*_*kov 2 amazon-emr emr-serverless
我有一个包含多个模块、类和依赖项文件(requirements.txt
文件)的 Python 项目。我想将其打包到包含所有依赖项的一个文件中,并将文件路径提供给将运行它的 AWS EMR serverless。
问题是我不明白如何打包一个包含所有依赖项的 Python 项目、EMR 可以使用哪个文件等。我找到的所有示例都使用一个 Python 文件。
简单来说,如果我的Python项目不是单个文件而是比较复杂怎么办?
小智 7
使用 EMR Serverless 有几种方法可以实现此目的。无论您选择哪种方式,您都需要向 EMR Serverless StartJobRun 命令提供主入口点 Python 脚本。
\n假设您有一个像这样的作业结构,其中main.py
创建 Spark 会话并运行您的作业的入口点job1
是job2
您的本地模块。
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 jobs\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 job1.py\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 job2.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 requirements.txt\n
Run Code Online (Sandbox Code Playgroud)\n--py-files
选项 1.与压缩的本地模块和--archives
外部依赖项的打包虚拟环境一起使用zip -r job_files.zip jobs\n
Run Code Online (Sandbox Code Playgroud)\nvenv-pack
。\n\n注意:这必须使用与 EMR Serverless 类似的操作系统和 Python 版本来完成,因此我更喜欢使用具有自定义输出的多阶段 Dockerfile。
\n
FROM --platform=linux/amd64 amazonlinux:2 AS base\n\nRUN yum install -y python3\n\nENV VIRTUAL_ENV=/opt/venv\nRUN python3 -m venv $VIRTUAL_ENV\nENV PATH="$VIRTUAL_ENV/bin:$PATH"\n\nCOPY requirements.txt .\n\nRUN python3 -m pip install --upgrade pip && \\\n python3 -m pip install venv-pack==0.2.0 && \\\n python3 -m pip install -r requirements.txt\n\nRUN mkdir /output && venv-pack -o /output/pyspark_deps.tar.gz\n\nFROM scratch AS export\nCOPY --from=base /output/pyspark_deps.tar.gz /\n
Run Code Online (Sandbox Code Playgroud)\n如果运行,您的本地系统上DOCKER_BUILDKIT=1 docker build --output . .
现在应该有一个文件。pyspark_deps.tar.gz
将main.py
、job_files.zip
、 和上传pyspark_deps.tar.gz
到 S3 上的某个位置。
使用如下命令运行 EMR Serverless 作业(替换APPLICATION_ID
、JOB_ROLE_ARN
和YOUR_BUCKET
):
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 jobs\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 job1.py\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 job2.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 requirements.txt\n
Run Code Online (Sandbox Code Playgroud)\n--archives
与打包的虚拟环境一起使用这可能是最可靠的方法,但它需要您使用setuptools。您可以将一个简单的pyproject.toml
文件与现有的文件一起使用requirements.txt
zip -r job_files.zip jobs\n
Run Code Online (Sandbox Code Playgroud)\n然后,您可以使用多阶段 Dockerfile 和自定义构建输出将模块和依赖项打包到虚拟环境中。
\n\n\n注意:这需要您启用Docker Buildkit
\n
FROM --platform=linux/amd64 amazonlinux:2 AS base\n\nRUN yum install -y python3\n\nENV VIRTUAL_ENV=/opt/venv\nRUN python3 -m venv $VIRTUAL_ENV\nENV PATH="$VIRTUAL_ENV/bin:$PATH"\n\nWORKDIR /app\nCOPY . .\nRUN python3 -m pip install --upgrade pip && \\\n python3 -m pip install venv-pack==0.2.0 && \\\n python3 -m pip install .\n\nRUN mkdir /output && venv-pack -o /output/pyspark_deps.tar.gz\n\nFROM scratch AS export\nCOPY --from=base /output/pyspark_deps.tar.gz /\n
Run Code Online (Sandbox Code Playgroud)\n现在您可以运行,并将生成DOCKER_BUILDKIT=1 docker build --output . .
一个包含所有依赖项的文件。pyspark_deps.tar.gz
将此文件和您的main.py
脚本上传到 S3。
假设您将两个文件上传到s3://<YOUR_BUCKET>/code/pyspark/myjob/
,像这样运行 EMR Serverless 作业(替换APPLICATION_ID
、JOB_ROLE_ARN
和YOUR_BUCKET
:
FROM --platform=linux/amd64 amazonlinux:2 AS base\n\nRUN yum install -y python3\n\nENV VIRTUAL_ENV=/opt/venv\nRUN python3 -m venv $VIRTUAL_ENV\nENV PATH="$VIRTUAL_ENV/bin:$PATH"\n\nCOPY requirements.txt .\n\nRUN python3 -m pip install --upgrade pip && \\\n python3 -m pip install venv-pack==0.2.0 && \\\n python3 -m pip install -r requirements.txt\n\nRUN mkdir /output && venv-pack -o /output/pyspark_deps.tar.gz\n\nFROM scratch AS export\nCOPY --from=base /output/pyspark_deps.tar.gz /\n
Run Code Online (Sandbox Code Playgroud)\n请注意sparkSubmitParameters
指定依赖项并配置驱动程序和执行程序环境变量以获得python
.
归档时间: |
|
查看次数: |
4239 次 |
最近记录: |