2014-12-04 78 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)

存在进一步的步骤没有其他变化。 希望它也能为你工作。

相关问题