【问题标题】:spark connection to cassandra, fail op open connection与 cassandra 的火花连接,失败的操作打开连接
【发布时间】:2016-03-20 20:40:53
【问题描述】:

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

我已经四处寻找答案,但我认为我已经涵盖了我所看到的所有可能性。我还尝试将本地 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 local 部分,这总是会失败。

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

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

也成功了。

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

【问题讨论】:

  • 你能用local[*]代替local master吗?
  • 您的意思是对吗? ` val sc = new SparkContext("local[*]", "Cassandra Connector Test", conf)` 不幸的是我得到了同样的错误:(
  • 也许尝试 0.0.0.0 作为 RPC 地址,然后重启 Cassandra
  • 它拒绝使用该设置启动 :( 显然你可以将它设置为 other 除了 0.0.0.0

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


【解决方案1】:

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

一个有点不相关的提示:您可以使用标志 --packages com.datastax.spark:spark-cassandra-connector:1.6.0-M1 启动 spark-shell 以避免自己编译 jar。

【讨论】:

  • 你确定吗,因为我试了好几次,直到我试了它才奏效。
  • 好吧,在第一个示例中,您也清楚地将 master 设置为本地,所以不可能。
【解决方案2】:

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

【讨论】:

  • 哦,我明白了,我看错了那个图表。稍后我会重新安装并重试并接受您的回答,谢谢。
  • 我也会使用 1.5 版本的连接器。不确定 1.6.0-M1 上的状态是什么
  • 进行了所有更改,但仍然没有运气。我将 Cassandra 2.2 与 Spark 1.6 和 1.5 连接器一起使用。非常沮丧!
  • 是的,没问题Connected to Test Cluster at 127.0.0.1:9160. [cqlsh 4.1.1 | Cassandra 2.1.12 | CQL spec 3.1.1 | Thrift protocol 19.39.0]
  • 您能否将整个堆栈跟踪复制到您的问题中?
猜你喜欢
  • 2016-12-09
  • 2016-07-30
  • 2016-05-01
  • 2018-08-18
  • 1970-01-01
  • 2017-06-06
  • 2020-01-21
  • 2021-08-04
相关资源
最近更新 更多