【问题标题】:NoSuchMethodError from spark-cassandra-connector with assembled jar来自带有组装罐子的 spark-cassandra-connector 的 NoSuchMethodError
【发布时间】:2016-04-11 01:36:22
【问题描述】:

我对 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 ... 线程“主”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)
  }
}

【问题讨论】:

  • 可能是因为连接器 1.5 支持 Spark 1.5 而不是 1.6。

标签: scala apache-spark sbt spark-cassandra-connector


【解决方案1】:

用于 Spark 1.6 的 Cassandra 连接器仍在开发中,尚未发布。

要将 Cassandra 与 Spark 集成,您至少需要以下依赖项:-

  1. Spark-Cassandra 连接器 - 从here 下载适当的版本
  2. Cassandra Core 驱动 - 从here 下载合适的版本
  3. Spark-Cassandra Java 库 - 从here 下载适当的版本
  4. 其他依赖的罐子 - jodatimejodatime-convertjsr166

相应版本的Cassandra Libraries和Spark的映射提到here

显然,用于 Spark 1.5 的 Cassandra 连接器也在开发中,您可能会看到一些兼容性问题。 Cassandra 连接器的最稳定版本适用于 Spark 1.4,它需要以下 Jar 文件:-

  1. Spark-Cassandra connector
  2. Cassandra Core driver
  3. Spark-Cassandra Java library
  4. 其他相关的罐子 - jodatimejodatime-convertjsr166

不用说,所有这些 jar 文件都应该被配置并可供执行者使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-10
    • 2016-02-16
    • 2017-08-06
    • 2015-09-14
    • 2018-09-17
    • 2010-10-31
    • 1970-01-01
    • 2019-10-28
    相关资源
    最近更新 更多