Scala
PlayFramework
Spark
sparksql

Spark・Playで詰んだ話の詰め合わせ1

More than 1 year has passed since last update.

バージョンによる問題(その1)

build.sbtにて

build.sbt
libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % "1.5.2",
  "org.apache.spark" % "spark-streaming_2.11" % "1.5.2",
  "org.apache.spark" %% "spark-sql" % "1.5.0",
  "com.datastax.spark" %% "spark-cassandra-connector" % "1.5.0-M2"
)

こんな感じでsparkSQLのみバージョンが若干異なっていました。「まあなんとかしてくれるでしょ」と慢心していると

[error] (run-main-0) java.lang.NoClassDefFoundError: org/apache/spark/sql/SQLContext
java.lang.NoClassDefFoundError: org/apache/spark/sql/SQLContext
...

ってエラーが発生しました。一見するとそんなクラス見つからないよ!!って言われてると思うのでただの打ち間違いに思えますが、この場合はただのバージョン定義ミスのようです。大人しく全てのバージョンを統一しましょう。

バージョンによる問題(その2)

今度はちゃんと下のようにバージョン揃えました。依存関係で怒られる事もないし完璧です。

build.sbt
libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % "1.5.2",
  "org.apache.spark" % "spark-streaming_2.11" % "1.5.2",
  "org.apache.spark" %% "spark-sql" % "1.5.2",
  "com.datastax.spark" %% "spark-cassandra-connector" % "1.5.0-M2"

という事で下のコードを動かしてみましょう

Test.scala
import org.apache.spark.{SparkConf,SparkContext}
import org.apache.spark.streaming.{Time, Durations, Seconds, StreamingContext}
import org.apache.spark.sql.cassandra.CassandraSQLContext
import com.datastax.spark.connector._

...

  def main(args: Array[String]){

    val conf = new SparkConf(true)...

    val sc = new SparkContext(conf)

    val cc = new CassandraSQLContext(sc)

    val rdd = cc.sql("SELECT * FROM keyspace.table")

  }
}

sbt runを行うとbuildでは文句を言われませんでした。それなら上手く実行されるでしょう
と、出てきた結果がこちら

[error] (run-main-0) com.google.common.util.concurrent.ExecutionError: java.lang.NoSuchMethodError: org.apache.spark.sql.execution.datasources.LogicalRelation.<init>(Lorg/apache/spark/sql/sources/BaseRelation;)V
com.google.common.util.concurrent.ExecutionError: java.lang.NoSuchMethodError: org.apache.spark.sql.execution.datasources.LogicalRelation.<init>(Lorg/apache/spark/sql/sources/BaseRelation;)V
    at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2199)
...

...何コレ。エラーメッセージが何を伝えたいのかが全くわからない...
このエラーメッセージの詳細はよくわからないので誰か教えて欲しいですが、恐らくこのバージョンでこのSparkSQLを用いたコードを動かすと対応出来ないよ!と伝えているのだと思います
全部を確かめてはいないのですが、別のバージョン(例えば1.4.1)で実行すると正しく実行されます
その1はまだSparkに慣れていないんだなあ()で済みますが、こっちはなんかもうお手上げって感じでした。先人が頑張ってくれなかったら今もわからないまま悩んでるとこでした。

不明(なんで起きるか分かる方お願いします)

ProvisionException: Unable to provision, see the following errors:

1) Error injecting constructor, com.fasterxml.jackson.databind.JsonMappingException: Could not find creator property with name 'id' (in class org.apache.spark.rdd.RDDOperationScope)
 at [Source: {"id":"0","name":"mapPartitions"}; line: 1, column: 1]
  at controllers.Application.<init>(Application.scala:18)
  while locating controllers.Application
    for parameter 1 at router.Routes.<init>(Routes.scala:31)
  while locating router.Routes
  while locating play.api.inject.RoutesProvider
  while locating play.api.routing.Router

Play frameworkで遊んでいたらこんな事態になりました。何故こうなったか(恐らくJSON周りだと思いますが)、どこのせいなのか全く分からないです。ただ先人様が

build.sbt
dependencyOverrides ++= Set(
  "com.fasterxml.jackson.core" % "jackson-databind" % "2.4.4"
)

を加えてらしたので試しに加えてみたら無事動きました...なんなんだこれ...
調べて分かったらまた改めて更新します。

随時コメント等ありましたら反応しますのでよろしくお願いします。