我最初的想法是用spark-kafka-cassandra(在kubernetes上)重写庞然大物的spark-kafka-hbase应用程序。
我有以下数据模型,一个支持全时插入,另一个支持upserts
方法1:
创建表test.inv_positions(
location_id int,
项bigint,
time_id时间戳,
sales_floor_qty int,
backroom_qty int,
in_backroom布尔值,
Transit_qty int,
主 键((location_id),item,time_id)) 按(项目 asc,time_id DESC);
该表不断插入,因为timeid是群集col的一部分。我正在考虑通过获取1来读取最新记录(timeid为desc),并通过在关键列上设置TTL或在一夜之间删除它们以某种方式删除旧记录。
问题:TTL或删除旧记录会创建墓碑。
方法2:
创建表test.inv_positions(
location_id int,
项目bigint, time_id时间戳,
sales_floor_qty int,
backroom_qty int,
in_backroom布尔值,
Transit_qty int,
主键((location_id), item))的聚类顺序为(item asc);
此表如果有相同位置和项目的新记录,则会对其进行补缺。它易于阅读,无需担心清除旧记录
关注点:我在Cassandra上还有另一个应用程序,该应用程序在不同的时间更新了不同的col,但我们仍然遇到阅读问题。也就是说,高手也会创建墓碑,但是与方法1相比,情况有多糟?还是其他更好的建模方法?
答案 0 :(得分:2)
第一种方法似乎很好。 TTL和删除均创建逻辑删除。您可以参考基于TTL的删除的压缩策略。 TWCS更好地用于基于TTL的删除,否则您可以使用STCS进行简单的删除。另外,相应地配置gc_grace_seconds以平滑清除逻辑删除,因为重的逻辑删除会导致读取延迟。