我想在 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 作業和筆記本中使用其功能,請根據您的使用案例使用下列其中一種方法:
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 容器可能不會使用可使用上述解決方法安裝的更新套件。因此,當您嘗試安裝更新的套件時,您將會收到找不到模組錯誤。若要防止出現找不到模組錯誤,請調查 nodemanager 服務狀態。然後,在 nodemanager 啟動時執行所需的啟動程序動作。