Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 无法从Spark连接到Cassandra(接触点包含多个数据中心)_Scala_Apache Spark_Cassandra_Cassandra 2.0_Spark Cassandra Connector - Fatal编程技术网

Scala 无法从Spark连接到Cassandra(接触点包含多个数据中心)

Scala 无法从Spark连接到Cassandra(接触点包含多个数据中心),scala,apache-spark,cassandra,cassandra-2.0,spark-cassandra-connector,Scala,Apache Spark,Cassandra,Cassandra 2.0,Spark Cassandra Connector,我正在尝试运行我的第一个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$CassandraConnect

我正在尝试运行我的第一个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)
java.io.IOException:无法在{}:9042打开到Cassandra的本机连接
在com.datasax.spark.connector.cql.CassandraConnector$.com$datasax$spark$connector$cql$CassandraConnector$$createSession(CassandraConnector.scala:164)
在com.datastax.spark.connector.cql.CassandraConnector$$anonfun$2.apply上(CassandraConnector.scala:150)
在com.datastax.spark.connector.cql.CassandraConnector$$anonfun$2.apply上(CassandraConnector.scala:150)
在com.datastax.spark.connector.cql.RefCountedCache.createNewValueAndKeys(RefCountedCache.scala:31)上
...........
............
原因:java.lang.IllegalArgumentException:联系人包含多个数据中心:
位于com.datastax.spark.connector.cql.LocalNodeFirstLoadBalancingPolicy.init(LocalNodeFirstLoadBalancingPolicy.scala:47)
位于com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1099)
位于com.datastax.driver.core.Cluster.getMetadata(Cluster.java:271)
在com.datastax.spark.connector.cql.CassandraConnector$.com$datastax$spark$connector$cql$CassandraConnector$$createSession(CassandraConnector.scala:157)
我们做错了什么

我正在使用:

  • Spark 1.5.2
  • Apache Cassandra 2.1.10
  • /1.5.0-M2(两个接头都试过)
  • Scala版本2.10.4
-->据作者称,有一项工作正在进行中,以解决这一问题。请参阅下面的评论

我在文档中发现了这一点,希望它能帮助您:

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
}

我在尝试使用ApacheSpark2.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-XXXXX 2,DC1-XXXXX 1


我通过连接任意一个Cassandra数据中心(DC1\u节点1DC1\u节点2DC1\u节点3)或(DC2\u节点1DC2\u节点2DC2\u节点3)来解决此问题。

您的C*群集中有多少台机器和数据中心。只有当接触点跨越多个数据中心且驾驶员无法确定“本地”数据中心是什么时,才会发生这种情况。这有助于连接器避免交叉直流通信。感谢RussS的回复。我们只有一个数据中心,cassandra有3个节点的集群。Spark有一个4节点集群(与hadoop 1-master 3数据节点一起运行)。spark和cassandra都在不同的节点上运行,您是否已将--conf spark.cassandra.connection.host设置为一个(或多个)C*节点?感谢Russ的响应,我想我找到了问题所在,一定是jar/类路径冲突。我已经执行了spark shell的示例代码,并逐个加载了依赖项jar,代码检测到了cassandra集群和节点。我计划对有问题的spark作业执行相同的步骤。我会告诉你最新情况。感谢Russ,这个问题是针对谷歌云平台的dataproc的。我能够在另一个独立的spark集群中执行相同的任务。感谢Fundhor,我已经检查了此代码。如果仔细查看异常消息字符串,它不会打印任何清楚显示大小为0的数据。代码在检测DC时出现问题。正如我前面提到的,这似乎是一个类路径问题。我试图分析依赖关系。在AWS EMR Cassandra(多DC)上运行Spark作业时,我遇到了同样的问题@维梅根:这个问题有更新吗?事实证明,这是Spark Cassandra连接器本身的问题,int类LocalNodeFirstLoadBalancingPolicy.scala()。有一个拉取请求来修复此问题(链接:),但此拉取尚未合并。希望这个问题能很快得到解决。萨霍-你找到解决这个问题的办法了吗?我也面临着完全相同的问题,当我只添加了一个数据中心时,它就起作用了。我只能连接一个Cassandra数据中心,即(DC1_节点1、DC1_节点2、DC1_节点3)。Spark不允许连接多个Cassandra数据中心。这是Spark的限制吗?对我来说,这似乎是个大问题。