Amazon EMR クラスターに外部の Python ライブラリをインストールしたいと考えています
簡単な説明
Python ライブラリは、ブートストラップアクションを使用してインストールできます。
EMR は、Apache BigTop が使用するデプロイメカニズムである puppet を使用して、インスタンス上のアプリケーションを設定および初期化します。インスタンスコントローラーは、クラスターのすべてのインスタンスで実行される EMR のソフトウェアコンポーネントです。インスタンスコントローラーは、インスタンス構成に基づいてインスタンスを初期化し、プロビジョニングします。
インスタンスコントローラーは /usr/share/aws/emr/node-provisioner/bin/provision-node でプロビジョニングノードスクリプトを実行し、クラスターの起動時に NodeProvisioner を起動します。NodeProvisioner は、ノードとクラスターの構成用に EMR ディストリビューションのすべてのアプリケーションをプロビジョニングします。NodeProvisioner は、クラスターの各ノードで他のすべてのブートストラップアクションが実行された後に実行される最後のブートストラップアクションとして扱われます。
解決方法
最新の EMR クラスターでは、Amazon EMR がクラスターの作成時に指定されたアプリケーションをインストールする前に、ブートストラップアクションが実行されます。ブートストラップアクションは、クラスターノードがデータの処理を開始する前に実行されます。実行中のクラスターにノードを追加すると、ブートストラップアクションもそれらのノードで同じ方法で実行されます。クラスターを作成するときに、カスタムのブートストラップアクションを作成し、インストールするアプリケーションを指定できます。詳細については、「「ブートストラップアクションを作成して追加のソフトウェアをインストールする」を参照してください。
ブートストラップアクションによってインストールされたライブラリが、デフォルトライブラリによってオーバーライドされる場合のトラブルシューティング
ブートストラップアクションを使用してインストールされたライブラリは、Amazon EMR のデフォルトライブラリによってオーバーライドされる可能性があります。ブートストラップスクリプトは、クラスターの作成前とノードプロビジョニングの前に実行されます。そのため、ライブラリはデフォルトバージョンでオーバーライドされる可能性があります。
この問題を回避するには、実行中のコードとして遅延ブートストラップアクションまたは第 2 ステージのブートストラップアクションを作成します。または、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 が起動したらすぐに目的のブートストラップアクションを実行します。