【问题标题】:Want more control over ReplicatedMergeTree parts merging in clickhouse想要更多地控制 ReplicatedMergeTree 部分在 clickhouse 中的合并
【发布时间】:2021-02-03 10:29:38
【问题描述】:

假设我们正在使用这个表:

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 分钟的部分完整窗口可能会手动调用以将较旧的部分合并到日常分区中。

关于如何实现这一点的任何建议?我找不到任何可以让我控制部件合并的设置,但我可以使用一些设置来保留已合并的旧部件。

【问题讨论】:

    标签: partitioning clickhouse


    【解决方案1】:

    合并是不可管理的,它在未知时间在后台发生,因此您无法计划。有OPTIMIZE-statement 来初始化一个最终完成的计划外合并。


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

    ..
    PARTITION BY toStartOfFifteenMinutes(ingestion_time)
    ..
    

    为避免出现“Too many partitions for single INSERT block”的错误,需要增加参数max_partitions_per_insert_block的限制。

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


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


    查看ReplicatedReplacingMergeTreeReplicatedCollapsingMergeTree 以通过CH 方式去重/折叠数据。


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

    【讨论】:

      猜你喜欢
      • 2019-11-20
      • 2018-08-18
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 2017-06-10
      • 1970-01-01
      • 2020-05-25
      • 1970-01-01
      相关资源
      最近更新 更多