Amazon EMR と Amazon EMR Serverless のクラスターに Python ライブラリをインストールしてトラブルシューティングしたいと考えています。
解決策
Amazon EMR クラスターに Python ライブラリをインストールする
Amazon EMR クラスターに Python ライブラリをインストールするには、ブートストラップアクションを使用します。
Amazon EMR は、Apache BigTop デプロイメカニズムである puppet を使用して、インスタンス上のアプリケーションを設定および初期化します。Instance-controller は、すべてのクラスターインスタンスで実行される Amazon EMR ソフトウェアコンポーネントであり、インスタンスの設定に基づいてインスタンスを初期化し、プロビジョニングします。
クラスターの起動時に NodeProvisioner を起動するにあたっては、インスタンスコントローラーがプロビジョニングノードスクリプトinstance controllerを実行します。次に、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 の起動時に目的のブートストラップアクションを実行します。