gpt4 book ai didi

java - Cassandra 读取/获取性能

转载 作者:搜寻专家 更新时间:2023-11-01 03:04:15 25 4
gpt4 key购买 nike

我的 Cassandra 表具有以下架构

CREATE TABLE cachetable1 (
id text,
lsn text,
lst timestamp,
PRIMARY KEY ((id))
) WITH
bloom_filter_fp_chance=0.010000 AND
caching='{"keys":"ALL", "rows_per_partition":"ALL"}' AND
comment='' AND
dclocal_read_repair_chance=0.100000 AND
gc_grace_seconds=864000 AND
read_repair_chance=0.000000 AND
default_time_to_live=0 AND
speculative_retry='99.0PERCENTILE' AND
memtable_flush_period_in_ms=0 AND
compaction={'class': 'SizeTieredCompactionStrategy'} AND
compression={'sstable_compression': 'LZ4Compressor'};

上表包含 2.21 亿行(约 16 GB 数据)。 CassandraDaemon 以 4GB 堆空间运行,我为行缓存配置了 4GB 内存。我尝试像这样从我的 Java 代码运行选择查询

for(int i = 0; i < 1000; i ++)
{
int id = random.nextInt(20000000 - 0) + 0;
for(j = id; j <= id + 100; j++)
{
ls.add(j+"");
}

Statement s = QueryBuilder.select("lst","lsn").from("ks1" , "cachetable1").where(QueryBuilder.in("id",ls.toArray()));
s.setFetchSize(100);

ResultSet rs=sess.execute( s );
List<Row> lsr=rs.all();
for(Row rw:lsr)
{
//System.out.println(rw.toString());
count++;
}

ls.clear();
}

在上面的代码中,我试图获取 10 万条记录。但是读取/获取性能非常差。获取 10 万行需要 400-500 秒。有没有更好的方法通过 Java 从 Cassandra 读取/获取记录?除了行缓存大小和 Cassandra 堆大小之外,是否需要进行一些调整?

最佳答案

您似乎想要以 100 行 block 的形式检索数据。这听起来很适合聚类列。

更改您的架构以使用 id 作为分区键和 block 索引作为聚簇列,即 PRIMARY KEY ( (id), chunk_idx )。当您插入数据时,您将不得不弄清楚如何将您的单个索引映射到一个 id 和 chunk_idx(例如,也许对您的一个值进行模 100 以生成一个 chunk_idx)。

现在,当您查询一个 id 并且不指定 chunk_idx 时,Cassandra 可以高效地返回所有 100 行,并在分区上读取一个磁盘。如果您不想总是读取整 block 行,您仍然可以通过指定 chunk_idx 对分区内的单行进行范围查询和检索。

所以你的错误是你为每个查询生成 100 个随机分区读取,这将命中所有节点并且需要为每个节点单独读取磁盘。请记住,仅仅因为您正在查询顺序索引号并不意味着数据存储在一起很近,而对于 Cassandra,情况恰恰相反,顺序分区键可能存储在不同的节点上。

您犯的第二个错误是您正在同步执行查询(即您正在发出查询并等待请求完成,然后再发出任何更多查询)。您想要做的是使用线程池,以便您可以并行运行许多查询,或者在单个线程中使用 executeAsync 方法。由于您的查询效率不高,等待 100 个随机分区读取完成将是一个漫长的等待,并且许多高度流水线化的 Cassandra 容量将坐在那里摆弄拇指等待做某事。如果您正在尝试最大化性能,您希望让所有节点尽可能忙碌。

另一件需要注意的事情是在连接到您的集群时使用 TokenAwarePolicy。这允许每个查询直接转到具有分区副本的节点,而不是转到可能必须充当协调器并通过额外跃点获取数据的随机节点。当然,在读取时使用一致性级别 ONE 比更高的一致性级别更快。

行缓存大小和堆大小不是您问题的根源,因此这是错误的路径。

关于java - Cassandra 读取/获取性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28191186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com