如何在我的 EMR 集群上安装 Python 库?

1 分钟阅读
0

我想在我的 Amazon EMR 集群上安装外部 Python 库

简短描述

您可以使用引导操作安装 Python 库。

EMR 使用 Puppet(Apache BigTop 使用的部署机制)在实例上配置和初始化应用程序。实例控制器是 EMR 的软件组件,其在集群的每个实例上运行。实例控制器会初始化实例,然后根据实例配置来预置实例。

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

解决方法

在最新的 EMR 集群中,会在 Amazon EMR 安装集群创建时指定的任何应用程序之前运行此引导操作。在集群节点开始处理数据之前会运行此引导操作。如果您向正在运行的集群添加节点,则也会以相同的方式在这些节点上运行此引导操作。您可以在创建集群时创建自定义引导操作并指定要安装的应用程序。有关更多信息,请参阅创建引导操作以安装其他软件

对通过引导操作安装的被默认库覆盖的库进行故障排除

使用引导操作安装的库可能会被 Amazon EMR 默认库覆盖。在集群创建之前和节点预置之前运行此引导脚本。因此,库可能会被默认版本覆盖。

要避免此问题,请创建延迟的引导操作或第二阶段引导操作以作为运行代码。或者,在收到 NODEPROVISIONSTATE SUCCESSFUL 消息后安装软件包。

以下引导脚本用于在应用程序预置阶段之后升级库。您可以将此脚本添加为引导脚本,该脚本在后台运行并成功退出,以便继续执行集群预置。此脚本继续监控节点配置预置,并在预置后升级库。

以下示例脚本可升级 NumPy 版本:

#!/bin/bash
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
                     sleep 10;
                echo "Running my post provision bootstrap"
                #your code here
                #Below example lines
                #sudo python3 -m pip uninstall numpy==1.16.5 (this is default version of numpy)
                #sudo python3 -m pip install --upgrade numpy==1.20.1 (new version of numpy)
                exit;
        fi
sleep 10;
done

**注意:**在某些情况下,运行 Python 软件包的 YARN 容器可能不会使用更新的软件包,此软件包可使用上述解决方法安装。如果容器未运行更新的软件包,则在尝试安装时会看到 module not found(未找到模块)错误。这是因为 YARN NodeManager 流程负责启动容器。在 NODEPROVISIONSTATE 成功之前,NodeManager 的容器可能已经在运行或已分配。在经常进行自动扩展的多租户集群中经常会出现此问题。

您可以通过轮询 nodemanager 服务的状态来避免出现 module not found(未找到模块)错误。然后,在 nodemanager 启动后立即运行所需的引导操作。


AWS 官方
AWS 官方已更新 1 年前