Apache Hadoop または Apache Spark ジョブのユーザーキャッシュが、パーティションにあるすべてのディスク領域を占有しています。Amazon EMR ジョブが失敗しているか、HDFS NameNode サービスがセーフモードになっています。
簡単な説明
Amazon EMR クラスターでは、ジョブがキャッシュデータを /mnt/yarn/usercache に書き込むことができるように YARN を設定します。大量のデータを処理したり、複数の同時ジョブを実行したりすると、 /mnt ファイルシステムがいっぱいになることがあります。このために、一部のノードでノードマネージャーが失敗し、ジョブのフリーズや失敗が起こります。
この問題を解決するには、次のいずれかの方法を使用してください。
- YARN NodeManager のユーザーキャッシュ保持設定を調整します。長時間実行するジョブやストリーミングジョブがない場合は、こちらのオプションを選択します。
- Amazon Elastic Block Store (Amazon EBS) ボリュームをスケールアップします。長時間実行するジョブまたはストリーミングジョブがある場合は、こちらのオプションを選択します。
解決方法
オプション 1: NodeManager のユーザーキャッシュ保持設定を調整する
次の属性は、キャッシュのクリーンアップ設定を定義します。
- yarn.nodemanager.localizer.cache.cleanup.interval-ms: これはキャッシュのクリーンアップ間隔です。デフォルト値は 600,000 ミリ秒です。この間隔の後に、キャッシュサイズが yarn.nodemanager.localizer.cache.target-size-mbで設定された値を超えると、実行中のコンテナで使用していないファイルは削除されます。
- yarn.nodemanager.localizer.cache.target-size-mb: キャッシュに許可される最大ディスク領域です。デフォルト値は 10,240 MB です。キャッシュディスクサイズがこの値を超えると、実行中のコンテナで使用されていないファイルは、 yarn.nodemanager.localizer.cache.cleanup.interval-ms で設定された間隔で削除されます。
実行中のクラスターでクリーンアップ間隔と最大ディスク領域サイズを設定するには:
1. 各コアノードとタスクノードで /etc/hadoop/conf/yarn-site.xml を開き、yarn.nodemanager.localizer.cache.cleanup.interval と yarn.nodemanager.localizer.cache.target-size-mb の値を減らします。例:
sudo vim /etc/hadoop/conf/yarn-site.xml
yarn.nodemanager.localizer.cache.cleanup.interval-ms 400000
yarn.nodemanager.localizer.cache.target-size-mb 5120
2. NodeManager サービスを再起動するには、各コアノードとタスクノードで次のコマンドを実行します。
sudo stop hadoop-yarn-nodemanager
sudo start hadoop-yarn-nodemanager
注: Amazon EMR リリースバージョン 5.21.0 以降では、次のような設定オブジェクトを使用して、クラスター設定を上書きしたり、実行中のクラスターの追加設定分類を指定したりすることもできます。詳細については、Reconfigure an instance group in a running cluster を参照してください。
新しいクラスターでクリーンアップ間隔と最大ディスク領域サイズを設定するには、クラスターの起動時に次のような設定オブジェクトを追加します。
[
{
"Classification": "yarn-site",
"Properties": {
"yarn.nodemanager.localizer.cache.cleanup.interval-ms": "400000",
"yarn.nodemanager.localizer.cache.target-size-mb": "5120"
}
}
]
削除サービスは実行中のコンテナでは完了しないことにご注意ください。つまり、ユーザーキャッシュ保持設定を調整した後でも、データが次のパスに流出し、ファイルシステムがいっぱいになる可能性があります。
{'yarn.nodemanager.local-dirs'}/usercache/user/appcache/application_id ,
オプション 2: EMR クラスターノードの EBS ボリュームをスケールアップする
実行中の EMR クラスターのストレージをスケールアップするには、 「Dynamically scale up storage on Amazon EMR clusters」をご参照ください。
新しい EMR クラスターのストレージをスケールアップするには、EMR クラスターの作成時により大きいボリュームサイズを指定します。既存のクラスターにノードを追加するときに、これを行うこともできます。
- Amazon EMR リリースバージョン 5.22.0 以降: EBS ストレージのデフォルト量は、Amazon Elastic Compute Cloud (Amazon EC2) インスタンスのサイズに基づいて増加します。各インスタンスタイプにデフォルトで割り当てられたストレージの量とボリューム数の詳細については、「Default Amazon EBS storage for instances」をご覧ください。
- Amazon EMR リリースバージョン 5.21 およびそれ以前のバージョン: デフォルトの EBS ボリュームサイズは 32 GB です。このうち 27 GB は /mnt パーティション用に予約されています。HDFS、YARN、ユーザーキャッシュ、およびすべてのアプリケーションは /mnt パーティションを使用します。必要に応じて EBS ボリュームのサイズを増やします (例: 100~500 GB またはそれ以上)。複数の EBS ボリュームを指定することもできます。複数の EBS ボリュームは、/mnt1、/mnt2 などでマウントされます。
Spark ストリーミングジョブでは、処理が完了してデータが不要になったときに、非永続化 (RDD.unpersist()) を実行することもできます。または、System.gc() を Scala (Python では sc._jvm.System.gc()) で明示的に呼び出して、JVM ガベージコレクションを開始し、中間シャッフルファイルを削除します。