NoSuchMethodError от коннектора spark-cassandra с собранной банкой

Я новичок в Scala и пытаюсь создать работу Spark. Я создал задание, содержащее коннектор DataStax, и собрал его в толстую банку. Когда я пытаюсь выполнить его, он терпит неудачу с java.lang.NoSuchMethodError. Я взломал JAR и увидел, что библиотека DataStax включена. Я упускаю что-то очевидное? Есть ли хороший учебник, чтобы посмотреть на этот процесс?

Спасибо

console $ 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. применить (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)
  }
}

person BobBrez    schedule 06.01.2016    source источник
comment
Вероятно, потому что разъем 1.5 поддерживает Spark 1.5, а не 1.6.   -  person zero323    schedule 06.01.2016


Ответы (1)


Соединитель Cassandra для Spark 1.6 все еще находится в разработке и еще не выпущен.

Для интеграции Cassandra со Spark вам понадобятся как минимум следующие зависимости: -

  1. Коннектор Spark-Cassandra — загрузите соответствующую версию с здесь
  2. Драйвер Cassandra Core — загрузите соответствующую версию с здесь
  3. Библиотека Java Spark-Cassandra — загрузите соответствующую версию с здесь
  4. Другие зависимые банки — jodatime, jodatime-convert, jsr166

Сопоставление соответствующих версий библиотек Cassandra и Spark указано здесь

Очевидно, коннектор Cassandra для Spark 1.5 также находится в разработке, и вы можете столкнуться с некоторыми проблемами совместимости. Самый стабильный выпуск соединителя Cassandra предназначен для Spark 1.4, для которого требуются следующие файлы Jar: -

  1. Коннектор Spark-Cassandra
  2. Драйвер Cassandra Core
  3. Библиотека Java Spark-Cassandra
  4. Другие зависимые банки — jodatime, jodatime-convert, jsr166

Излишне упоминать, что все эти jar-файлы должны быть настроены и доступны исполнителям.

person Sumit    schedule 07.01.2016