希望对Clickhouse中合并的ReplicatedMergeTree部分进行更多控制

问题描述

让我们说我们正在使用此表:

create table table1 (
  ingestion_time DateTime,ingestion_day Date,dim1 String,met1 double,...
)
engine=ReplicatedMergeTree(...),partition=(ingestion_day)
order by = (...);

我们有一个用例,我们需要每15分钟创建一个新零件,然后对于一个正在运行的窗口(称为更新窗口),可能需要删除并重新创建某些15分钟的零件。

例如,如果更新窗口为15天,我可以在2020-10-20上选择删除2020-10-15 23:45的零件并重新摄取。

如果我按15分钟的间隔进行分区,那么它将很快导致过多的分区问题,因此我正在寻找一种方法来对合并在MergeTree中的部件进行精细控制,从而可以使15分钟的部件在更新中保持不变可以手动调用该窗口,将较旧的部分合并到每日分区中。

关于如何实现此目标的任何建议?我找不到任何可以控制零件合并的设置,尽管有些设置可用于保留已合并的旧零件。

解决方法

合并是不可管理的,它发生在后台的未知时间,因此您无法为此进行计划。有OPTIMIZE语句可初始化最终完成的计划外合并。


从理论上讲,可以定义任意分区大小,包括15分钟。但这可能是一个坏方法,取决于具体情况。

..
PARTITION BY toStartOfFifteenMinutes(ingestion_time)
..

为避免出现错误“单个INSERT块的分区过多”,需要增加参数max_partitions_per_insert_block的限制。

并通过调用DROP PARTITION删除过时的分区。


可以考虑使用mutations删除过时的行作为替代方法,但这通常是无效且不推荐的方法。


查看ReplicatedReplacingMergeTreeReplicatedCollapsingMergeTree,以通过CH手段对数据进行重复数据删除/折叠。


可以通过TTL子句在列或表级别定义保留策略。