【问题标题】:Cassandra Batches with if not exists conditionCassandra 批处理,如果不存在条件
【发布时间】:2017-09-16 09:46:42
【问题描述】:

当我只向一个表发送一批插入时,每行作为唯一键,如果不存在,即使其中一行存在也会出现问题。

我需要每行而不是整个批次插入批次。 假设我有一个表“users”,只有一列“user_name”并包含行“jhon”,现在我正在尝试导入新用户:

BEGIN BATCH
INSERT INTO "users" ("user_name") VALUES ("jhon") IF NOT EXISTS;
INSERT INTO "users" ("user_name") VALUES ("mandy") IF NOT EXISTS;
APPLY BATCH;

它不会插入“mandy”,因为存在“jhon”,我该怎么做才能隔离它们?

我有很多行要插入大约 100-200K,所以我需要使用批处理。

谢谢!

【问题讨论】:

    标签: cassandra database nosql


    【解决方案1】:

    首先:您所描述的内容被记录为预期行为:

    在 Cassandra 2.0.6 及更高版本中,您可以批量在 Cassandra 2.0 中作为轻量级事务引入的条件更新。只有对同一分区所做的更新才能包含在批处理中,因为底层 Paxos 实现在分区的粒度上工作。您可以将具有条件的更新与没有条件的更新分组,但是当批处理中的单个语句使用条件时,整个批处理将使用单个 Paxos 提议提交,就好像批处理中包含的所有条件都适用一样。

    这基本上证实了:你的更新是针对不同的分区的,所以只会使用一个 Paxos 提案,这意味着整个批次都会成功,或者一个都不成功。

    也就是说,在 Cassandra 中,批处理并不是为了加速和批量加载,而是为了创建伪原子逻辑操作。来自http://docs.datastax.com/en/cql/3.1/cql/cql_using/useBatch.html

    批次经常被错误地用于优化性能。未记录的批次需要协调器来管理插入,这会给协调器节点带来沉重的负担。如果其他节点拥有分区键,协调节点需要处理一个网络跳,导致传递效率低下。对同一分区键进行更新时使用未记录的批次。

    协调节点可能还需要努力处理记录的批处理,同时保持表之间的一致性。例如,在接收到一个批次后,协调器节点将批次日志发送到另外两个节点。在协调器失败的情况下,其他节点重试批处理。整个集群都会受到影响。使用记录的批处理来同步表,如下例所示:

    在您的架构中,每个 INSERT 都指向不同的分区,这会给您的协调器增加很多负载。

    您可以使用具有异步执行功能的客户端运行 200k 插入,它们的运行速度会非常快 - 可能与您在批处理中看到的一样快(或更快)。

    【讨论】:

    • 谢谢,我已经做出了改变,希望 Cassandra 能够快速处理 200K 请求(异步调用)。
    猜你喜欢
    • 2017-08-02
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 2019-02-14
    • 2017-01-07
    • 2018-04-27
    • 2017-11-19
    • 1970-01-01
    相关资源
    最近更新 更多