2014-12-04 121 views
0

我想用火花卡桑德拉連接器如下執行的火花項目連接到卡桑德拉:未能使用火花卡桑德拉連接器

版本:

  • 卡桑德拉:2.1。 2
  • CassandraDriver:2.1.3
  • 火花:1.1.0

build.sbt

name := "sparktest" 

version := "1.0" 

scalaVersion := "2.10.4" 

libraryDependencies += "com.datastax.spark" %% "spark-cassandra-connector" % "1.1.0" withSources() withJavadoc() 

sparkCassandra.scala

import com.datastax.spark.connector._ 
import org.apache.spark._ 

object SparkTest { 
    def main(args: Array[String]){ 
    val conf = new SparkConf(true).set("spark.cassandra.connection.host", "127.0.0.1") 
    val sc = new SparkContext("spark://master:7077", "test", conf) 

    val rdd = sc.cassandraTable("mykeyspace", "users") 
    println(rdd.count) 
    } 
} 

但是當我通過

spark-submit --class "SparkTest" target/scala-2.10/sparktest_2.10-1.0.jar 

實施這個項目它發生錯誤

Exception in thread "main" java.io.IOException: Failed to open thrift connection to Cassandra at 127.0.0.1:9160 
     at com.datastax.spark.connector.cql.CassandraConnector.createThriftClient(CassandraConnector.scala:132) 
     at com.datastax.spark.connector.cql.CassandraConnector.createThriftClient(CassandraConnector.scala:138) 
     at com.datastax.spark.connector.cql.CassandraConnector.withCassandraClientDo(CassandraConnector.scala:144) 
     at com.datastax.spark.connector.rdd.partitioner.CassandraRDDPartitioner.partitions(CassandraRDDPartitioner.scala:158) 
     at com.datastax.spark.connector.rdd.CassandraRDD.getPartitions(CassandraRDD.scala:294) 
     at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:204) 
     at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:202) 
     at scala.Option.getOrElse(Option.scala:120) 
     at org.apache.spark.rdd.RDD.partitions(RDD.scala:202) 
     at org.apache.spark.SparkContext.runJob(SparkContext.scala:1135) 
     at org.apache.spark.rdd.RDD.count(RDD.scala:904) 
     at SparkTest$.main(sparkcassandra.scala:14) 
     at SparkTest.main(sparkcassandra.scala) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:606) 
     at org.apache.spark.deploy.SparkSubmit$.launch(SparkSubmit.scala:328) 
     at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:75) 
     at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala) 
Caused by: java.lang.NoSuchMethodError: org.apache.cassandra.thrift.TFramedTransportFactory.openTransport(Ljava/lang/String;I)Lorg/apache/thrift/transport/TTransport; 
     at com.datastax.spark.connector.cql.DefaultConnectionFactory$.createThriftClient(CassandraConnectionFactory.scala:47) 
     at com.datastax.spark.connector.cql.CassandraConnector.createThriftClient(CassandraConnector.scala:127) 
     ... 19 more 

我發現如果我輸入錯誤的表名,它會說「表未找到」 看來連接成功了。

但是,當我使用cassandra表rdd時會導致上述錯誤。 我不明白這個錯誤的原因,如果有人可以幫助我?非常感謝!

+0

只要試一下'telnet 127.0.0.1 9160' - >你有連接嗎? – maasg 2014-12-04 11:55:34

+0

它表示: 「試圖127.0.0.1 ... 連接到127.0.0.1 轉義字符是 '^]' 。」 – 2014-12-05 01:33:17

+0

如果start_rpc:在YAML文件false,那麼它是真的 – 2015-11-17 05:00:42

回答

0

我認爲你的cassandra沒有在9160端口上運行。你可以在cassandra.yaml文件中驗證它,並且使用telnet 127.0.0.1 9160驗證它,並且看到它可以telnet到這個端口。

+0

它表示:「試圖127.0。 0.1 ... 連接到127.0.0.1。 轉義字符是'^]'。「 – 2014-12-05 01:34:12

+0

但是我很困惑」由java.lang.NoSuchMethodError引起的困惑:org.apache.cassandra.thrift.TFramedTransportFactory。openTransport(Ljava /郎/字符串; I)Lorg /阿帕奇/節儉/運輸/ TTransport; 「 – 2014-12-05 01:35:27

+0

這個錯誤是否也意味着我的cassandra端口不工作? – 2014-12-05 01:36:38

0

我以前遇到過保存問題。 此錯誤是由Cassandra驅動程序和主機之間的版本不匹配引起的。 因此,檢查是否已將較低版本的Cassandra驅動程序包含在spark-application-jar中。 在這種情況下,您應該使用Cassandra驅動程序2.1.x.

0

解決這個問題有兩個更正:本地主機的IP,而不是

  1. 使用。
  2. val sc = new SparkContext(conf)

存在進一步的步驟沒有其他變化。 希望它也能爲你工作。

相關問題