如何在AWS EMR无服务器上运行Python项目(包)?

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 会话并运行您的作业的入口点job1job2您的本地模块。

\n
\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外部依赖项的打包虚拟环境一起使用

\n
    \n
  • 压缩您的工作文件
  • \n
\n
zip -r job_files.zip jobs\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 使用您的依赖项创建虚拟环境venv-pack
  • \n
\n
\n

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

\n
\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

\n
    \n
  • main.pyjob_files.zip、 和上传pyspark_deps.tar.gz到 S3 上的某个位置。

    \n
  • \n
  • 使用如下命令运行 EMR Serverless 作业(替换APPLICATION_IDJOB_ROLE_ARNYOUR_BUCKET):

    \n
  • \n
\n
\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

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

\n

这可能是最可靠的方法,但它需要您使用setuptools。您可以将一个简单的pyproject.toml文件与现有的文件一起使用requirements.txt

\n
zip -r job_files.zip jobs\n
Run Code Online (Sandbox Code Playgroud)\n

然后,您可以使用多阶段 Dockerfile 和自定义构建输出将模块和依赖项打包到虚拟环境中。

\n
\n

注意:这需要您启用Docker Buildkit

\n
\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。

\n

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

\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

请注意sparkSubmitParameters指定依赖项并配置驱动程序和执行程序环境变量以获得python.

\n