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



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

我在卡桑德拉有一个巨大的历史数据,可能是600GB。每天大约有100多万张来自卡夫卡的新唱片。我需要每天查询这些新行。但卡桑德拉失败了。我很困惑。

我的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);

因为源数据可能包含一些重复的数据,所以我需要使用主键来删除重复的记录。这个表上有两个索引,actdate是一个类似"20151211"的日期字符串,logtime是一个像"201512111452"的日期时间字符串,也就是说logtime将记录分隔得更精细。

如果我使用logtime选择记录,那么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连接器的文档,但没有找到任何提示。

那么你能给我一些建议来帮助我解决这个问题吗。

非常感谢!

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

每天获取如此多的数据,然后查询任意范围的数据,听起来就像一颗滴答作响的定时炸弹。当你开始频繁地出现超时错误时,这通常是一个低效模式的标志,即Cassandra无法以有效的方式完成你的要求。

我看不出问题的具体原因,但我会考虑在分区键中添加另一个字段,例如day,这样您就可以将查询限制在数据的较小子集内。

相关内容

  • 没有找到相关文章

最新更新