Apache spark 找不到cassandra表的计数(*)抛出一致性本地_ONE(需要1个响应,但只响应0个副本)

Apache spark 找不到cassandra表的计数(*)抛出一致性本地_ONE(需要1个响应,但只响应0个副本),apache-spark,apache-spark-sql,datastax,datastax-enterprise,databricks,Apache Spark,Apache Spark Sql,Datastax,Datastax Enterprise,Databricks,我有一个场景,可以使用spark-sql将数据写入cassandra表。 我有一个3节点的cassandra集群。 我创建了复制因子为2的表,如下所示: CREATE TABLE keyspaceRf2. c_columnar ( id int, company_id int, dd date, c_code text, year int, quarter int, etc ....etc... PRIMARY KEY

我有一个场景,可以使用spark-sql将数据写入cassandra表。 我有一个3节点的cassandra集群。 我创建了复制因子为2的表,如下所示:

CREATE TABLE keyspaceRf2. c_columnar (
    id int,
    company_id int,
    dd date,
    c_code text,
     year int,
     quarter int,
        etc ....etc...
    PRIMARY KEY (( id,  year,  quarter), dd, c_code, company_id )
) WITH CLUSTERING ORDER BY ( dd DESC, c_code DESC, company_id DESC);

我正在尝试将数据插入keyspaceRf2。在spark群集上使用spark作业的c_列表。 正在正确插入的数据。 但为了验证插入到表中的记录数,我运行了一个计数查询,如下所示

 val countDf = loadFromCassandra(c_reader,"keyspaceRf2", " c_columnar");

println ( " count = " + countDf.count()


def loadFromCassandra( c_reader: DataFrameReader , keyspace: String , col_Name:String): DataFrame = {

        c_reader
        .options(Map( "table" -> col_Name, "keyspace" -> keyspace ))
        .load()
  }

当执行上述代码时,它抛出如下错误

错误:

TaskSetManager:66 - Lost task 33.0 in stage 18.0 : java.io.IOException: Exception during execution of SELECT count(*) FROM "keyspaceRf2"." c_columnar" WHERE token("id", " year", " quarter") > ? AND token("id", " year", " quarter") <= ?   ALLOW FILTERING: Cassandra failure during read query at consistency LOCAL_ONE (1 responses were required but only 0 replica responded, 1 failed)
        at com.datastax.spark.connector.rdd.CassandraTableScanRDD.com$datastax$spark$connector$rdd$CassandraTableScanRDD$$fetchTokenRange(CassandraTableScanRDD.scala:350)
        at com.datastax.spark.connector.rdd.CassandraTableScanRDD$$anonfun$17.apply(CassandraTableScanRDD.scala:367)
        at com.datastax.spark.connector.rdd.CassandraTableScanRDD$$anonfun$17.apply(CassandraTableScanRDD.scala:367)
        at scala.collection.Iterator$$anon$12.nextCur(Iterator.scala:434)
        at scala.collection.Iterator$$anon$12.hasNext(Iterator.scala:440)
        at com.datastax.spark.connector.util.CountingIterator.hasNext(CountingIterator.scala:12)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
Caused by: com.datastax.driver.core.exceptions.ReadFailureException: Cassandra failure during read query at consistency LOCAL_ONE (1 responses were required but only 0 replica responded, 1 failed)
        at com.datastax.driver.core.exceptions.ReadFailureException.copy(ReadFailureException.java:85)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at com.datastax.spark.connector.cql.SessionProxy.invoke(SessionProxy.scala:37)
        at com.sun.proxy.$Proxy23.execute(Unknown Source)
        at com.datastax.spark.connector.cql.DefaultScanner.scan(Scanner.scala:34)
        at com.datastax.spark.connector.rdd.CassandraTableScanRDD.com$datastax$spark$connector$rdd$CassandraTableScanRDD$$fetchTokenRange(CassandraTableScanRDD.scala:342)
        ... 15 more
TaskSetManager:66-在阶段18.0中丢失任务33.0:java.io.IOException:执行“keyspaceRf2”中的SELECT count(*)时发生异常。“c_columnar”其中标记(“id”、“年份”、“季度”)>?和令牌(“id”、“年份”、“季度”)请仔细检查:

  • 键空间复制设置-复制因子是在键空间而不是表上设置的。确保针对群集拓扑使用正确的复制策略。在多DC集群中使用默认的
    SimpleStrategy
    几乎总是错误的。另一个错误是当本地DC中甚至没有一个副本时,使用
    LOCAL\u ONE
    而不是
    ONE
    CL。本地DC中的任何副本都可能是由于在
    NetworkTopologyStrategy
    选项中忘记或拼写错误DC名称,或者使用
    SimpleStrategy
    而导致的,后者可能决定在另一个DC中存储特定范围的所有副本
  • 集群中节点的状态-计数查询可能需要访问多个节点。检查群集运行状况。检查所有节点是否处于UN状态(向上,正常)
  • 您要连接到的节点位于正确的DC中-对于多DC群集和本地一致性级别,连接到正确的DC非常重要
请仔细检查:

  • 键空间复制设置-复制因子是在键空间而不是表上设置的。确保针对群集拓扑使用正确的复制策略。在多DC集群中使用默认的
    SimpleStrategy
    几乎总是错误的。另一个错误是当本地DC中甚至没有一个副本时,使用
    LOCAL\u ONE
    而不是
    ONE
    CL。本地DC中的任何副本都可能是由于在
    NetworkTopologyStrategy
    选项中忘记或拼写错误DC名称,或者使用
    SimpleStrategy
    而导致的,后者可能决定在另一个DC中存储特定范围的所有副本
  • 集群中节点的状态-计数查询可能需要访问多个节点。检查群集运行状况。检查所有节点是否处于UN状态(向上,正常)
  • 您要连接到的节点位于正确的DC中-对于多DC群集和本地一致性级别,连接到正确的DC非常重要

感谢您的快速回复,1)是的,复制系数是在键空间上设置的,而不是在表上设置的。2) 我正在使用的这个集群位于单个DC上3)键空间跟随'SimpleStrategy',如下所示创建键空间Keyspace keyspaceRf2,持久写入=true,复制={'class':'SimpleStrategy','replication_factor':2};4) 检查了CL中节点的状态,所有节点都已启动并正在运行5)我只有一个DC,所有节点/连接都连接相同。非常有趣的是,我可以使用“选择查询”查询数据,但不能使用计数(*)查询。@Piotr Kołaczkowski,你是说日志级调试?cassandra side我不知道怎么做。感谢您的快速回复,1)是的,复制因子是在键空间而不是表上设置的。2) 我正在使用的这个集群位于单个DC上3)键空间跟随'SimpleStrategy',如下所示创建键空间Keyspace keyspaceRf2,持久写入=true,复制={'class':'SimpleStrategy','replication_factor':2};4) 检查了CL中节点的状态,所有节点都已启动并正在运行5)我只有一个DC,所有节点/连接都连接相同。非常有趣的是,我可以使用“选择查询”查询数据,但不能使用计数(*)查询。@Piotr Kołaczkowski,你是说日志级调试?卡桑德拉:我不知道怎么做。