【问题标题】:Unable to find the count(*) of cassandra table throwing consistency LOCAL_ONE (1 responses were required but only 0 replica responded)无法找到 cassandra 表抛出一致性 LOCAL_ONE 的计数(*)(需要 1 个响应,但只有 0 个副本响应)
【发布时间】:2019-06-05 17:57:47
【问题描述】:

我有一个使用 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-cluster 上使用 spark-job 的 c_columnar 表。 正确插入的数据。 但是为了验证插入到表中的记录数,我正在运行如下计数查询

 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

我在这里做错了什么?

【问题讨论】:

    标签: apache-spark apache-spark-sql datastax datastax-enterprise databricks


    【解决方案1】:

    请仔细检查:

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

    【讨论】:

    • 感谢您的快速回复,1) 是的,复制因子是在键空间上设置的,而不是在表上。 2)我正在使用的这个集群位于单个 DC 3)密钥空间遵循 'SimpleStrategy' 如下所示 CREATE KEYSPACE keyspaceRf2 WITH Durable_writes = true AND replication = { 'class' : 'SimpleStrategy', 'replication_factor' : 2 }; 4) 检查 CL 中节点的状态,所有节点都已启动并运行 5) 我只有一个 DC,所有节点/连接都连接相同。
    • 非常有趣的是,我可以使用“选择查询”查询数据,但不能使用 count(*) 查询。
    • @Piotr Kołaczkowski,你的意思是日志级别 DEBUG? cassandra方面我不知道该怎么做。
    猜你喜欢
    • 2018-04-14
    • 2015-11-26
    • 2020-10-23
    • 2015-11-10
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 2018-08-14
    • 2015-03-14
    相关资源
    最近更新 更多