Apache Hadoop または Apache Spark ジョブのユーザーキャッシュは、パーティションのディスク容量をすべて使用します。Amazon EMR ジョブが失敗するか、HDFS NameNode サービスがセーフモードになっています。
簡単な説明
Amazon EMR クラスターでは、ジョブがキャッシュデータを /mnt/yarn/usercache に書き込むことができるように YARN が設定されます。大量のデータを処理したり、複数の同時ジョブを実行したりすると、/mnt ファイルシステムが埋め尽くされることがあります。これが原因で、一部のノードでノードマネージャーが失敗し、ジョブのフリーズや失敗が起こります。
この問題を解決するには、以下のいずれかを実行します。
- 長時間実行ジョブやストリーミングジョブがない場合は、YARN NodeManager のユーザーキャッシュ保持設定を調整します。
- 長時間実行するジョブやストリーミングジョブがある場合は、Amazon Elastic Block Store (Amazon EBS) のボリュームをスケールアップします。
解決策
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 で設定された間隔で、実行中のコンテナが使用しないファイルが削除されます。
クラスターのクリーンアップ間隔と最大ディスク容量サイズを設定するには、次の手順を実行します。
-
各コアノードとタスクノードで /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.xmlyarn.nodemanager.localizer.cache.cleanup.interval-ms 400000
yarn.nodemanager.localizer.cache.target-size-mb 5120
-
各コアノードとタスクノードで次のコマンドを実行して NodeManager を再起動します。
EMR 5.29 およびそれ以前のバージョン
sudo stop hadoop-yarn-nodemanager
sudo start hadoop-yarn-nodemanager
EMR 5.30.0 およびそれ以降
sudo stop hadoop-yarn-nodemanager.service
sudo systemctl start hadoop-yarn-nodemanager.service
-
起動時に新しいクラスターのクリーンアップ間隔と最大ディスク容量サイズを設定するには、次のような設定オブジェクトを追加します。
[
{
"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 ,
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) インスタンスのサイズに応じて増加します。各インスタンスタイプのデフォルトのストレージ容量とボリューム数の詳細については、「インスタンスのデフォルト Amazon EBS ストレージ」を参照してください。
- **Amazon EMR バージョン 5.21 およびそれ以前:**デフォルトの EBS ボリュームサイズは 32 GB です。27 GB は ** /mnt ** パーティション用に予約されています。HDFS、YARN、ユーザーキャッシュ、およびすべてのアプリケーションは /mnt パーティションを使用します。必要に応じて、EBS ボリュームのサイズを増やします。複数の EBS ボリュームを指定することもできます。それらは /mnt1 や /mnt2 としてマウントされます。
Spark ストリーミングジョブでは、データが不要になった後に RDD.unpersist() を実行することもできます。または、明示的に Scala で System.gc() を呼び出したり、Python で sc._jvm.System.gc() を呼び出したりして、JVM ガベージコレクションを開始し、中間シャッフルファイルを削除します。