gpt4 book ai didi

performance - Cassandra - 在具有单表的单节点中批量插入性能不佳

转载 作者:行者123 更新时间:2023-12-04 10:15:38 25 4
gpt4 key购买 nike

上下文

我只有一个 Cassandra 节点,它本地安装在我的装有 Windows 10(Core i5、16GB 内存、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 位 id。

然后我生成了 10 000 行样本数据,如下所示:
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';
问题一

加载 10 000 行需要 51 秒。这是正常的吗?

我期望 Cassandra 的插入速度超快,而这几乎可以与 SQLite 相媲美 无交易 (59 秒)。如果我用 BEGIN 包裹插入物& COMMIT在 SQLite 中,这需要不到一秒钟的时间。这给我们带来了另一个问题......

问题二

批量插入。缓慢的批量插入。单个分区,在单个节点上。

我用 BEGIN BATCH 包裹了插入物和 APPLY BATCH; .之后, source花了这么长时间,我在超过 4 分钟后停止测量。

是的,我知道批量插入的错误用法。据我了解,如果需要插入到不同的分区,则使用批量插入是一种反模式,这是有道理的。这不是这里的情况。

为什么在单个节点(因此是单个分区)上批量插入如此缓慢?

我在这里缺少什么?

最佳答案

Cassandra 不是 SQLite。它没有针对此用例进行优化(在单台机器上运行)。它针对水平缩放进行了优化。您可以在本地运行它,但通常仅用于测试。而且我不希望它以任何形式优化以在 Windows 上运行。

https://blog.softwaremill.com/cassandra-writes-in-depth-6ea8d7581eb 上查看 Cassandra 写入的工作方式

要了解更多详细信息,以下是您的情况下每个插入会发生的情况:

  • 将行插入到 memtable 中,这不仅仅是一个追加,因为它必须保持排序
  • 向 CommitLog(磁盘上的文件)追加一行。这是一个追加,没有查找,但它仍然是一个磁盘操作。
  • 在某些时候会有一些刷新操作。内存表写在磁盘上,其他数据被计算并附加到它们(索引、布隆过滤器)。删除所有提交日志文件。
  • 您的客户端代码可能不是多线程的,因此获取响应并发送另一个插入需要一些时间。

  • 考虑到你在你的机器上运行它(16GB!),memtable 可能小到足以触发 10000 行的多次刷新。也可能会开始一些压缩,具体取决于您已经拥有的内容。

    请注意,每一步都至少涉及一次磁盘写入。台式 SSD 不错,但没那么好。

    我检查了一个生产 Cassandra 集群;它获得 2000 次写入/秒,写入的平均延迟小于 1 毫秒,同时还提供 2000 次读取/秒,平均延迟为 1.5 毫秒。但这发生在具有 60GB RAM 和 NVME SSD 的 Linux 服务器上。

    由于额外的协调工作,批处理会更糟。 Batch 不会对您的设置有任何改进,1 个节点没有任何可协调的地方。见 https://medium.com/@foundev/cassandra-batch-loading-without-the-batch-keyword-40f00e35e23e

    关于performance - Cassandra - 在具有单表的单节点中批量插入性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61075734/

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