【问题标题】:Cassandra client side partition key calculation to save disk spaceCassandra 客户端分区键计算以节省磁盘空间
【发布时间】:2015-11-10 05:52:24
【问题描述】:

我有一个表,它有一个由五个大字段组成的复合分区键。

我注意到由于这五个字段的大小,该表的 SSTable 索引文件非常大。

我实际上不需要从我的表中检索这些字段的值,因此为了节省空间,我想在客户端将它们散列为单个值,然后使用该单个值作为分区键,与 Cassandra 将复合分区键映射到单个令牌值时相同。

所以我想知道 java 驱动程序中是否有一个函数或一些 java 库函数我可以在我的客户端中使用来生成这个单个值。

我想我想使用的类型是 uuid,所以我正在寻找一个函数,我可以将 N 个值传递给并获取一个 uuid,然后将其用作我的分区键值。有谁知道这样做的好方法吗?

【问题讨论】:

  • 我不知道 uuid,但你可以简单地使用 Apache 库 HashCodeBuilder 的 common-lang 包提供的哈希函数

标签: cassandra cql datastax-java-driver


【解决方案1】:

您是否尝试过启用压缩并查看它如何与您当前的数据模型一起使用?

使用散列值作为分区键将容易发生散列冲突。哈希碰撞的实际机会取决于使用的算法。可靠的算法(例如 128 位 murmur3)会大大降低机会,但它们仍然可能发生,在这种情况下,您可能会在应用程序中看到数据交换。

【讨论】:

  • 我对表格进行了 LZ4 压缩。 Cassandra 本身如何避免碰撞?我基本上想计算 Cassandra 将计算的令牌值并将其提供给 Cassandra 作为分区键。我正在使用 Murmur3Partitioner,这似乎将事物散列到 -2^63 到 +2^63-1。那么我可以使用 bigint 作为分区键并从我的 5 个值生成 murmur3hash 吗?还是容易发生碰撞?我不能发生碰撞。
  • 哈希冲突与 Cassandra 无关,因为生成的令牌不必是唯一的。完全使用哈希作为令牌值的原因是为了在令牌环中均匀分布令牌。
  • 哦,那我想这行不通了。我认为令牌值控制数据的存储方式,而不仅仅是选择哪台机器拥有它。
猜你喜欢
  • 2018-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 2016-06-22
相关资源
最近更新 更多