如何在 Amazon EMR 上升级我的 Python 版本并配置 PySpark 作业以使用升级后的 Python 版本?

4 分钟阅读
0

我想在 Amazon EMR 上升级我的 Python 版本,并配置 PySpark 作业以使用升级后的 Python 版本。

简短描述

集群实例和系统应用程序使用不同的 Python 版本,具体取决于以下 Amazon EMR 发行版本

  • Amazon EMR 发行版本 4.6.0-5.19.0: 集群实例上安装了 Python 3.4。系统默认使用 Python 2.7。
  • Amazon EMR 发行版本 5.20.0 及更高版本: 集群实例上安装了 Python 3.6。对于 Amazon EMR 版本 5.20.0-5.29.0,系统默认使用 Python 2.7。对于 5.30.0 及更高版本,系统默认使用 Python 3。
  • Amazon EMR 发行版本 6.0.0 及更高版本: 集群实例上安装了 Python 3.7。系统默认使用 Python 3。
  • Amazon EMR 发行版本 7.0.0 及更高版本: 集群实例上安装了 Python 3.9。系统默认使用 Python 3。

解决方法

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

要升级 Python 版本,请将 spark-env 分类的 PYSPARK_PYTHON 环境变量指向新 Python 版本的安装目录:

which example-python-version

**注意:**请将 example-python-version 替换为新的 Python 版本。

升级在 Amazon EC2 上运行的 Amazon EMR 的 Python 版本

**注意:**在 Amazon EMR 集群实例上安装新的 Python 和 OpenSSL 版本之前,请务必测试以下脚本。

要将在 Amazon Elastic Compute Cloud (Amazon EC2) 上运行的 Amazon EMR 版本6.15 的 Python 版本升级到 3.9,请使用以下脚本。您还可以使用该脚本在 Amazon EMR 版本 7.0 上升级到 Python 3.10 或更高版本:

sudo yum -y install openssl-devel bzip2-devel libffi-devel xz-devel gcc sqlite-devel
wget https://www.python.org/ftp/python/3.x.x/example-python3-version.tgz
tar xvf example-python3-version.tgz
cd example-python3-version/
./configure --enable-optimizations
sudo make altinstall

**注意:**请将 example-python3-version 替换为您的 Python 3 版本。

在 Amazon EMR 6.15 或更早版本上升级到 Python 3.10 或更高版本需要使用 OpenSSL。使用以下脚本:

sudo yum -y install openssl-devel bzip2-devel libffi-devel xz-devel gcc sqlite-devel
cd /home/hadoop/
wget https://github.com/openssl/openssl/archive/refs/tags/example-openssl11-version.tar.gz
tar -xzf example-openssl11-version.tar.gz
cd example-openssl11-version/
./config --prefix=/usr --openssldir=/etc/ssl --libdir=lib no-shared zlib-dynamic
make
sudo make install
cd /home/hadoop/
wget https://www.python.org/ftp/python/3.x.x/example-python3-version.tgz
tar xvf example-python3-version.tgz
cd example-python3-version/
./configure --enable-optimizations --with-openssl=/usr
sudo make altinstall

**注意:**请将 example-python3-version 替换为您的 Python 3 版本,将 example-openssl11-version 替换为您的 OpenSSL 11版本。有关详细信息,请参阅 GitHub 网站上的 openssl

要将升级后的版本用作 Python 3 的默认安装版本,请使用 /usr/local/bin/python3.x 作为 Python 的新位置。上述 Python 脚本将安装在 /usr/local/bin/python3.x,默认的 Python 安装位置为 /usr/bin/python3

在正在运行的集群上升级 Python 版本

**注意:**对于 Amazon EMR 5.36.0 及更早版本,您可以将 Python 版本升级到 3.8。

Amazon EMR 5.21.0 或更早版本

使用类似于以下内容的配置对象提交重新配置请求

[  {
     "Classification": "spark-env",
     "Configurations": [
       {
         "Classification": "export",
         "Properties": {
            "PYSPARK_PYTHON": "/usr/bin/python3"
          }
       }
    ]
  }
]

Amazon EMR 版本 4.6.0-5.20.x

