【问题标题】:How to change Cassandra partitioning scheme to order preserving?如何将 Cassandra 分区方案更改为保留顺序?
【发布时间】:2019-03-11 11:22:06
【问题描述】:

我在单节点集群中安装了 Apache Cassandra。当我构建列族时,由于基于主键的 murmur3 分区器,数据被分区,并且表不保留主键的顺序。因此,我看到的 SStable 输出将按位置排序,但主键的顺序会改变。

根据我的要求,我不希望主键的顺序被打乱。那么,如何更改 Cassandra 的分区方案呢?我查看了 cassandra.yaml 文件,但没有关于如何更改默认 murmur3 分区程序的说明。如果更改默认值会不会有任何影响?

这是我创建的表:

CREATE TABLE ycsb.expt (
y_id varchar,
field0 varchar,
field1 varchar,
field2 vachar,
PRIMARY KEY (y_id, field0) WITH CLUSTERING ORDER BY (field0 ASC);

向表中添加数据后,这是我执行“select * from expt”时的输出

     y_id   | field0     | field1       | field2
    --------+------------+--------------+------------
     user48 |   ?O3 :<5[ |       *B-0Qa |          .
     user14 |         .J |     (=~/0`"4 |         03
     user40 |       (Uu' |          +.0 |          ;
     user42 |         // |          ((* |         3O
      user8 |          , |     =Ao3[??< |   4.2(Hm6O

我希望此输出的顺序与我插入数据的顺序相同,并且我已按排序顺序插入(例如:User8、User 14、User40)。尽管创建了聚类键,但它已经对数据进行了洗牌。

如何确保输出按上表排序?

【问题讨论】:

    标签: cassandra cassandra-3.0


    【解决方案1】:

    cassandra.yaml 中的“分区器”配置决定了集群使用的分区器。您在这里有 3 种可能性,但我怀疑您确实需要 Murmur3 Partitioner。

    文档可以进一步解释其他选择的工作原理:https://docs.datastax.com/en/cassandra/3.0/cassandra/architecture/archPartitionerAbout.html

    但听起来您的问题并不在于正在使用的分区器,而是在于您的数据模型。如果您的要求规定了行的顺序,您应该重新评估它,以便它具有集群键。请注意,这将与决定行将落入哪些分区的分区键分开。

    有关配置主键的各种方法的说明,请参阅此处发布的答案: Difference between partition key, composite key and clustering key in Cassandra?

    一旦您有了满意的集群键,您就可以在 CQL 查询中对这些列使用 ORDER BY 指令。

    【讨论】:

    • 我通过给出表格格式和我得到的输出为问题添加了更多细节。请检查并建议可以做什么。我已按照您的建议使用了集群密钥。由于我这里没有得到排序的顺序,所以我想将分区器更改为保留顺序。
    • 您的分区键应该决定数据所在的位置(相对于节点/令牌环),集群键决定数据在该分区中的排序方式。如果您想按 y_id 排序,您需要选择它作为集群列并选择不同的列作为分区键(或创建一个新的)。如果您需要根据插入的订单执行订单,我可能会建议使用计数器列。 docs.datastax.com/en/cql/3.3/cql/cql_using/… 然后你可以用它作为集群键,它会保持顺序。
    猜你喜欢
    • 2015-12-28
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多