如何在 Amazon EMR 和 Amazon EMR Serverless 集群中安装 Python 库并对其进行故障排除?

2 分钟阅读
0

我想在 Amazon EMR 和 Amazon EMR Serverless 集群中安装 Python 库并对其进行故障排除。

解决方法

在 Amazon EMR 集群中安装 Python 库

要在 Amazon EMR 集群中安装 python 库,请使用引导操作

Amazon EMR 使用 puppet(一种 Apache BigTop 部署机制)在实例上配置和初始化应用程序。实例控制器是一个 Amazon EMR 软件组件,可在每个集群实例上运行。实例控制器进行初始化,然后根据实例配置配置实例。

要在集群启动时启动 NodeProvisioner,实例控制器运行配置节点脚本 /usr/share/aws/emr/node-provisioner/bin/provision-node。然后,NodeProvisioner 为节点和集群配置预置所有 Amazon EMR 分发应用程序。NodeProvisioner 是最终的引导操作,在每个群集节点上运行所有其他引导操作之后运行。

对于最新的 Amazon EMR 集群,引导操作在 Amazon EMR 安装集群创建时指定的应用程序之前运行。此外,引导操作在群集节点处理数据之前运行。如果您向正在运行的集群添加节点,则引导操作将在这些节点上运行。在创建集群时,您可以创建自定义引导操作并指定要安装的应用程序。

在 Amazon EMR Serverless 集群中安装 Python 库

要安装 Python 库并在 Spark 作业和 Notebook 中使用其功能,请根据您的用例使用以下任一方法:

针对 Python 库进行故障排查

通过引导操作安装的 Python 库可能会被 Amazon EMR 默认库所覆盖。要解决此问题,请将延迟引导操作或第二阶段引导操作创建为正在运行的代码。或者,在收到 NODEPROVISIONSTATE SUCCESSFUL 消息后安装软件包。

在应用程序配置阶段之后,以下引导操作会升级库。将此脚本添加为在后台运行并退出的引导脚本,以便继续进行集群配置。此脚本继续监控节点配置,并在配置后升级库。

升级 NumPy 版本的示例脚本:

#!/bin/bash
set -x

cat > /var/tmp/fix-bootstap.sh <<'EOF'
#!/bin/bash
set -x

while true; do
    NODEPROVISIONSTATE=`sed -n '/localInstance [{]/,/[}]/{
    /nodeProvisionCheckinRecord [{]/,/[}]/ {
    /status: / { p }
    /[}]/a
    }
    /[}]/a
    }' /emr/instance-controller/lib/info/job-flow-state.txt | awk ' { print $2 }'`

    if [ "$NODEPROVISIONSTATE" == "SUCCESSFUL" ]; then
        echo "Running my post provision bootstrap"
        # your code here
      sudo /mnt/notebook-env/bin/pip install pandas==1.3.5
      sudo /mnt/notebook-env/bin/pip install boto==2.49.0
      sudo /mnt/notebook-env/bin/pip install boto3==1.25.0
        exit
    else
        echo "Sleeping Till Node is Provisioned"
        sleep 10
    fi
done

EOF

chmod +x /var/tmp/fix-bootstap.sh
nohup /var/tmp/fix-bootstap.sh  2>&1 &

**注意:**运行 Python 包的 YARN 容器可能不使用通过上述解决方案安装的更新包。因此,当你尝试安装更新的软件包时,你会收到 module not found 错误。为防止 module not found 错误,请轮询 nodemanager 服务状态。然后,在 nodemanager 启动时运行所需的引导操作。

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