2016-01-06 3 views
1

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

Благодаря

консоли $ искровым представить --class org.bobbrez.CasCountJob ./target/scala-2.11/bobbrez-spark-assembly-0.0.1.jar кс т ... Исключение в теме "main" java.lang.NoSuchMethodError: scala.runtime.ObjectRef.zero() Lscala/runtime/ObjectRef; at com.datastax.spark.connector.cql.CassandraConnector $ .com $ datastax $ spark $ connector $ cql $ CassandraConnector $$ createSession (CassandraConnector.scala) at 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) 
    } 
} 
+0

Возможно, поскольку разъем 1.5 поддерживает Spark 1.5 a not 1.6. – zero323

ответ

5

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

Для Интегрирование Кассандру с искрой вам нужно по-крайней мере, следующие зависимости: -

  1. искровым Cassandra разъем - скачать соответствующую версию с here драйвера
  2. Cassandra ядра - Загрузить нужную версию с here
  3. Спарк -Cassandra Java library - Загрузить соответствующую версию от here
  4. Другие зависимые банки - jodatime, jodatime-convert, jsr166

Отображение соответствующей версии Cassandra библиотек и Спарк упоминаются here

Видимо разъем Cassandra для Спарк 1,5 также находится в стадии разработки, и вы можете увидеть некоторые проблемы совместимости. Наиболее стабильный выпуск разъема Cassandra для Спарк 1.4, которая требует следующие файлы Jar: -

  1. Spark-Cassandra connector
  2. Cassandra Core driver
  3. Spark-Cassandra Java library
  4. Другие зависимые Баночки - jodatime, jodatime-convert, jsr166

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

Смежные вопросы