【问题标题】:Cassandra timeout during read query at consistency LOCAL_ONECassandra 在一致性 LOCAL_ONE 的读取查询期间超时
【发布时间】:2016-03-17 00:45:35
【问题描述】:

我有一个单节点 cassandra 集群、32 核 CPU、32GB 内存和 3 个 SSD 的 RAID,总共大约 2.5TB。我还有另一台拥有 32 核和 32GB 内存的主机,我在其上运行 Apache Spark。

我在 cassandra 中有一个庞大的历史数据,可能有 600GB。每天大约有超过 100 万条来自 Kafka 的新记录。我需要每天查询这些新行。但卡桑德拉失败了。我很困惑。

我的Cassandra表方案是:

CREATE TABLE rainbow.activate ( rowkey text, qualifier text, act_date text, info text, log_time text, PRIMARY KEY (rowkey, qualifier) ) WITH CLUSTERING ORDER BY (qualifier ASC) AND bloom_filter_fp_chance = 0.01 AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}' AND comment = '' AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'} AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'} AND dclocal_read_repair_chance = 0.1 AND default_time_to_live = 0 AND gc_grace_seconds = 864000 AND max_index_interval = 2048 AND memtable_flush_period_in_ms = 0 AND min_index_interval = 128 AND read_repair_chance = 0.0 AND speculative_retry = '99.0PERCENTILE'; CREATE INDEX activate_act_date_idx ON rainbow.activate (act_date); CREATE INDEX activate_log_time_idx ON rainbow.activate (log_time);

因为源数据可能包含一些重复数据,所以我需要使用主键来删除重复记录。这张表有两个索引,act_date 是一个日期字符串,如'20151211',log_time 是一个日期时间字符串,如'201512111452',即log_time 将记录分隔得更细。

如果我使用 log_time 选择记录,cassandra 可以工作。但使用 act_date 失败。

首先,触发作业退出并出现错误:

java.io.IOException: Exception during execution of SELECT "rowkey", "qualifier", "info" FROM "rainbow"."activate" WHERE token("rowkey") > ? AND token("rowkey") <= ? AND log_time = ? ALLOW FILTERING: All host(s) tried for query failed (tried: noah-cass01/192.168.1.124:9042 (com.datastax.driver.core.OperationTimedOutException: [noah-cass01/192.168.1.124:9042] Operation timed out))

我尝试将 spark.cassandra.read.timeout_ms 增加到 60000。但该作业发布另一个错误如下:

java.io.IOException: Exception during execution of SELECT "rowkey", "qualifier", "info" FROM "rainbow"."activate" WHERE token("rowkey") > ? AND token("rowkey") <= ? AND act_date = ? ALLOW FILTERING: Cassandra timeout during read query at consistency LOCAL_ONE (1 responses were required but only 0 replica responded)

我不知道如何解决这个问题,我阅读了 spark-cassandra-connector 上的文档,但没有找到任何提示。

所以你想给一些建议来帮助我解决这个问题。

非常感谢!

【问题讨论】:

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


    【解决方案1】:

    听起来像是一个不寻常的设置。如果您有两台机器,将 Cassandra 配置为两个节点并在两个节点上运行 Spark 会更有效。这将分散数据负载,您将在两台机器之间产生更少的流量。

    每天摄取如此多的数据,然后查询任意范围的数据,这听起来像是一个定时炸弹。当您开始频繁出现超时错误时,这通常表明架构效率低下,Cassandra 无法以有效的方式完成您所要求的工作。

    我没有看到问题的具体原因,但我会考虑在分区键中添加另一个字段,例如日期,以便您可以将查询限制在较小的数据子集。

    【讨论】:

    • 我需要删除一些重复数据,所以我需要设置一个特殊的主键。如果我将日期设置为分区键,或者我不知道是否应该将新数据插入 Cassandra。
    • 还有。很奇怪,我的 Cassandra 笔记有 3 个 SSD 的 RAID,支持大约 1 GB/秒的读取速度。但是当我的工作开始时,我看不到磁盘上的任何读取在 Linux 中使用“iotop”。工作是否开始让我感到困惑。
    • Cassandra 确实写入内存。只有当一个 memtable 填满时,它才会刷新到磁盘。
    猜你喜欢
    • 2018-11-27
    • 2021-12-14
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 2018-04-14
    • 1970-01-01
    • 2015-11-26
    相关资源
    最近更新 更多