sbt を使用して Spark を分散実行するとソース内の無名内部クラスに対して ClassNotFoundException
が発生する。この場合、一度 JAR を作成して明示的に SparkContext
に指定すると解消する。
val sc = new SparkContext("spark://...", ...)
sc.addJar("./target/scala-2.10/myproject_2.10-1.0-SNAPSHOT.jar")
sbt から実行するときに package
run
の順序でコマンドを指定して該当 JAR が作成されてから実行するように起動すれば良い。
$ sbt package run
sbt run
はコンパイル済みクラスを target/classes
から参照するが、Spark はクラスパス上の無名内部クラスの *.class ファイルを分散処理の各ノードに配布していないような感じ。1.x~1.5 まで確認しているが後のバージョンで改善されるかも知れない。まぁ粒度が高いと転送パフォーマンスも悪いので JAR 化は必ずしましょう。