首页 文章

在一致性LOCAL_ONE的读取查询期间,Cassandra超时

提问于
浏览
1

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

我在cassandra有一个巨大的历史数据,可能是600GB . 每天有大约100多万条记录来自 Kafka . 我需要每天查询这些新行 . 但 Cassandra 失败了 . 我糊涂了 .

我的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上的文档,但我没有找到任何提示 .

那么你想给我一些建议来帮助我解决这个问题 .

非常感谢!

1 回答

  • 0

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

    每天摄取如此多的数据,然后查询它的任意范围听起来像一个滴答作响的定时炸弹 . 当您开始经常出现错误时,通常会出现效率低下的模式,而Cassandra无法以高效的方式完成您的要求 .

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

相关问题