完成以下步骤:

  1. 使用 SSH 连接到主节点。
  2. 要更改默认 Python 环境,请运行以下命令:
    sudo sed -i -e '$a\export PYSPARK_PYTHON=/usr/bin/python3' /etc/spark/conf/spark-env.sh
    要确认 PySpark 是否使用了正确的 Python 版本,请运行以下命令:
    [hadoop@example-ip-address conf]$ pyspark
    **注意:**请将 example-ip-address 替换为您的 IP 地址。
    输出示例:
    Python 3.4.8 (default, Apr 25 2018, 23:50:36)
    Welcome to
          ____              __
         / __/__  ___ _____/ /__
        _\ \/ _ \/ _ `/ __/  '_/
       /__ / .__/\_,_/_/ /_/\_\   version 2.3.1
          /_/
    Using Python version 3.4.8 (default, Apr 25 2018 23:50:36)
    SparkSession available as 'spark'.

**注意:**新配置将在下一个 PySpark 作业中生效。

在新集群上升级 Python 版本

要在 Amazon EMR 上启动集群时升级 Python 版本,请向您使用的脚本中添加一个引导操作

要将在 Amazon EC2 上运行的 Amazon EMR 版本 6.15 上的 Python 版本升级到 3.9,请使用以下脚本。您还可以使用该脚本在 Amazon EMR 版本 7.0 上升级到 Python 3.10 或更高版本:

sudo yum -y install openssl-devel bzip2-devel libffi-devel xz-devel gcc sqlite-devel
wget https://www.python.org/ftp/python/3.x.x/example-python3-version.tgz
tar xvf example-python3-version.tgz
cd example-python3-version/
./configure --enable-optimizations
sudo make altinstall

**注意:**请将 example-python3-version 替换为您的 Python 3 版本。

在 Amazon EMR 6.15 及更早版本上升级到 Python 3.10 或更高版本需要使用 OpenSSL。使用以下脚本:

sudo yum -y install openssl-devel bzip2-devel libffi-devel xz-devel gcc sqlite-devel
cd /home/hadoop/
wget https://github.com/openssl/openssl/archive/refs/tags/example-openssl11-version.tar.gz
tar -xzf example-openssl11-version.tar.gz
cd example-openssl11-version/
./config —prefix=/usr --openssldir=/etc/ssl --libdir=lib no-shared zlib-dynamic
make
sudo make install
cd /home/hadoop/
wget https://www.python.org/ftp/python/3.x.x/example-python3-version.tgz
tar xvf example-python3-version.tgz
cd example-python3-version/
./configure --enable-optimizations --with-openssl=/usr
sudo make altinstall

**注意:**请将 example-python3-version 替换为您的 Python 3 版本,将 example-openssl11-version 替换为您的 OpenSSL 11版本。有关详细信息,请参阅 GitHub 网站上的 openssl

然后,添加一个类似于以下内容的配置对象

[
  {
     "Classification": "spark-env",
     "Configurations": [
       {
         "Classification": "export",
         "Properties": {
            "PYSPARK_PYTHON": "<example-python-version-path>"
          }
       }
    ]
  }
]

在 Amazon EKS 上的 Amazon EMR 上升级 Python 版本

**注意:**基于 Amazon Linux 2023 的映像名称中包含 al2023。此外,Amazon EMR 6.13.0 及更高版本在基于Amazon Linux 2023 的映像中默认使用 Python 3.9.16。对于基于 Amazon Linux 2 的映像,默认版本为 Python 3.7。

要升级 Amazon Elastic Kubernetes Service (Amazon EKS) 上的 Amazon EMR 的 Python 版本,需要使用 Docker 映像。为您的 AWS 区域选择基本 URI:

FROM example-base-URI-account-id.dkr.ecr.example-region.amazonaws.com/spark/emr-6.15.0
USER root
RUN yum install -y gcc openssl-devel bzip2-devel libffi-devel tar gzip wget make
RUN wget https://www.python.org/ftp/python/3.x.x/example-python3-version.tgz && \
tar xzf example-python3-version.tgz && cd example-python3-version && \
./configure --enable-optimizations && \
make altinstall
USER hadoop:hadoop

**注意:**请将 example-base-URI-account-id 替换为 Apache Spark 映像的基本账户 ID,将 example-region 替换为您的区域,将 example-python3-version 替换为 Python 版本。

要在提交 Spark 工作负载时传递映像,请使用应用程序配置覆盖、Spark 驱动程序和主 容器组 (pod) 映像:

{
                "classification": "spark-defaults",
                "properties": {
                    "spark.kubernetes.container.image": "example-account-id.dkr.ecr.example-region.amazonaws.com/example-repository"
                }
 }

**注意:**请将 example-account-id 替换为存储所创建映像的账户 ID,将 example-repository 替换为存储自定义映像的存储库名称,将 example-region 替换为您的区域。

在 Amazon EMR Serverless 上升级 Python 版本

要在 Amazon EMR Serverless 应用程序上升级 Python 版本,请使用 Docker 映像安装新的 Python 版本:

FROM public.ecr.aws/emr-serverless/spark/emr-6.9.0:latest
USER root
# install python 3
RUN yum install -y gcc openssl-devel bzip2-devel libffi-devel tar gzip wget make
RUN wget https://www.python.org/ftp/python/3.x.x/example-python3-version.tgz && \
tar xzf example-python3-version.tgz && cd example-python3-version && \
./configure --enable-optimizations && \
make altinstall
# EMRS will run the image as hadoop
USER hadoop:hadoop

**注意:**请将 example-python-version 替换为您的 Python 3 版本。

当您向 Amazon EMR Serverless 应用程序提交 Spark 作业时,请传递以下路径以使用新的 Python 版本:

--conf spark.emr-serverless.driverEnv.PYSPARK_DRIVER_PYTHON=/usr/local/bin/python3.9
--conf spark.emr-serverless.driverEnv.PYSPARK_PYTHON=/usr/local/bin/python3.9
--conf spark.executorEnv.PYSPARK_PYTHON=/usr/local/bin/python3.9

相关信息

配置 Spark

Apache Spark

如何选择基础映像 URI 的详细信息

在 EMR Serverless 中使用自定义映像

AWS 官方
AWS 官方已更新 4 个月前