火花连接到cassandra,失败op开放连接

时间:2016-03-19 10:45:32

标签: scala apache-spark cassandra spark-cassandra-connector

这是我的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")

我安装了Cassandra 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启动会话,创建表格,查询等。

然而,当我尝试使用spark连接时,我总是得到:

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

这些是我的scala代码的内容

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)
   }
}

我四处寻找答案,但我想我已经涵盖了我所见过的所有可能性。我还尝试将localhost IP地址替换为实际的IP地址。这样做我可以通过cqlsh连接,但不能通过spark连接。

还尝试更换" 127.0.0.1"与" localhost"设置conf时,但无济于事。

根据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 local 部分,那么总会失败。

在scala代码上,这意味着将conf的定义更改为:

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

也做了伎俩。

我仍然真的不明白正在发生什么,如果有人愿意解释,那就太棒了。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您的工作代码和非工作代码之间的唯一区别是使用localhost代替127.0.0.1代码spark.cassandra.connection.host,这应该是您问题的根本原因。

有些不相关的提示:您可以使用标记spark-shell启动--packages com.datastax.spark:spark-cassandra-connector:1.6.0-M1,以避免自行编译jar。