2016-03-19 88 views
0

这是我build.sbt火花连接卡桑德拉,失败运开连接

name := "cassandra_test" 

version := "1.0" 

scalaVersion := "2.10.6" 

libraryDependencies ++= Seq("com.databricks" %% "spark-avro" % "2.0.1", 
"org.apache.spark" %% "spark-sql" % "1.6.0", 
"org.apache.spark" %% "spark-core" % "1.6.0", 
"com.datastax.spark" %% "spark-cassandra-connector" % "1.5.0") 

,我已经安装了3.2卡桑德拉(编辑:现在使用的2.1.12)中,YAML的内容,我相信,从我收集到的正确的:

rpc_address: 127.0.0.1 (EDIT: now 0.0.0.0) 
rpc_port: 9160 
start_rpc: true 
broadcast_rpc_address: 127.0.0.1 

我能够通过cqlsh启动会话,创建表格,查询和这样的。

然而,当我尝试使用火花方面,我总是得到:

java.io.IOException: Failed to open native connection to Cassandra at {127.0.0.1}:9160 

这些都是

import com.datastax.spark.connector._ 
import org.apache.spark.sql._ 
import org.apache.spark.SparkContext 
import org.apache.spark.SparkContext._ 
import org.apache.spark.SparkConf 
import org.apache.spark.sql._ 
import com.datastax.spark.connector._ 

object cassandra_test{ 

    def main(args: Array[String]){ 

    val conf = new SparkConf(true).set("spark.cassandra.connection.host", "127.0.0.1").set("spark.cassandra.connection.port", "9160") 
    val sc = new SparkContext("local", "Cassandra Connector Test", conf) 
    val rdd = sc.cassandraTable("test", "kv") 
    println(rdd.count) 
    } 
} 

我环顾四周,寻找答案,但我的我的Scala代码内容认为我已经涵盖了我见过的所有可能性。我也尝试替换实际IP地址的本地主机IP地址。这样做可以通过cqlsh连接,但不能通过spark。

还试图在设置conf时将“127.0.0.1”替换为“localhost”,但无济于事。

根据github页面,cassandra连接器似乎也是正确的版本。

没有更多的想法尝试不幸的事情!

什么可能是错的?

============================================= ========

编辑:所以我终于解决了这个问题。首先,我编译连接库在本地,这样我可以链接它作为一个jar文件,并打开它:

spark-shell --jars /mnt/spark-cassandra-connector/spark-cassandra-connector/target/scala-2.10/spark-cassandra-connector-assembly-1.6.0-M1-12-gc37bb3c.jar --master local 

注意--master local。这是失踪的重要部分。然后我会在shell中运行:

import org.apache.spark.SparkConf 
import org.apache.spark.SparkContext 
import org.apache.spark.SparkContext._ 
import org.apache.spark.sql 

sc.stop 
import com.datastax.spark.connector._ 
val conf = new SparkConf(true).set("spark.cassandra.connection.host","localhost") 
val rdd = sc.cassandraTable("test", "kv") 
println(rdd.count) 

这将总是失败不会对shell命令的--master当地一部分。

在Scala代码,这意味着改变conf的定义:

val conf = new SparkConf(true).set("spark.cassandra.connection.host", "localhost").setMaster("local") 

做的伎俩。

我仍然真的不明白发生了什么事情,如果有人愿意解释,那将是非常棒的。

+1

你可以用'本地[*]'而不是'本地'主'来尝试吗? –

+0

你的意思是这个吗? 'val sc = new SparkContext(“local [*]”,“Cassandra Connector Test”,conf)'不幸的是我得到了同样的错误:( – elelias

+1

也许尝试0.0.0.0作为RPC地址,然后重新启动Cassandra –

回答

1

您的工作和非工作代码之间的唯一区别是使用localhost而不是127.0.0.1作为密钥spark.cassandra.connection.host,这应该是问题的根源。

一个有点无关的提示:你可以启动spark-shell与国旗--packages com.datastax.spark:spark-cassandra-connector:1.6.0-M1避免编译罐子自己。

+0

你确定,因为我试了几次,直到我尝试过,它才开始工作。 – elelias

+0

那么你在第一个例子中明确地将主人设置为本地,以至于不能这样做。 –

1

Spark Cassandra连接器不支持Cassandra 3.2。您应该使用较低的版本,请参阅其GitHub repo的自述文件中的版本兼容性表。

+0

哦,我看到了,我误读了那张图表,我稍后重新安装并重试,并接受你的答案,谢谢。 – elelias

+0

我也会用1.5版本的连接器。不知道1.6.0-M1的状态是什么 –

+0

做了所有的改变,但仍然没有运气。我使用Cassandra 2.2和Spark 1.6以及1.5连接器。非常令人沮丧! – elelias