2016-07-25 93 views
1

我们有一个表,看起来像:卡桑德拉性能问题

CREATE TABLE arc_dynamic.transit_map (
    sal text, 
    pfn text, 
    transit_map_id text, 
    create_program_id text, 
    create_timestamp timestamp, 
    cutoff_times map<text, text>, 
    derived_priority int, 
    effective_date text, 
    modify_program_id text, 
    modify_timestamp timestamp, 
    relationship_type_id text, 
    solr_query text, 
    stop set<text>, 
    transit_days map<text, int>, 
    trigger_id text, 
    PRIMARY KEY (sal, pfn, transit_map_id) 
) WITH CLUSTERING ORDER BY (pfn ASC, transit_map_id 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 CUSTOM INDEX arc_dynamic_transit_map_create_timestamp_index ON arc_dynamic.transit_map (create_timestamp) USING 'com.datastax.bdp.search.solr.Cql3SolrSecondaryIndex'; 
CREATE CUSTOM INDEX arc_dynamic_transit_map_derived_priority_index ON arc_dynamic.transit_map (derived_priority) USING 'com.datastax.bdp.search.solr.Cql3SolrSecondaryIndex'; 
CREATE CUSTOM INDEX arc_dynamic_transit_map_modify_timestamp_index ON arc_dynamic.transit_map (modify_timestamp) USING 'com.datastax.bdp.search.solr.Cql3SolrSecondaryIndex'; 
CREATE CUSTOM INDEX arc_dynamic_transit_map_relationship_type_id_index ON arc_dynamic.transit_map (relationship_type_id) USING 'com.datastax.bdp.search.solr.Cql3SolrSecondaryIndex'; 
CREATE CUSTOM INDEX arc_dynamic_transit_map_solr_query_index ON arc_dynamic.transit_map (solr_query) USING 'com.datastax.bdp.search.solr.Cql3SolrSecondaryIndex'; 
CREATE CUSTOM INDEX arc_dynamic_transit_map_trigger_id_index ON arc_dynamic.transit_map (trigger_id) USING 'com.datastax.bdp.search.solr.Cql3SolrSecondaryIndex'; 

当我运行:

select * from transit_map where sal='XXX_953'; 

超时:

ReadTimeout: code=1200 [Coordinator node timed out waiting for replica nodes' 
responses] message="Operation timed out - received only 0 responses." info= 
{'received_responses': 0, 'required_responses': 1, 'consistency': 'ONE'} 

如果我把它限制在10行或更少,它会回来。任何更多,超时。我试图找出它出错的地方(无论是太多的sstables,墓碑还是别的东西),但我无法弄清楚如何解决这个问题。

我已启用跟踪。对于10行或更少的行,它不会“看起来太糟糕”(至少它有一些输出)。

当我放入11行限制或将其留空(无限制)时,没有输出从跟踪返回。

任何帮助去哪里都不胜感激。我来自Oracle长期以来的背景,并且在如何在Cassandra中弄清楚这一点已经失败了。

+0

你期望得到那个查询的行数? – Aaron

回答

1

创建地图和其他对象是Cassandra的繁重操作。 如果这个地图在大小超时方面不受限制,像这样很常见。

从个人体验地图大小不应该超过几十个左右。

以一种方式尝试和建模您的数据地图非常受限制,甚至更好,您根本不使用它们。一个解决方案可以改变transit_daysuuid类型并且具有连接表看起来是这样的:

CREATE TABLE arc_dynamic.transit_map_days_per ( transit_day_id uuid, data text PRIMARY KEY (transit_day_id) )

那么您需要能够得到从这个表元组的列表,“地图”和操纵它在你的末端

+0

raam86,我真的很感激你花时间在这方面提供你的建议。当我在火中学习时,我的下一个问题是:如何知道这确实是问题?我在哪里看?由于跟踪不会输出任何内容,我甚至不知道我还有什么地方需要注意。我试图通过在我的cqlshrc文件中设置client_timeout值来增加我的客户端超时,但它没有帮助。我的猜测是用于连接,而不是查询,但不确定。即使它确实起作用了,并且我收到了行,是否会有任何线索表明地图是问题? –

+0

最简单的方法是删除违规地图,看看会发生什么。你总是可以线程转储。 JVM转储和搜索卡桑德拉基准,他们有一些工具,我目前还没有记住,也http://aryanet.com/blog/cassandra-garbage-collector-tuning – raam86

+0

raam86,谢谢你在这个。我从团队的其他人那里得到的发现是,他们在地图上从来没有超过14个项目,而且问题实际上是一个数据存储版本发布的错误,而压缩和修复可以解决问题。尽管我非常感谢你的回应,并且将会更多地与它一起玩。每天学习更多... –