Amazon EMR で Apache Spark ジョブを実行したいのですが、コアノードのディスク容量がほぼ枯渇しています。
解決策
異常なコアノードが存在しないか確認する
1 つ以上の Amazon Elastic Block Store (Amazon EBS) ボリュームがアタッチされたノードが、ディスク使用率 90% を上回った場合、そのノードは異常と扱われます。ディスク使用率が 90% に達したノードを判断するには、次の手順を実行します。
- Amazon CloudWatch メトリクス MRUnhealthyNodes を確認します。このメトリクスは、EMR クラスター内の異常ノード数を表示します。
注: または、CloudWatch アラームを作成し、MRUnhealthyNodes メトリクスを監視することもできます。
- プライマリノードに接続し、インスタンスコントローラーログ (/emr/instance-controller/log/instance-controller.log) にアクセスします。
- インスタンスコントローラーログで InstanceJointStatusMap を検索すると、異常ノードを特定できます。
詳細については、「異常ノードが原因でディスク使用率が増加する」セクションを参照してください (「 Amazon EMR の Spark で "ExecutorLostFailure:Slave lost" が発生する場合の解決方法を教えてください」)。
- マウントの使用率が高いかどうかを判断するには、コアノードにログインし、次のコマンドを実行します。
df -h
不要なローカルまたは一時 Spark アプリケーションファイルを削除する
Spark ジョブの実行時、Spark アプリケーションはローカルファイルを作成するため、コアノード上のディスク空き容量を消費します。たとえば、df -h コマンドで /mnt が 90% を上回るディスク容量を使用していることが示された場合は、使用率が高いディレクトリまたはファイルを特定します。
コアノードで次のコマンドを実行すると、ディスク容量を最も多く消費している上位 10 ディレクトリが表示されます。
cd /mnt
sudo du -hsx * | sort -rh | head -10
/mnt/hdfs ディレクトリの利用率が高い場合は、Hadoop 分散ファイルシステム (HDFS) の使用状況を確認し、ログファイルなどの不要なファイルを削除します。特定のディレクトリの容量使用率を確認するには、次のコマンドを実行します。
hdfs dfsadmin -report
hadoop fs -du -s -h /path/to/dir
注: /path/to/dir を容量使用率を確認するディレクトリへのパスに置き換えてください。
Spark イベントログと YARN コンテナログの保持期間を短縮する
/var/log ディレクトリには、Spark イベントログや YARN コンテナログなどのログファイルが保存されます。HDFS からログファイルを自動的に消去するには、保持期間を短縮します。
Spark ジョブ履歴ファイルのデフォルト保持期間を短縮する
デフォルトでは、Spark ジョブ履歴ファイルは /var/log/spark/apps に配置されます。ファイルシステム履歴クリーナーを実行すると、Spark は 7 日前より古いジョブ履歴ファイルを削除します。
実行中のクラスターでのデフォルト保持期間を短縮するには、次の手順を実行します。
- SSH を使用してプライマリノードに接続します。
- /etc/spark/conf/spark-defaults.conf に次の値を追加するか、値を更新します。
------spark.history.fs.cleaner.enabled true
spark.history.fs.cleaner.interval 12h
spark.history.fs.cleaner.maxAge 1d
------
上記の構成では、12 時間ごとにクリーナーが実行されます。この構成では、1 日前よりも古いファイルは削除されます。この期間は、spark.history.fs.cleaner.internval および spark.history.fs.cleaner.maxAge パラメータでカスタマイズできます。
- Spark History サーバーを再起動します。
クラスターの起動時に、Spark ジョブ履歴ファイルに対するデフォルトの保持期間を短縮するには、次の構成を使用します。
{
"Classification": "spark-defaults",
"Properties": {
"spark.history.fs.cleaner.enabled": "true",
"spark.history.fs.cleaner.interval": "12h",
"spark.history.fs.cleaner.maxAge": "1d"
}
}
spark.history.fs.cleaner.interval および spark.history.fs.cleaner.maxAge パラメータで期間をカスタマイズできます。
これらのパラメータの詳細については、Apache Spark のウェブサイトで「モニタリングとインストルメンテーション」を参照してください。
YARN コンテナログのデフォルト保持期間を短縮する
Spark アプリケーションログは、Spark ジョブの YARN コンテナログです。コアノードの /var/log/hadoop-yarn/apps に配置されます。Spark は、アプリケーションの実行が終了すると、これらのログを HDFS に移動します。デフォルトでは、YARN はアプリケーションログを HDFS に 48 時間保持します。保存期間を短縮するには、次の手順を実行します。
- SSH を使用してプライマリ、コア、またはタスクノードに接続します。
- EMR クラスターの各ノード (プライマリノード、コアノード、およびタスクノード) で /etc/hadoop/conf/yarn-site.xml ファイルを開きます。
- すべてのノードで yarn.log-aggregation.retain-seconds プロパティの値を減らします。
- ResourceManager デーモンを再起動します。
クラスターを再構成することで保持期間を短縮することもできます。
/mnt/yarn の使用率を削減する
/mnt/yarn ディレクトリのディスク使用率が高い場合は、ユーザーキャッシュの保持期間を調整するか、ノードの EBS ボリュームをスケーリングします。詳細については、「キャッシュが Amazon EMR のディスク容量を使いすぎないようにするために、Hadoop または Spark ジョブのユーザーキャッシュを停止する方法を教えてください」を参照してください。
クラスターをリサイズするか Amazon EMR をスケーリングする
HDFS の容量に関する問題を防ぐには、コアノード数をスケーリングします。また、HDFS ディレクトリ以外のディレクトリの容量が不足した場合は、コアノードまたはタスクノードの数を増やします。詳細については、「Amazon EMR のクラスタースケーリングを使用してワークロードの変化に応じた調整を行う」を参照してください。
または、既存ノードの EBS ボリュームを拡張するか、動的スケーリングスクリプトを使用することもできます。詳細については、「Amazon EMR の Apache Spark ジョブで "no space left on device" ステージエラーが発生する場合の解決方法を教えてください」を参照してください。
関連情報
Amazon EMR クラスターのハードウェアとネットワークを構成する
HDFS 構成
Amazon EMR のストレージとファイルシステムを操作する