带有组装罐的 spark-cassandra-connector 的 NoSuchMethodError
NoSuchMethodError from spark-cassandra-connector with assembled jar
我是 Scala 的新手,正在尝试构建 Spark 作业。我构建了一个包含 DataStax 连接器的作业并将其组装到一个胖罐子中。当我尝试执行它时,它失败并显示 java.lang.NoSuchMethodError
。我打开了 JAR,可以看到其中包含 DataStax 库。我错过了一些明显的东西吗?关于这个过程有没有好的教程可以看?
谢谢
控制台
$ spark-submit --class org.bobbrez.CasCountJob ./target/scala-2.11/bobbrez-spark-assembly-0.0.1.jar ks tn
...
线程 "main" java.lang.NoSuchMethodError 中的异常:scala.runtime.ObjectRef.zero()Lscala/runtime/ObjectRef;
在 com.datastax.spark.connector.cql.CassandraConnector$.com$datastax$spark$connector$cql$CassandraConnector$$createSession(CassandraConnector.scala)
在 com.datastax.spark.connector.cql.CassandraConnector$$anonfun$2.apply(CassandraConnector.scala:148)
...
build.sbt
name := "soofa-spark"
version := "0.0.1"
scalaVersion := "2.11.7"
// additional libraries
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.0" % "provided"
libraryDependencies += "com.datastax.spark" %% "spark-cassandra-connector" % "1.5.0-M3"
libraryDependencies += "com.typesafe" % "config" % "1.3.0"
mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) =>
{
case m if m.toLowerCase.endsWith("manifest.mf") => MergeStrategy.discard
case m if m.startsWith("META-INF") => MergeStrategy.discard
case PathList("javax", "servlet", xs @ _*) => MergeStrategy.first
case PathList("org", "apache", xs @ _*) => MergeStrategy.first
case PathList("org", "jboss", xs @ _*) => MergeStrategy.first
case "about.html" => MergeStrategy.rename
case "reference.conf" => MergeStrategy.concat
case _ => MergeStrategy.first
}
}
CasCountJob.scala
package org.bobbrez
// Spark
import org.apache.spark.{SparkContext, SparkConf}
import com.datastax.spark.connector._
object CasCountJob {
private val AppName = "CasCountJob"
def main(args: Array[String]) {
println("Hello world from " + AppName)
val keyspace = args(0)
val tablename = args(1)
println("Keyspace: " + keyspace)
println("Table: " + tablename)
// Configure and create a Scala Spark Context.
val conf = new SparkConf(true)
.set("spark.cassandra.connection.host", "HOSTNAME")
.set("spark.cassandra.auth.username", "USERNAME")
.set("spark.cassandra.auth.password", "PASSWORD")
.setAppName(AppName)
val sc = new SparkContext(conf)
val rdd = sc.cassandraTable(keyspace, tablename)
println("Table Count: " + rdd.count)
System.exit(0)
}
}
Spark 1.6 的 Cassandra 连接器仍在开发中,尚未发布。
要将 Cassandra 与 Spark 集成,您需要 at-least 以下依赖项:-
- Spark-Cassandra 连接器 - 从 here
下载合适的版本
- Cassandra 核心驱动程序 - 从 here 下载合适的版本
- Spark-Cassandra Java 库 - 从 here 下载合适的版本
- 其他依赖 Jars - jodatime , jodatime-convert, jsr166
提到了相应版本的 Cassandra 库和 Spark 的映射here
显然,Spark 1.5 的 Cassandra 连接器也在开发中,您可能会看到一些兼容性问题。最稳定的 Cassandra 连接器版本适用于 Spark 1.4,它需要以下 Jar 文件:-
- Spark-Cassandra connector
- Cassandra Core driver
- Spark-Cassandra Java library
- 其他依赖 Jars - jodatime , jodatime-convert, jsr166
不用说,所有这些 jar 文件都应该配置并可供执行程序使用。
我是 Scala 的新手,正在尝试构建 Spark 作业。我构建了一个包含 DataStax 连接器的作业并将其组装到一个胖罐子中。当我尝试执行它时,它失败并显示 java.lang.NoSuchMethodError
。我打开了 JAR,可以看到其中包含 DataStax 库。我错过了一些明显的东西吗?关于这个过程有没有好的教程可以看?
谢谢
控制台 $ spark-submit --class org.bobbrez.CasCountJob ./target/scala-2.11/bobbrez-spark-assembly-0.0.1.jar ks tn ... 线程 "main" java.lang.NoSuchMethodError 中的异常:scala.runtime.ObjectRef.zero()Lscala/runtime/ObjectRef; 在 com.datastax.spark.connector.cql.CassandraConnector$.com$datastax$spark$connector$cql$CassandraConnector$$createSession(CassandraConnector.scala) 在 com.datastax.spark.connector.cql.CassandraConnector$$anonfun$2.apply(CassandraConnector.scala:148) ...
build.sbt
name := "soofa-spark"
version := "0.0.1"
scalaVersion := "2.11.7"
// additional libraries
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.0" % "provided"
libraryDependencies += "com.datastax.spark" %% "spark-cassandra-connector" % "1.5.0-M3"
libraryDependencies += "com.typesafe" % "config" % "1.3.0"
mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) =>
{
case m if m.toLowerCase.endsWith("manifest.mf") => MergeStrategy.discard
case m if m.startsWith("META-INF") => MergeStrategy.discard
case PathList("javax", "servlet", xs @ _*) => MergeStrategy.first
case PathList("org", "apache", xs @ _*) => MergeStrategy.first
case PathList("org", "jboss", xs @ _*) => MergeStrategy.first
case "about.html" => MergeStrategy.rename
case "reference.conf" => MergeStrategy.concat
case _ => MergeStrategy.first
}
}
CasCountJob.scala
package org.bobbrez
// Spark
import org.apache.spark.{SparkContext, SparkConf}
import com.datastax.spark.connector._
object CasCountJob {
private val AppName = "CasCountJob"
def main(args: Array[String]) {
println("Hello world from " + AppName)
val keyspace = args(0)
val tablename = args(1)
println("Keyspace: " + keyspace)
println("Table: " + tablename)
// Configure and create a Scala Spark Context.
val conf = new SparkConf(true)
.set("spark.cassandra.connection.host", "HOSTNAME")
.set("spark.cassandra.auth.username", "USERNAME")
.set("spark.cassandra.auth.password", "PASSWORD")
.setAppName(AppName)
val sc = new SparkContext(conf)
val rdd = sc.cassandraTable(keyspace, tablename)
println("Table Count: " + rdd.count)
System.exit(0)
}
}
Spark 1.6 的 Cassandra 连接器仍在开发中,尚未发布。
要将 Cassandra 与 Spark 集成,您需要 at-least 以下依赖项:-
- Spark-Cassandra 连接器 - 从 here 下载合适的版本
- Cassandra 核心驱动程序 - 从 here 下载合适的版本
- Spark-Cassandra Java 库 - 从 here 下载合适的版本
- 其他依赖 Jars - jodatime , jodatime-convert, jsr166
提到了相应版本的 Cassandra 库和 Spark 的映射here
显然,Spark 1.5 的 Cassandra 连接器也在开发中,您可能会看到一些兼容性问题。最稳定的 Cassandra 连接器版本适用于 Spark 1.4,它需要以下 Jar 文件:-
- Spark-Cassandra connector
- Cassandra Core driver
- Spark-Cassandra Java library
- 其他依赖 Jars - jodatime , jodatime-convert, jsr166
不用说,所有这些 jar 文件都应该配置并可供执行程序使用。