Spark

Spark に break point を貼って Debug する方法

はじめに

Sparkを使っていて以下のような辛さがありました。

  • Hyper Parameter を少しずつ変えてチューニングしたいだけなのに、そこに至るデータ処理に時間がかかりすぎて何度もトライするのが辛い。
  • spark-shell でもまぁデバッグできなくは無いんだけど、デバッグしたい箇所に至るまでのステップをshellに打ち込むのが面倒。
  • あぁ Spark でも break point 貼れたらなぁ…

この記事はそんな辛さを解消する記事です。

まとめ

簡単な話なので先にまとめると、

  • spark-submit 時に SPARK_SUBMIT_OPTSjdwp の設定を入れて起動
  • Intellij の Remote Debugger 機能で break point を貼る

と言うものです。

おことわり

  • この記事は Intellij で Debug する方法を書いていますが、eclipse でも使えます。
  • 個々の技術の説明はしません。

Step1: Intellij で Remote Debugger の設定をする

1.「Run」->「Edit Configuration」で設定画面を開く image.png
2. 「+」->「Remote」で Remote Debugger の設定を開く image.png
3. Name には好きな名前、Host には spark-submit する Host の IP を書きましょう。 Command line arguments for running remote JVM という項目に書かれている設定は後ほど使用するのでコピーしておいてください。 image.png
4. 「OK」を押して設定を Save する。

以上で Remote Debugger を起動する準備ができました。

Step2: Remote Debug 可能な設定をしてspark-submitする

  1. SPARK_SUBMIT_OPTS という環境変数に Step1 でコピーした jdwp の設定を入れる。
    • export SPARK_SUBMIT_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
  2. spark-submit を実行する

Step3: Remote Debugger を実行した Spark に接続する

  1. 「Run」-> 「Debug 'さっき付けた名前'」で Remote Debugger を実行する image.png
    • この時、spark-submit されていなければ ConnectException が発生します image.png
  2. 正しく接続されたら Connected to target VM, address: 'さっき指定したホスト:5005', transport: 'socket' と出ます。(Sparkを別サーバーで動かしたのでIPが変わっていますが無視してください…)image.png
  3. break point を貼ります
    • Spark の処理が進んでしまうと再実行が必要になるので事前に貼っておいたほうが無難です。
  4. break point を貼った箇所で止まるので debug します。 image.png
  5. 「Evaluate Expression」から DataFrame (この画像では testTraineeDataFrame )の操作もできます image.png

以上

Spark で扱うデータはLocalで扱える量ではないケースがほとんどなので、こういった Remote Debug ができるのは非常に便利ですね。