【问题标题】:Why does cassandra count query using "allow filtering" when being executed without mentioning it in my code?为什么 cassandra 在执行时使用“允许过滤”计算查询而不在我的代码中提及它?
【发布时间】:2020-01-01 17:10:06
【问题描述】:

我正在使用 spark-sql-2.4.1 ,spark-cassandra-connector_2.11-2.4.1 和 java8。

我正在做如下简单的查询来获取 C* 表的行数。

JavaSparkContext sc = new JavaSparkContext(spark.sparkContext());
long recCount = javaFunctions(sc).cassandraTable(keyspace, columnFamilyName).cassandraCount();

但它正在超时并出现以下错误。

java.io.IOException: Exception during execution of SELECT count(*) FROM "radata"."model_vals" WHERE token("model_id", "type", "value", "code") > ? AND token("model_id", "type", "value", "code") <= ?   ALLOW FILTERING: Cassandra timeout during read query at consistency LOCAL_ONE (1 responses were required but only 0 replica responded)
    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)

Caused by: com.datastax.driver.core.exceptions.ReadTimeoutException: Cassandra timeout during read query at consistency LOCAL_ONE (1 responses were required but only 0 replica responded)

我正在使用具有以下设置的 Cassandra 6 节点集群:

 cassandra.output.consistency.level=ANY
cassandra.concurrent.writes=1500
cassandra.output.batch.size.bytes=2056
cassandra.output.batch.grouping.key=partition 
cassandra.output.batch.grouping.buffer.size=3000
cassandra.output.throughput_mb_per_sec=128
cassandra.connection.keep_alive_ms=30000
cassandra.read.timeout_ms=600000

1) 为什么在解释之前附加“ALLOW FILTERING” 实际执行?

2) 即使我设置了“cassandra.output.consistency.level=ANY”为什么会这样 使用“一致性 LOCAL_ONE”执行?

如何解决这些问题?

【问题讨论】:

    标签: cassandra apache-spark-sql datastax-java-driver


    【解决方案1】:
    1. ALLOW FILTERING 被 Spark-Cassandra 连接器隐式添加到生成的 CQL 查询中。

    2. 为每个查询设置一致性级别,并在 Spark 端设置。你可以使用

    spark.cassandra.input.consistency.level=ANY

    Spark 配置上。

    但是更改一致性级别对您没有帮助,因为您只有一个 Cassandra 节点没有响应。我建议您的表非常大,并且 Cassandra 计算计数所花费的时间比任何超时参数都多。可以在客户端的每个查询中设置此参数。在您的情况下,您可以查看 Spark-Cassandra 连接器配置:https://github.com/datastax/spark-cassandra-connector/blob/master/doc/reference.md

    另一种方法是在 Spark 端计算计数并将 .count() 而不是 .cassandraCount() 。根据我的经验,我建议在生产中避免在 Cassandra 端进行任何聚合。特别是当您使用 Spark - 专为此类任务设计的框架时。

    【讨论】:

    • "你的意思是我需要使用 spark .read() .format("org.apache.spark.sql.cassandra") .option("table", columnFamilyName) .option("keyspace" ,keyspace ) .load().count() ?? " 其实是的。
    猜你喜欢
    • 2021-09-10
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 2016-08-14
    • 2015-02-12
    • 1970-01-01
    • 2017-07-23
    相关资源
    最近更新 更多