当前位置: 首页 > 知识库问答 >
问题:

避免墓碑的Cassandra数据建模

西门建安
2023-03-14

我从一个用spark-kafka-cassandra(在kubernetes上)重写猛犸象spark-kafka-hbase应用程序的初步想法开始。

我有以下数据模型,一个支持全时插入,另一个支持upserts

办法1:

创建表test.inv_positions(
location_id int,
item bigint,
time_id timestamp,
sales_floor_qty int,
backroom_qty int,
in_backroom boolean,
transit_qty,
primary key((location_id),item,time_id))和聚类顺序by(item asc,time_id DESC);

由于timeid是集群col的一部分,此表将继续插入。我想通过fetch1来读取最新的(timeid是desc),并通过在关键cols上设置TTL来删除旧记录,或者在一夜之间删除它们。

关注点:TTL或删除旧记录创建墓碑。

办法2:

创建表test.inv_positions(
location_id int,
item bigint,time_id timestamp,
sales_floor_qty int,
backroom_qty int,
in_backroom boolean,
transit_qty int,
主键((location_id),item)),使用聚类顺序by(item asc);

如果同一位置和项目出现了新记录,则会将其提升。它很容易阅读,也不需要担心清除旧记录

关注:我在Cassandra上有另一个应用程序,在不同的时间更新不同的col,我们仍然有阅读问题。也就是说,upserts也创建墓碑,但与方法1相比有多差?或者其他更好的方法来建模它?

共有1个答案

公良莫希
2023-03-14

第一种方法似乎不错。TTL和delete都创建墓碑。对于基于TTL的删除,您可以参考压缩策略。TWCS更适合于基于TTL的删除,否则您可以使用STCS进行简单的删除。此外,相应地配置gc_grace_seconds以平滑地清除墓碑,因为沉重的墓碑会导致读取延迟。

 类似资料:
  • 我正在开发一个Cassandra数据模型来存储用户上传的记录。 潜在的问题是,一些用户可能在5分钟内上传50-100k行,这可能导致分区键(user_id)的“热点”。(如果每个分区超过10k行,建议重新考虑数据模型)。 如何避免在短时间内一个分区键上有太多记录? 我尝试使用Datastax的时间序列建议,但即使我有年、月、日、小时列,热点仍然可能出现。 使用案例包括: 按user_id获取所有上

  • 我用以下属性创建了一个Kafka主题 min.cleanable.dirty.ratio=0.01,delete.retention.ms=100,segment.ms=100,cleanup.policy=紧凑 假设我按1111:1,1111:2,1111: null,2222:1的顺序插入k-v对,现在除了最后一条消息,日志压缩在其余消息上运行并清除前两条消息,但保留1111: null 根据

  • 我有几个用Java实现的Kafka消费者,我正在实现一个独立的应用程序来检查记录并删除它们。希望Kafka在压缩主题时删除状态存储。 现在...我对Kafka创建的不同类型的商店有点困惑。对于每一种类型的店铺,我想知道: Kafka删除相应主题中的旧唱片时是否删除? 删除相应主题中的记录时是否删除? 我们是不是被困住了? 我看到的商店类型有以下几种: null

  • 我不明白为什么cassandra一直在扫描我的表寻找其他结果(因此获取了很多墓碑),因为第一行匹配,我指定我只想要一行。 如果我没有指定限制,我可以理解警告。但是,当第一行与限制1匹配时,扫描整个表有什么意义呢?

  • 我目前有一个应用程序,它将事件驱动的实时流数据持久化到一个列系列,该系列建模为: 每个帐户ID每X秒发送一次数据,因此我们每次收到事件时都会覆盖现有行。此数据包含当前实时信息,我们只关心最近的事件(不使用旧数据,这就是我们插入已经存在的键的原因)。从应用程序用户端-我们通过account_id语句查询选择。 我想知道是否有更好的方法来模拟这种行为,并查看了Cassandra的最佳实践和类似的问题(