我目前在Google云上部署了Spark和Cassandra的节点。虽然DataStax Spark Cassandra Connector在本地运行良好。在谷歌云上尝试相同时,它会引发连接错误。我确实尝试了各种排列和组合来运行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,但它没有帮助。
任何建议都将不胜感激。
答案 0 :(得分:1)
看起来你正试图在公共IP上运行Cassandra。正如另一篇文章所述,确保Cassandra确实绑定到公共IP(火花正在查看端口9042)。
假设这是真的,您还需要打开GCE防火墙规则(https://cloud.google.com/compute/docs/networking?hl=en#firewalls)以允许TCP:9042流量。即使Spark在GCE内的单独主机上运行,也需要这样做,因为您使用的是公共IP。
如果Cassandra和Spark都在同一主机上运行,则可以使用localhost地址。或者,如果它们都在同一个Google Cloud Project中的不同主机上运行,那么您应该能够使用私有10.x地址并让Cassandra绑定到该私有地址。
答案 1 :(得分:0)
首先检查端口是否实际打开。其次,鉴于你的系统都有非常遥远的版本,即Spark(v1.1.0)和Cassandra(v3.0.0),在这种情况下,这可能是你的主要问题。请查看此链接以获取版本兼容性:
https://github.com/datastax/spark-cassandra-connector#version-compatibility