Amazon EMR クラスターで Jupyter または Zeppelin ノートブックを実行しています。送信した Apache Spark ジョブが完了した後も YARN アプリケーションが実行し続けます。
簡単な説明
Zeppelin または Jupyter で Spark ノートブックを実行すると、Spark がインタープリターを開始します。インタプリターは YARN アプリケーションを作成します。このアプリケーションは、アプリケーションを一覧表示したときに表示される Spark ドライバです。ノートブックからジョブの実行を終了しても、ドライバーは終了しません。設計により、Spark ドライバーは、オンザフライコード実行用のアプリケーションコンテナをリクエストできるようにアクティブ状態を維持します。欠点は、YARN アプリケーションが、他のジョブが必要とするリソースを使用している可能性があることです。この問題を解決するには、YARN アプリケーションを手動で停止できます。アプリケーションが自動的に停止するタイムアウト値を設定することもできます。
解決方法
Zeppelin
オプション 1: Spark インタープリターを再起動する
開始する前に、Zeppelin でインタープリターを再起動するアクセス許可があることを確認してください。
1. Zeppelin を開きます。
2. ユーザー名の横にあるドロップダウンリストから、[インタプリター] を選択します。
3. Spark インタープリターを見つけ、[再起動] を選択します。インタープリターが再起動すると、Zeppelin が YARN ジョブを終了します。
オプション 2: YARN ジョブを手動で停止する
開始する前に、以下の点を確認してください。
- Amazon EMR クラスターへの SSH アクセスがある。
- YARN コマンドを実行するアクセス許可がある。
アプリケーションを終了するには、-kill コマンドを使用します。次の例では、application_id を実際のアプリケーション ID に置き換えます。
yarn application -kill application_id
オプション 3: インタープリターのタイムアウト値を設定する
Zeppelin バージョン 0.8.0 以降 (Amazon EMR バージョン 5.18.0 以降で利用可能) には、インタープリター用のライフサイクルマネージャーが含まれています。TimeoutLifecycleManager 設定を使用して、指定されたアイドルタイムアウト期間後にインタープリターを終了します。
1. 以下の内容で etc/zeppelin/conf/zeppelin-site.xml ファイルを作成します。この例では、タイムアウト期間は 120,000 ミリ秒 (2 分) に設定されています。環境に適したタイムアウト値を選択します。
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>zeppelin.interpreter.lifecyclemanager.class</name>
<value>org.apache.zeppelin.interpreter.lifecycle.TimeoutLifecycleManager</value>
<description>This is the LifecycleManager class for managing the lifecycle of interpreters. The interpreter terminates after the idle timeout period.</description>
</property>
<property>
<name>zeppelin.interpreter.lifecyclemanager.timeout.checkinterval</name>
<value>60000</value>
<description>The interval for checking whether the interpreter has timed out, in milliseconds.</description>
</property>
<property>
<name>zeppelin.interpreter.lifecyclemanager.timeout.threshold</name>
<value>120000</value>
<description>The idle timeout limit, in milliseconds.</description>
</property>
</configuration>
2. 次のコマンドを実行して Zeppelin を再起動します。
$ sudo stop zeppelin
$ sudo start zeppelin
Jupyter
オプション 1: ノートブックを手動でシャットダウンする
ジョブが完了した後、次のいずれかの方法を使用して Jupyter ユーザーインターフェイスでカーネルを停止します。
- Jupyter ノートブックインターフェイスで、[ファイル] メニューを開き、[閉じて停止する] を選択します。
- Jupyter ダッシュボードで、実行中タブを開きます。停止するノートブックで [シャットダウン] を選択します。
オプション 2: カーネルを手動でシャットダウンする
Jupyter ノートブックインターフェイスから [カーネル] メニューを開き、[シャットダウン] を選択します。
オプション 3: タイムアウト属性を設定する
カーネルをシャットダウンする前にノートブックタブまたはブラウザウィンドウを閉じると、YARN ジョブは実行し続けます。今後このような事態を防ぐには、NotebookApp.shutdown_no_activity_timeout 属性を設定します。この属性は、タブまたはブラウザウィンドウを閉じた場合でも、指定されたアイドルタイムアウト期間の後に YARN ジョブを終了します。
NotebookApp.shutdown_no_activity_timeout 属性を設定するには、以下の手順を実行します。
1. マスターノードで /etc/jupyter/jupyter_notebook_config.py ファイルを開き、次のようなエントリを追加します。この例では、タイムアウト属性が 120 秒に設定されています。環境に適したタイムアウト値を選択します。
c.NotebookApp.shutdown_no_activity_timeout = 120
2. 次のコマンドを実行して jupyterhub を再起動します。
sudo docker stop jupyterhub
sudo docker start jupyterhub
関連情報
Apache Zeppelin
Amazon EMR で Zeppelin を使用する際の考慮事項
Amazon EMR での Jupyter ノートブック