【问题标题】:Cannot connect to Cassandra from Spark (Contact points contain multiple data centers)无法从 Spark 连接到 Cassandra(接触点包含多个数据中心)
【发布时间】:2016-03-04 11:08:19
【问题描述】:

我正在尝试运行我的第一个 spark 作业(访问 Cassandra 的 Scala 作业)失败并显示以下错误:

java.io.IOException: Failed to open native connection to Cassandra at {<ip>}:9042
at com.datastax.spark.connector.cql.CassandraConnector$.com$datastax$spark$connector$cql$CassandraConnector$$createSession(CassandraConnector.scala:164)
at com.datastax.spark.connector.cql.CassandraConnector$$anonfun$2.apply(CassandraConnector.scala:150)
at com.datastax.spark.connector.cql.CassandraConnector$$anonfun$2.apply(CassandraConnector.scala:150)
at com.datastax.spark.connector.cql.RefCountedCache.createNewValueAndKeys(RefCountedCache.scala:31)
...........
............
Caused by: java.lang.IllegalArgumentException: Contact points contain multiple data centers: 
at com.datastax.spark.connector.cql.LocalNodeFirstLoadBalancingPolicy.init(LocalNodeFirstLoadBalancingPolicy.scala:47)
at com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1099)
at com.datastax.driver.core.Cluster.getMetadata(Cluster.java:271)
at com.datastax.spark.connector.cql.CassandraConnector$.com$datastax$spark$connector$cql$CassandraConnector$$createSession(CassandraConnector.scala:157)

我们在这里做错了什么?

我正在使用:

【问题讨论】:

  • C* 集群中有多少台机器和数据中心。只有当接触点跨越多个数据中心并且驱动程序无法确定“本地”数据中心是什么时,才会发生这种情况。这有助于连接器避免跨 DC 流量。
  • 感谢 RussS 的回复。我们有一个数据中心,而 cassandra 有 3 个节点集群。 Spark 有一个 4 节点集群(使用 hadoop 1-master 3 数据节点运行)。 spark和cassandra都运行在不同的节点
  • 您是否将 --conf spark.cassandra.connection.host 设置为一个(或多个)C* 节点?
  • 感谢 Russ 的回复,我想我遇到了问题,它一定是 jar /classpath 冲突。我已经从 spark-shell 执行了示例代码并一一加载了依赖 jar,代码已经检测到了 cassandra 集群和节点。我计划对有问题的火花作业执行相同的步骤。我会更新你。谢谢
  • 嗨 Russ,这个问题是特定于谷歌云平台的 dataproc。我能够在另一个独立的 spark 集群中执行相同的作业。

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


【解决方案1】:

--> 根据作者的说法,正在进行一项解决此问题的工作。请参阅此答案下方的 cmets。

我在文档中找到了这个,希望对你有帮助:

override def init(cluster: Cluster, hosts: JCollection[Host]) {
    nodes = hosts.toSet
    // use explicitly set DC if available, otherwise see if all contact points have same DC
    // if so, use that DC; if not, throw an error
    dcToUse = localDC match { 
      case Some(local) => local
      case None => 
        val dcList = dcs(nodesInTheSameDC(contactPoints, hosts.toSet))
        if (dcList.size == 1) 
            dcList.head
        else 
            throw new IllegalArgumentException(s"Contact points contain multiple data centers: ${dcList.mkString(", ")}")
    }
    clusterMetadata = cluster.getMetadata
}

【讨论】:

  • 感谢 Fundhor,我已经检查过此代码。如果您仔细查看异常消息字符串,它不会打印任何清楚显示大小为 0 的数据。代码在检测 DC 时遇到问题。正如我上面提到的,这似乎是一个类路径问题。我正在尝试分析依赖关系。
  • 我在 AWS EMR Cassandra(多个 DC)上运行 Spark 作业时遇到了同样的问题。 @vimeghan:这个问题有什么更新吗? tks.
  • 原来这是 Spark-Cassandra-Connector 本身的问题,int class LocalNodeFirstLoadBalancingPolicy.scala (github.com/datastax/spark-cassandra-connector/blob/master/…)。有一个拉取请求来解决这个问题(链接:github.com/datastax/spark-cassandra-connector/pull/1140),但是这个拉取还没有合并。希望这个问题能很快得到解决。
【解决方案2】:

我在尝试使用 Apache Spark 2.x.x 连接两个 Cassandra 数据中心时遇到了同样的问题。

public class  SparkCassandraTest {  
  private static final String CASSANDRA_ENDPOINTS = "DC1_node1,DC1_node2,DC1_node3,DC2_node1,DC2_node2,DC2_node3";

  public static void main(String[] args) {
        sparkConf = new SparkConf().setAppName(APP_NAME);
        sparkConf.set("spark.cassandra.connection.host", CASSANDRA_ENDPOINTS);
        sparkConf.set("spark.cassandra.auth.username", CASSANDRA_USERNAME);
        sparkConf.set("spark.cassandra.auth.password", CASSANDRA_PASSWORD);
        sparkSession = SparkSession.builder().config(sparkConf).enableHiveSupport().getOrCreate();

        //.....................
        //.....................
        //.....................
       }
}

原因:java.lang.IllegalArgumentException:要求失败:接触点包含多个数据中心:DC2-XXXXX2、DC1-XXXXX1

我通过连接任何一个 Cassandra 数据中心(DC1_node1DC1_node2DC1_node3)或(DC2_node1)来解决此问题强>、DC2_node2DC2_node3)。

【讨论】:

  • Saho - 你找到解决方案了吗?我也面临着完全相同的问题,当我只添加一个数据中心时它可以工作。
  • 我只能连接一个 Cassandra 数据中心,即 (DC1_node1,DC1_node2,DC1_node3)。
  • Spark 不允许连接多个 Cassandra 数据中心。
  • 这是 Spark 的限制吗?对我来说,这似乎是个大问题。
猜你喜欢
  • 2021-11-25
  • 2015-10-31
  • 2016-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 2023-03-14
相关资源
最近更新 更多