はじめに
Sparkを使っていて以下のような辛さがありました。
- Hyper Parameter を少しずつ変えてチューニングしたいだけなのに、そこに至るデータ処理に時間がかかりすぎて何度もトライするのが辛い。
- spark-shell でもまぁデバッグできなくは無いんだけど、デバッグしたい箇所に至るまでのステップをshellに打ち込むのが面倒。
- あぁ Spark でも break point 貼れたらなぁ…
この記事はそんな辛さを解消する記事です。
まとめ
簡単な話なので先にまとめると、
-
spark-submit
時にSPARK_SUBMIT_OPTS
にjdwp
の設定を入れて起動 - Intellij の Remote Debugger 機能で break point を貼る
と言うものです。
おことわり
- この記事は Intellij で Debug する方法を書いていますが、eclipse でも使えます。
- 個々の技術の説明はしません。
Step1: Intellij で Remote Debugger の設定をする
1.「Run」->「Edit Configuration」で設定画面を開く
2. 「+」->「Remote」で Remote Debugger の設定を開く
3. Name には好きな名前、Host には spark-submit
する Host の IP を書きましょう。 Command line arguments for running remote JVM
という項目に書かれている設定は後ほど使用するのでコピーしておいてください。
4. 「OK」を押して設定を Save する。
以上で Remote Debugger を起動する準備ができました。
Step2: Remote Debug 可能な設定をしてspark-submit
する
-
SPARK_SUBMIT_OPTS
という環境変数に Step1 でコピーしたjdwp
の設定を入れる。export SPARK_SUBMIT_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
-
spark-submit
を実行する
Step3: Remote Debugger を実行した Spark に接続する
- 「Run」-> 「Debug 'さっき付けた名前'」で Remote Debugger を実行する
- 正しく接続されたら
Connected to target VM, address: 'さっき指定したホスト:5005', transport: 'socket'
と出ます。(Sparkを別サーバーで動かしたのでIPが変わっていますが無視してください…) - break point を貼ります
- Spark の処理が進んでしまうと再実行が必要になるので事前に貼っておいたほうが無難です。
- break point を貼った箇所で止まるので debug します。
- 「Evaluate Expression」から
DataFrame
(この画像ではtestTrainee
がDataFrame
)の操作もできます
以上
Spark で扱うデータはLocalで扱える量ではないケースがほとんどなので、こういった Remote Debug ができるのは非常に便利ですね。