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

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

我想在我的 Amazon EMR 集群上安装外部 Python 库。
如何在我的 EMR 集群上安装 Python 库? 2023-08-19 18:31:29
如何在我的 EMR 集群上安装 Python 库? 0
如何在我的 EMR 集群上安装 Python 库?
## 简短描述 您可以使用[引导操作](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-bootstrap.html?trk=cndc-detail)安装 Python 库。 EMR 使用 Puppet(Apache BigTop 使用的部署机制)在实例上配置和初始化应用程序。实例控制器是 EMR 的软件组件,其在集群的每个实例上运行。实例控制器会初始化实例,然后根据实例配置来预置实例。 实例控制器在 **/usr/share/amazon/emr/node-provisioner/bin/provision-node** 上运行预置节点脚本,在集群启动时启动 **NodeProvisioner**。**NodeProvisioner** 为节点和集群配置预置 EMR 发行版的所有应用程序。NodeProvisioner 被视为最终引导操作,在集群的每个节点上运行完所有其他引导操作之后再运行此操作。 ## 解决方法 在最新的 EMR 集群中,会在 Amazon EMR 安装集群创建时指定的任何应用程序之前运行此引导操作。在集群节点开始处理数据之前会运行此引导操作。如果您向正在运行的集群添加节点,则也会以相同的方式在这些节点上运行此引导操作。您可以在创建集群时创建自定义引导操作并指定要安装的应用程序。有关更多信息,请参阅[创建引导操作以安装其他软件](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-bootstrap.html?trk=cndc-detail)。 ### 对通过引导操作安装的被默认库覆盖的库进行故障排除 使用引导操作安装的库可能会被 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** 启动后立即运行所需的引导操作。
contact-us