【问题标题】:Calculating the size of a table in Cassandra在 Cassandra 中计算表格的大小
【发布时间】:2017-03-11 13:53:12
【问题描述】:

在 Jeff Carpenter 和 Eben Hewitt 的“Cassandra The Definitive Guide”(第 2 版)中,使用以下公式计算磁盘上表的大小(对模糊部分表示歉意):

  • ck:主键列
  • cs:静态列
  • cr:常规列
  • cc:聚类列
  • Nr:行数
  • Nv:它用于计算时间戳的总大小(我没有完全理解这部分,但现在我将忽略它)。

这个等式有两点我不明白。

第一:为什么要为每个常规列计算聚类列的大小?我们不应该将它乘以行数吗?在我看来,通过这种方式计算,我们是说每个聚类列中的数据会针对每个常规列进行复制,我认为情况并非如此。

第二:为什么主键列不乘以分区数?根据我的理解,如果我们有一个具有两个分区的节点,那么我们应该将主键列的大小乘以 2,因为我们将在该节点中有两个不同的主键。

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    这是因为 Cassandra 的版本

    • 每个不同的分区键值只有一个条目。
    • 对于每个不同的分区键值,静态列只有一个条目
    • 集群键有一个空条目
    • 对于一行中的每一列,每个聚类键列都有一个条目

    举个例子:

    CREATE TABLE my_table (
        pk1 int,
        pk2 int,
        ck1 int,
        ck2 int,
        d1 int,
        d2 int,
        s int static,
        PRIMARY KEY ((pk1, pk2), ck1, ck2)
    ); 
    

    插入一些虚拟数据:

     pk1 | pk2 | ck1 | ck2  | s     | d1     | d2
    -----+-----+-----+------+-------+--------+---------
       1 |  10 | 100 | 1000 | 10000 | 100000 | 1000000
       1 |  10 | 100 | 1001 | 10000 | 100001 | 1000001
       2 |  20 | 200 | 2000 | 20000 | 200000 | 2000001
    

    内部结构将是:

                 |100:1000:  |100:1000:d1|100:1000:d2|100:1001:  |100:1001:d1|100:1001:d2|  
    -----+-------+-----------+-----------+-----------+-----------+-----------+-----------+
    1:10 | 10000 |           |  100000   |  1000000  |           |  100001   |  1000001  |
    
    
                 |200:2000:  |200:2000:d1|200:2000:d2|
    -----+-------+-----------+-----------+-----------+ 
    2:20 | 20000 |           |  200000   |  2000000  |
    

    所以表格的大小将是:

    Single Partition Size = (4 + 4 + 4 + 4) + 4 + 2 * ((4 + (4 + 4)) + (4 + (4 + 4))) byte = 68 byte
    
    Estimated Table Size = Single Partition Size * Number Of Partition 
                         = 68 * 2 byte
                         = 136 byte
    
    • 这里所有的字段类型都是int(4字节)
    • 有 4 个主键列、1 个静态列、2 个聚类键列和 2 个常规列

    更多:http://opensourceconnections.com/blog/2013/07/24/understanding-how-cql3-maps-to-cassandras-internal-data-structure/

    【讨论】:

    • 这很有帮助,谢谢!为什么我们提到版本
    • 是的,在 cassandra 版本中 >= 3 内部结构发生了变化
    • 你好@AshrafulIslam 如何计算价值:Number Of Partition ?
    • @HarmeetSinghTaara 分区数是分区键的不同值的个数
    【解决方案2】:

    作为作者,我非常感谢您提出的问题以及您对材料的参与!

    关于原来的问题——记住这不是计算表大小的公式,而是计算单个分区大小的公式。目的是将此公式与“最坏情况”的行数一起使用,以识别过大的分区。您需要将此等式的结果乘以分区数,以估算表的总数据大小。当然,这并没有考虑复制。

    也感谢那些回答原始问题的人。根据您的反馈,我花了一些时间研究新的 (3.0) 存储格式,看看这是否会影响公式。我同意 Aaron Morton 的文章是一个有用的资源(上面提供了链接)。

    公式的基本方法对于 3.0 存储格式仍然有效。公式的工作方式,你基本上是在添加:

    • 分区键和静态列的大小
    • 每行聚类列的大小乘以行数
    • 每个单元格有 8 个字节的元数据

    更新 3.0 存储格式的公式需要重新访问常量。例如,原始方程假设每个单元有 8 个字节的元数据来存储时间戳。新格式将单元格上的时间戳视为可选,因为它可以在行级别应用。出于这个原因,现在每个单元格的元数据量是可变的,可能低至 1-2 个字节,具体取决于数据类型。

    在阅读此反馈并重读本章的该部分后,我计划更新文本以添加一些说明以及更强烈的警告,说明此公式作为近似值而不是精确值有用。它根本没有考虑一些因素,例如写入分布在多个 SSTable 以及墓碑上。实际上,我们计划在今年春天(2017 年)再次印刷以更正一些勘误,因此请尽快寻找这些更改。

    【讨论】:

    • 我想发布有关此问题的更新,因为我能够与创建原始公式的 Artem Chebotko 进行讨论。上面关于每个单元格元数据的评论是正确的,但事实证明 3.0 存储格式的公式还有另一个关键区别。
    • 在新公式中,左括号被移动,使得括号内的数量是聚类键大小的简单总和加上常规列大小的总和,然后乘以行数。换句话说,在原始公式中,聚类列对每个常规列计算一次,但在新公式中,它们仅每行计算一次。
    • 谢谢。这个公式是有道理的。这个公式的原始文档来源是什么? (所以,我可以用它作为参考)。我希望它包含一些细节和示例。
    • 这个公式能给我们估计磁盘上的数据大小吗?数据不是压缩在磁盘上吗?我们可以用来估算磁盘大小的粗略压缩系数是多少?
    【解决方案3】:

    这是来自 Artem Chebotko 的更新公式:

    t_avg 是每个单元格的平均元数据量,可能会因数据的复杂性而异,但 8 是一个很好的最坏情况估计值。

    【讨论】:

      猜你喜欢
      • 2021-08-25
      • 2014-07-28
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多