我有一个单节点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上的文档,但我没有找到任何提示。
所以你想提出一些建议来帮助我解决这个问题。
非常感谢!
答案 0 :(得分:0)
听起来像一个不寻常的设置。如果您有两台计算机,将Cassandra配置为两个节点并在两个节点上运行Spark会更高效。这会分散数据负载,并且您可以在两台计算机之间产生更少的流量。
每天摄取如此多的数据,然后查询它的任意范围听起来就像是定时炸弹。当您开始经常出现错误时,通常会出现效率低下的模式,而Cassandra无法以有效的方式完成您的要求。
我没有看到问题的具体原因,但我会考虑在分区键中添加另一个字段,例如当天,以便您可以将查询限制为较小的数据子集。