在单节点单表中批插入时性能较差

bqjvbblv  于 2021-06-09  发布在  Cassandra
关注(0)|答案(1)|浏览(274)

上下文

我只有一个cassandra节点,用windows10(corei5,16gbram,ssd驱动器)本地安装在我的pc上。
我创建了这样一个表:

CREATE KEYSPACE covid19 WITH replication = {
    'class':              'SimpleStrategy',
    'replication_factor': '1'
};

CREATE TABLE covid19.cases (
    pesel       text,
    test_date   date,
    result      boolean,
    PRIMARY KEY ((pesel), test_date)
)
WITH CLUSTERING ORDER BY (test_date DESC);

这个 pesel 是唯一的,一个人的10位数身份证。
然后我生成了10000行样本数据,如下所示:

INSERT INTO cases (pesel, test_date, result) VALUES ('0000000001', '2020-03-10', true);
INSERT INTO cases (pesel, test_date, result) VALUES ('0000000002', '2020-03-10', false);
INSERT INTO cases (pesel, test_date, result) VALUES ('0000000003', '2020-03-10', false);
INSERT INTO cases (pesel, test_date, result) VALUES ('0000000004', '2020-03-12', false);
INSERT INTO cases (pesel, test_date, result) VALUES ('0000000005', '2020-03-12', false);
INSERT INTO cases (pesel, test_date, result) VALUES ('0000000006', '2020-03-12', false);
...

最后,我使用cqlsh加载了数据: source 'cases.cql'; ###问题1
加载10000行需要51秒。这正常吗?
我希望cassandra的插入速度会非常快,而这与没有事务的sqlite(59s)相当。如果我用 BEGIN & COMMIT 在sqlite中,这只需要不到一秒钟的时间。这给我们带来了另一个问题。。。

问题2

批量插入。缓慢批量插入。到单个分区,在单个节点上。
我把插页包起来 BEGIN BATCH 以及 APPLY BATCH; . 在那之后 source 我花了很长时间,过了4分钟就停止了测量。
是的,我知道批量插入的错误用法。据我所知,如果需要插入到不同的分区,那么使用批插入是一种反模式,这是有道理的。这里不是这样。
为什么批量插入在单个节点(因此是单个分区)上如此缓慢?
我错过了什么?

62o28rlo

62o28rlo1#

Cassandra不是sqlite。它没有针对这个用例进行优化(在一台机器上运行)。它针对水平缩放进行了优化。您可以在本地运行它,但通常只用于测试。我也不希望它在windows上运行时得到任何形式的优化。
看看Cassandra的作品是如何工作的https://blog.softwaremill.com/cassandra-writes-in-depth-6ea8d7581eb
更详细地说,以下是每个插入的情况:
将行插入memtable,这不仅仅是一个追加,因为它必须保持排序
向commitlog(磁盘上的文件)追加一行。这是一个追加,没有查找,但仍然是一个磁盘操作。
在某个点上会有一些刷新操作。memtables被写在磁盘上,其他数据被计算并附加到它们上(索引、bloom过滤器)。将删除所有提交日志文件。
您的客户机代码可能不是多线程的,因此获取响应和发送另一个insert需要一些时间。
考虑到你在你的机器上运行这个(16gb!),memtable可能小到足以触发10000行的多次刷新。此外,可能会有一些压缩开始,这取决于你已经有了什么。
请注意,每个步骤至少涉及一个磁盘写入。台式固态硬盘不错,但不是那么好。
我检查了生产Cassandra集群;它可以每秒写入2000次,写入的平均延迟小于1ms,同时还可以每秒读取2000次,平均延迟为1.5ms。但这种情况发生在具有60gb ram和nvme ssd的linux服务器上。
由于额外的协调工作,批处理将更糟。批处理不会对您的设置有任何改进,只有一个节点没有任何可协调的内容。看到了吗https://medium.com/@foundev/cassandra-批量加载-无批量关键字-40f00e35e23e

相关问题