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

时间:2015-12-11 07:04:11

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

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

我在cassandra中有大量的历史数据,可能是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);

因为源数据可能包含一些重复数据,所以我需要使用主键删除重复记录。这个表上有两个索引,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 :(得分:0)

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

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

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