【问题标题】:Databricks Spark Cassandra connectivity throwing exception: com.datastax.driver.core.exceptions.NoHostAvailableExceptionDatabricks Spark Cassandra 连接抛出异常:com.datastax.driver.core.exceptions.NoHostAvailableException
【发布时间】:2020-04-27 11:48:09
【问题描述】:

我已在 Azure 虚拟机中安装 Cassandra DB,并希望通过 Azure Databricks 执行读/写操作。我正在查看 Databricks 官方 documentation,这对我的配置没有帮助。
我在下面分享我的代码和配置详细信息:

%sh
ping -c 2 vmname.westeurope.cloudapp.azure.com

收到的回复:

PING vmname.westeurope.cloudapp.azure.com (13.69.10.10): 56 data bytes
--- vmname.westeurope.cloudapp.azure.com ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss
// define the cluster name and cassandra host name
val sparkClusterName = "adbazewdobucluster"
val cassandraHostIP = "vmname.westeurope.cloudapp.azure.com"

dbutils.fs.put(s"/databricks/init/$sparkClusterName/cassandra.sh",
  s"""
     #!/usr/bin/bash
     echo '[driver]."spark.cassandra.connection.host" = "$cassandraHostIP"' >> /home/ubuntu/databricks/common/conf/cassandra.conf
   """.trim, true)

// setting IP of the Cassandra server
spark.conf.set("spark.cassandra.connection.host", "127.0.0.1")

//verify sparkconf is set properly
spark.conf.get("spark.cassandra.connection.host")

在 Spark 中应用所有配置后,我试图从位于 Cassandra DB 中的表中检索记录,这会引发异常。

val df = sqlContext
  .read
  .format("org.apache.spark.sql.cassandra")
  .options(Map( "table" -> "words_new", "keyspace" -> "test"))
  .load
df.explain

例外:

com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: /127.0.0.1:9042 (com.datastax.driver.core.exceptions.TransportException: [/127.0.0.1:9042] Cannot connect))

我已经检查了我的 Cassandra DB 正在运行,并且读/写操作直接正常工作。
所以我的问题是:我是否以正确的方式应用配置?如果不是这样,那么如何从 Databricks 笔记本访问 Cassandra。
我将 Scala 用于 Spark 框架,我的集群和驱动程序版本如下:

Databricks Runtime Version
6.2 (includes Apache Spark 2.4.4, Scala 2.11)

spark-cassandra-connector
com.datastax.spark:spark-cassandra-connector_2.11:2.4.1

cassandra version: 3.11.4

【问题讨论】:

  • Ping 也无法正常工作...100% packet loss
  • Apache Spark 2.4.4 应该使用:spark-cassandra-connector_2.11:2.4.4,顺便说一下
  • @cricket_007 让我重试.. 请告诉我连接的具体步骤。
  • @cricket_007 在 databricks 笔记本中显示了相同的输出:2 个数据包传输,0 个数据包接收,100% 数据包丢失
  • @cricket_007 我能看到的最高版本是:2.4.1 Scala 版本2.11

标签: apache-spark cassandra apache-spark-sql azure-databricks spark-cassandra-connector


【解决方案1】:

如果您在 Azure 上运行.. 确保将 broadcast_rpc_address 设置为公共 IP 地址或 dns 主机名,这些设置必须适合您 -

将 rpc 地址设置为连接到 VM 的网络接口的 ip 地址。在 Windows - Hyper V 接口上。

rpc_address: <**private ip** of your vm > 

将 rpc 地址广播到公共 ip,在这个 ip 上,外部客户端应该从端口 9042 上的 cassandra 获得响应

broadcast_rpc_address: <**public ip** or hostname.westeurope.cloudapp.azure.com>

默认监听地址为 localhost / 127.0.0.1

listen_address: **localhost**

【讨论】:

    【解决方案2】:

    根据您发布的输出,您将获得NoHostAvailableException,因为您正在连接到无法访问的localhost。那是因为您在此处将 C* 主机设置为 localhost

    spark.conf.set("spark.cassandra.connection.host", "127.0.0.1")
    

    你需要把它设置成这个值:

    val cassandraHostIP = "vmname.westeurope.cloudapp.azure.com"
    

    干杯!

    【讨论】:

    • 我将 connection.host 127.0.0.1 更新为 vmname.westeurope.cloudapp.azure.com 但得到了同样的异常。
    • @Stark 您需要启用 Azure VPC 以接受来自 Databricks 的流量吗?
    猜你喜欢
    • 2017-01-30
    • 2019-09-30
    • 1970-01-01
    • 2016-09-14
    • 2015-12-30
    • 1970-01-01
    • 2020-12-21
    • 2014-10-06
    • 2011-06-04
    相关资源
    最近更新 更多