我使用CQLSSTableWriter来写入数据的相应SSTables:
writer.addRow(1, "test", ...);
数据是按分区键和聚类键排序的,然后我对已排序数据的每一行调用addRow。
给定分区的数据写入单个SSTables(或最多两个)中。
两个问题:
CQLSSTableWriter builder()不需要压缩策略。那正常吗?
已创建的表具有LCS压缩。但是CQLSSTableWriter没有定义任何策略。因此,考虑到数据摄取之后再也不会发生变化(就我而言!),并且在我使用sstablesloader将SSTables摄取至Cassandra之后,是否可以防止运行任何压缩是否有意义?还是在每次使用sstablesloader进行摄取后都需要进行压缩?
感谢让它变得更加清晰!
答案 0 :(得分:2)
1)是的,CQLSSTableWriter仅创建sstables。
2)当Cassandra从sstableloader或nodetool refresh/import
获取sstable时,它将自动进行任何必要的压缩。您不必也不应该做任何事情。
如果您确实想要,则可以禁用压缩
ALTER TABLE keyspace.table WITH COMPACTION = {'class': 'SizeTieredCompactionStrategy', 'enabled': 'false' }`
然后它什么也不会做,您可以忽略它,而稳定表将保持原状。
仅将2个sstables包含在分区中并不一定意味着在读取时仅会触摸2个。 sstable上的bloom筛选器仍会提供误报,并且如果sstable的数量继续攀升,最终将成为一个问题。但是,如果您的聚类密钥随时间增加,则可用于过滤出不必要的稳定数据,最小/最大聚类密钥将保留在元数据中并在读取路径中进行检查(这是TWCS和大多数时间序列数据如何防止过多使用的原因)建立)。随着稳定数量的增长,这也大大影响了维修和其他操作任务。
最终除非出现问题,否则我强烈建议您保持压缩状态不变,如果您认为自己大多数情况都很好,请使用SizeTiered,并且在其他读写操作最少的情况下,这样做只会防止事情发疯。如果您的CPU在压缩方面已达到极限,那么您应该检查其他错误,因为它不会消耗太多(您怎么知道其压缩?),您也可以随时限制压缩吞吐量。
答案 1 :(得分:1)
最好让Cassandra决定何时执行压缩,而不要尝试手动执行。