我想在 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 启动时运行所需的引导操作。