SparkをビルドしIntelliJでリモートデバッグする

sparkjavaintellijetl

コマンドラインでのビルド

$ git clone --branch v3.3.0 --depth 1 https://github.com/apache/spark.git 

asdf で Java 8 をインストールする。

$ brew install asdf
$ echo -e "\n. $(brew --prefix asdf)/libexec/asdf.sh" >> ${ZDOTDIR:-~}/.zshrc
$ asdf --version
v0.10.2

$ asdf plugin-add java
$ asdf list-all java
$ asdf install java corretto-8.342.07.3
$ asdf global java corretto-8.342.07.3
$ echo ". ~/.asdf/plugins/java/set-java-home.zsh" >> ~/.zprofile
$ java -version
openjdk version "1.8.0_342"
OpenJDK Runtime Environment Corretto-8.342.07.3 (build 1.8.0_342-b07)
OpenJDK 64-Bit Server VM Corretto-8.342.07.3 (build 25.342-b07, mixed mode)

ビルドが通ることを確認する。

$ export MAVEN_OPTS="-Xss64m -Xmx2g -XX:ReservedCodeCacheSize=1g"
$ ./build/mvn -DskipTests clean package

IntelliJでのビルド

New > Project from Existing Sources から Maven Project として開き、 JDKは ~/.asdf/installs/java/ 内にあるので Command + Shift + . で隠しディレクトリを表示して選択する。 そして Maven window から Generate Sources and Update Folders For All Projects を実行すると Build Project できるようになる。

リモートデバッグ

Listen to remote JVM でデバッグを開始し、spark.driver.extraJavaOptions に次のようなオプションを渡すとブレークポイントで止めることができる。

JDWPを有効にしてリモートマシンで動いているJavaアプリケーションをデバッグする - sambaiz-net

$ ./bin/spark-shell --conf "spark.driver.extraJavaOptions=-agentlib:jdwp=transport=dt_socket,server=n,suspend=n,address=localhost:5005"
scala> spark.sql("select 1+1").collect()

sbt では次のようにしてオプションを渡すことができる。

$ ./build/sbt
sbt:spark-parent> project core
sbt:spark-core> set javaOptions in Test += "-agentlib:jdwp=transport=dt_socket,server=n,suspend=n,address=localhost:5005"
sbt:spark-core> testOnly *SparkContextSuite -- -t "Only one SparkContext may be active at a time"

参考

Install Java with asdf | Peaceful Revolution

asdfを使ってScalaの開発環境を構築する手順 (Mac / IntelliJ)