我目前已经在谷歌云上部署了Spark和Cassandra的节点。虽然DataStax Spark Cassandra连接器在本地运行得很好。当在谷歌云上尝试同样的操作时,它会在连接中抛出错误。我确实尝试了各种排列和组合来运行Spark中cassandra的简单值检索代码,但都是徒劳的。部署在gcloud上的spark版本是1.1.0,而cassandra版本是3.0.0。我们使用相同的Spark版本制作了组装包。
def main(args: Array[String]): Unit = {
val conf = new SparkConf(true)
.set("spark.cassandra.connection.host", "104.197.133.174")
.set("spark.cassandra.auth.username", "cassandra")
.set("spark.cassandra.auth.password", "xxxxxxx");
val sc = new SparkContext("local", "test", conf)
val user_table = sc.cassandraTable("demo", "movieslist")
val movie_index = user_table.map(r => new moviesugg(r.getInt("userid"), r.getString("movie")))
val file_collect= user_table.collect()
file_collect.map(println(_))
我得到错误:-
Exception in thread "main" java.io.IOException: Failed to open native connection to Cassandra at {104.197.133.174}:9042
at com.datastax.spark.connector.cql.CassandraConnector$.com$datastax$spark$connector$cql$CassandraConnector$$createSession(CassandraConnector.scala:174)
Caused by: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: /104.197.133.174:9042 (com.datastax.driver.core.exceptions.InvalidQueryException: unconfigured table schema_keyspaces))
表模式键空间已经正确定义(在本地工作良好),我认为这更多是一个连接问题。我是Cassandra的新手,我想知道是否有任何人可以建议对Cassandra.yaml文件进行任何配置更改,以使代码正常工作。不过,我确实尝试过更改rpc_address和listen_address,但无济于事。
如有任何建议,我们将不胜感激。
看起来您正试图在公共IP上运行Cassandra。正如在另一篇文章中提到的,请确保Cassandra确实绑定到了公共IP(spark正在查看端口9042)。
假设这是真的,你还需要打开一个GCE防火墙规则(https://cloud.google.com/compute/docs/networking?hl=en#firewalls)以允许TCP:9042流量。即使Spark在GCE中的一个单独主机上运行,这也是必需的,因为您使用的是公共IP。
如果Cassandra和Spark都在同一台主机上运行,则可以使用localhost地址。或者,如果它们都在同一个谷歌云项目中的不同主机上运行,您应该能够使用专用10.x地址,并将Cassandra绑定到该专用地址。
首先检查端口是否实际打开。其次,考虑到这两个系统都有非常遥远的版本,即Spark(v1.0)和Cassandra(v3.0.0),这可能是本例中的主要问题。请检查此链接的版本兼容性:
https://github.com/datastax/spark-cassandra-connector#version-兼容性