【问题标题】:Cassandra data modeling blobCassandra 数据建模 blob
【发布时间】:2019-09-02 20:02:30
【问题描述】:

我正在考虑使用 cassandra 来存储我的数据。我有一个 server_id、start_time、end_time、messages_blob。

CREATE TABLE messages (
    server_id uuid,
    start bigint,
    end bigint,
    messages_blob blob,

    PRIMARY KEY ((server_id), start,end)
) WITH CLUSTERING ORDER BY (start,end);

我有两种类型的查询:

  1. 在开始时间 > 100 和开始时间
  2. 一次获取一组 server_id 的所有 messages_blob。

上面的架构可以帮我做吗?我需要非常快速地将数十亿条记录放入该表中,并在所有插入发生后进行读取。与写入相比,读取查询并不多,但我需要尽快恢复数据。

【问题讨论】:

    标签: sql cassandra nosql data-modeling


    【解决方案1】:

    使用此表结构,您只能执行第二个查询 - 您只需要分别对每个 server_id 执行查询,最好通过异步 API。

    对于第一个查询,此表结构将不起作用,因为 Cassandra 需要知道分区键 (server_id) 才能执行查询 - 否则它将需要完整扫描,当您在表中有足够的数据时会超时。

    要执行此查询,您有多种选择。

    添加另一个以start 作为分区键的表,您可以在其中存储第一个表中记录的主键。像这样的:

    create table lookup (start bigint, server_id uuid, end bigint, 
       primary key(start, server_id, end));
    

    这将要求您将数据写入 2 个表中,或者您可以为此任务使用物化视图(尽管如果您使用 OSS Cassandra 可能会出现问题,因为它有很多错误)。但是您需要注意该查找表的分区大小。

    使用 Spark 扫描表 - 因为您将 start 作为第一个聚类列,然后 Spark 将能够执行谓词下推,并且过滤将在 Casasndra 内部进行。但它会比使用查找表慢得多。

    另外,对 blob 非常小心 - Cassandra 不能很好地处理大 blob,所以如果你有大小超过 1Mb 的 blob,你需要将它们分成多个部分,或者(更好)存储它们在文件系统或其他一些存储(如 S3)上,并仅在 Cassandra 中保留元数据。

    【讨论】:

    • 我的问题并不清楚。我现在已经编辑过了。在第一个查询中,我实际上想要 server_id 和 messages_blob 而不仅仅是 server_ids。这有什么区别吗? Blob 很小(最大 32K),但我不想在两个表中复制 Blob。
    • 你不会在没有数据重复的情况下通过一次选择获得它,但你可以做 2 次选择 - 一个获取服务器 ID,另一个 - 获取 blob - 它仍然很快......
    猜你喜欢
    • 2015-12-25
    • 2015-04-09
    • 1970-01-01
    • 2018-06-16
    • 2018-07-10
    • 2018-04-02
    • 2016-08-20
    • 2019-06-29
    相关资源
    最近更新 更多