Sparkジョブ実行時にクラスローダーのトレースを有効にする


Distributed computing (Apache Hadoop, Spark, ...) Advent Calendar 2016の七日目です。

障害のトラブルシューティングをしていると、「このプログラム、なんか変なライブラリ呼んでるんちゃうか」、と疑いをもつことがあります。たとえば、Sparkにおいてはドライバやエグゼキューターが変なクラスをロードして挙動がおかしくなっているようなケースです。

そんなときは、実行時に下記オプションを渡してあげましょう。

--conf "spark.executor.extraJavaOptions=-verbose:class" \
--conf "spark.driver.extraJavaOptions=-verbose:class"

すると、標準出力にクラスローダーのトレースが書き出されます。spark.driver.extraJavaOptionsは、クライアントモードで実行すればクライアントコンソールに、YARNのクラスタモードで実行すればApplicationMasterの標準出力が書き出し先となります。下記は、エグゼキューターの標準出力ログの一例です。

Log Type: stdout
Log Upload Time: Wed Dec 07 06:27:40 -0800 2016
Log Length: 1514211
[Opened /usr/java/jdk1.8.0_60/jre/lib/rt.jar]
[Loaded java.lang.Object from /usr/java/jdk1.8.0_60/jre/lib/rt.jar]
[Loaded java.io.Serializable from /usr/java/jdk1.8.0_60/jre/lib/rt.jar]
[Loaded java.lang.Comparable from /usr/java/jdk1.8.0_60/jre/lib/rt.jar]
[Loaded java.lang.CharSequence from /usr/java/jdk1.8.0_60/jre/lib/rt.jar]
[Loaded java.lang.String from /usr/java/jdk1.8.0_60/jre/lib/rt.jar]
...

普段はまず(そして願わくば)使うことのないであろう機能の紹介でした。

参考
Apache Spark 1.6の公式設定ドキュメント
https://spark.apache.org/docs/1.6.1/configuration.html
Apache Spark 最新版の公式設定ドキュメント
http://spark.apache.org/docs/latest/configuration.html
SparkをYARN上で動かす際に参考にするClouderaのドキュメント
http://www.cloudera.com/documentation/enterprise/latest/topics/cdh_ig_running_spark_on_yarn.html