JavaのアプリケーションでGC関連の調査を行う際は、GCログを吐き出させてログをGC Viewerなどで分析すると思います。
ただ分散処理環境のyarnでは、実行環境が分散している関係上設定方法に少し癖があります。
今回はYARNで実行されるSparkから具体的なGCログの取得方法について説明します。
SparkにGCログを出力させる
spark-submitを行う際に書きのオプションを渡すことでexecutorのJVMにGCログを出力させることができます。
driverの場合も似た感じで渡せます。
spark2-submit \
--conf "spark.executor.extraJavaOptions=-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps" \
--class ExampleSparkMain \
ExampleSpark.jar
Spark executorの標準出力を取得する
GCログはexecutorの標準出力に出力されます。
yarn.log-aggregation-enable
が有効になっていれば
Sparkを実行しているノードのローカルに出力されます(Spark Web UI上からアクセスする事もできる)。
ローカルへの出力ディレクトリですがyarnのyarn.nodemanager.log-dirs
という値で設定が行われているので下記の方法で確認を行います。
-
yarn-site.yml
を見る -
hdfs getconf -confKey yarn.nodemanager.log-dirs
でパラメータを取得
自分が試した環境はCDH5だったのですが、/etc/hadoop
配下のyarn-site.yml
には記載がなく、CDHがインストールされているディレクトリのyarn-site.yml
を読むことでディレクトリが判明しました。
ディレクトリ配下のstdoutというファイルにgcログが出力されているのでこれをgc viewerなどで読み込ませます。