Hadoop または Spark ジョブのユーザーキャッシュが Amazon EMR で、ディスク領域を使いすぎないようにする方法を教えてください。

最終更新日: 2020 年 2 月 11 日

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.intervalyarn.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 以降では、次のような設定オブジェクトを使用して、クラスター設定を上書きしたり、実行中のクラスターの追加設定分類を指定したりすることもできます。詳細については、「Supplying a Configuration for 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 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 ストリーミングジョブでは、処理が完了してデータが不要になったときに、unpersist (RDD.unpersist()) を実行することもできます。または、System.gc() を Scala (Python では sc._jvm.System.gc()) で明示的に呼び出して、JVM ガベージコレクションを開始し、中間シャッフルファイルを削除します。


この記事はお役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合