###前提・実現したいこと
今、ScalaとSparkとCassandraを組み合わせてAPIを設計しています。
その最中、spark-submitをしようとした際に問題が起こりました。
###発生している問題・エラーメッセージ
sbt assemblyを行って出来たjarファイルを用いて行った結果が以下になります。
% spark-submit --master spark://localhost:7077 target/scala-2.11/Test-assembly-1.0.jar Exception in thread "main" java.lang.NoSuchMethodError: org.apache.spark.sql.cassandra.CassandraSQLContext$$anon$1.TakeOrdered()Lorg/apache/spark/sql/execution/SparkStrategies$TakeOrdered$; at org.apache.spark.sql.cassandra.CassandraSQLContext$$anon$1.<init>(CassandraSQLContext.scala:90) at org.apache.spark.sql.cassandra.CassandraSQLContext.<init>(CassandraSQLContext.scala:85) at Test$.getData(AnalysisOfBeacon.scala:50) at Test$.main(AnalysisOfBeacon.scala:29) at Test.main(AnalysisOfBeacon.scala) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:483) at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:731) at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181) at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:206) at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121) at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
このような形になります。一方sbt packageを実行して出来たjarファイルで試すと
% spark-submit --master spark://localhost:7077 target/scala-2.11/test_2.11-1.0.jar Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/sql/cassandra/CassandraSQLContext at AnalysisOfBeacon$.getData(AnalysisOfBeacon.scala:50) at AnalysisOfBeacon$.main(AnalysisOfBeacon.scala:29) at AnalysisOfBeacon.main(AnalysisOfBeacon.scala) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:483) at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:731) at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181) at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:206) at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121) at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala) Caused by: java.lang.ClassNotFoundException: org.apache.spark.sql.cassandra.CassandraSQLContext at java.net.URLClassLoader$1.run(URLClassLoader.java:372) at java.net.URLClassLoader$1.run(URLClassLoader.java:361) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:360) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 12 more
となります。
###該当のソースコード
build.sbtです
build.sbt
1lazy val root = (project in file(".")). 2 settings( 3 name := "Test", 4 version := "1.0", 5 scalaVersion := "2.11.7" 6 ) 7libraryDependencies ++= Seq( 8 "org.apache.spark" %% "spark-core" % "1.4.1", 9 "org.apache.spark" % "spark-streaming_2.11" % "1.4.1", 10 "com.datastax.spark" %% "spark-cassandra-connector" % "1.4.2", 11 "org.apache.spark" %% "spark-sql" % "1.4.1" 12) 13 14resolvers ++= Seq( 15 "Sonatype Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots/", 16 "Sonatype Releases" at "https://oss.sonatype.org/content/repositories/releases/" 17) 18 19mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) => 20 { 21 case PathList("netty", "handler", xs @ _*) => MergeStrategy.first 22 case PathList("netty", "buffer", xs @ _*) => MergeStrategy.first 23 case PathList("netty", "common", xs @ _*) => MergeStrategy.first 24 case PathList("netty", "transport", xs @ _*) => MergeStrategy.first 25 case PathList("netty", "codec", xs @ _*) => MergeStrategy.first 26 27 case PathList("META-INF", "io.netty.versions.properties") => MergeStrategy.first 28 case PathList(ps @ _*) if ps.last endsWith ".properties" => MergeStrategy.first 29 case PathList(ps @ _*) if ps.last endsWith ".xml" => MergeStrategy.first 30 case PathList(ps @ _*) if ps.last endsWith ".dtd" => MergeStrategy.first 31 case PathList(ps @ _*) if ps.last endsWith ".xsd" => MergeStrategy.first 32 case PathList(ps @ _*) if ps.last endsWith ".types" => MergeStrategy.first 33 case PathList(ps @ _*) if ps.last endsWith ".class" => MergeStrategy.first 34 case x => old(x) 35 } 36}
以下が実行コードになります。実務に関わるものなので、恐らく関わっているであろう部分についてのみ掲載させていただきます。
scala
1import org.apache.spark.{SparkConf,SparkContext} 2import org.apache.spark.streaming.{Time, Durations, Seconds, StreamingContext} 3import com.datastax.spark.connector 4import com.datastax.spark.connector._ 5import com.datastax.spark.connector.cql._ 6import org.apache.spark.sql.Row; 7import org.apache.spark.sql.cassandra.CassandraSQLContext 8object Test { 9 10 def main(args: Array[String]){ 11 12 val sc = new SparkConf().setAppName("Test")//.setMaster("local[*]").set("spark.cassandra.connection.host","127.0.0.1") 13 val sct = new SparkContext(sc); 14 val ssc = new StreamingContext(sct, Seconds(10)) 15 16 } 17}
###試したこと
バージョンによって
...TakeOrdered()...
というようなエラーが出たり(これはSpark 1.4.1まで)
...DataSourceStrategy...
というエラーに変わる事は観測しています。(Spark1.5.0~1.6.1)
1.4.1までのエラーは、Spark1.4.2で解決したと言っているissueを見かけたのですが、存在しないバージョンのようで解決の糸口になりませんでした。
また、このコードはsbt runでは正しく動作します。spark-submitの時にエラーが起きてしまうのです。
###補足情報(言語/FW/ツール等のバージョンなど)
scalaは2.11.7で統一
sbtは0.13.11
sparkやspark-sqlのバージョンなどは色々試しています。(1.3.1~1.6.1)
色々いたらない点があるとは思いますが、
解決のために必要な情報等ありましたら出せる範囲で出しますので宜しくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。