【发布时间】:2015-05-21 19:49:36
【问题描述】:
我正在构建一个处理非常大的数据(超过 300 万)的应用程序。我是 cassandra 的新手,我正在使用 5 节点 cassandra 集群来存储数据。我有两个列族
Table 1 : CREATE TABLE keyspace.table1 (
partkey1 text,
partkey2 text,
clusterKey text,
attributes text,
PRIMARY KEY ((partkey1, partkey2), clusterKey1)
) WITH bloom_filter_fp_chance = 0.01
AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}'
AND comment = ''
AND compaction = {'min_threshold': '4', 'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32'}
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';
Table 2 : CREATE TABLE keyspace.table2 (
partkey1 text,
partkey2 text,
clusterKey2 text,
attributes text,
PRIMARY KEY ((partkey1, partkey2), clusterKey2)
) WITH bloom_filter_fp_chance = 0.01
AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}'
AND comment = ''
AND compaction = {'min_threshold': '4', 'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32'}
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';
注意:clusterKey1 和 clusterKey2 是随机生成的 UUID
我担心的是 nodetool cfstats 我在 Table1 上通过统计数据获得了良好的吞吐量:
- SSTable 计数:2
- 已用空间(总计):365189326
- 快照使用的空间(总计):435017220
- SSTable 压缩比:0.2578485727722293
- 内存单元数:18590
- Memtable 数据大小:3552535
- Memtable 开关数:171
- 本地读取计数:0
- 本地读取延迟:NaN 毫秒
- 本地写入计数:2683167
- 本地写入延迟:1.969 毫秒
- 待刷新:0
- 布隆过滤器误报:0
- 布隆过滤器误报率:0.00000
- 使用的布隆过滤器空间:352
对于 table2,我的统计数据读取性能非常差:
- SSTable 计数:33
- 已用空间(实时):212702420
- 已用空间(总计):212702420
- 快照使用的空间(总计):262252347
- SSTable 压缩比:0.1686948750752438
- 记忆单元数:40240
- Memtable 数据大小:24047027
- Memtable 开关数:89
- 本地读取计数:24027
- 本地读取延迟:0.580 毫秒
- 本地写入计数:1075147
- 本地写入延迟:0.046 毫秒
- 待刷新:0
- 布隆过滤器误报:0
- 布隆过滤器误报率:0.00000
- 使用的布隆过滤器空间:688
我想知道为什么 table2 会创建 33 个 SSTables,为什么它的读取性能非常低。谁能帮我弄清楚我在这里做错了什么?
这就是我查询表格的方式:
BoundStatement selectStamt;
if (selectStamt == null) {
PreparedStatement prprdStmnt = session
.prepare("select * from table2 where clusterKey1 = ? and partkey1=? and partkey2=?");
selectStamt = new BoundStatement(prprdStmnt);
}
synchronized (selectStamt) {
res = session.execute(selectStamt.bind("clusterKey", "partkey1", "partkey2"));
}
在另一个线程中,我正在以相同的方式对该表对不同数据进行一些更新操作。
在测量吞吐量的情况下,我测量每秒处理的记录数,其处理量仅为 50-80 条记录。
【问题讨论】:
-
低(亚毫秒)“本地读取延迟”是件好事。
-
是的,500 微秒会让几乎所有高频交易者都开心:)。尽管 cfstats(取决于我认为的版本)在执行后确实会重置,但 Rijo 看到的性能可能比这显示的要差。
标签: cassandra bigdata data-modeling cassandra-2.0 datastax