ClickHouse - CollapsingMergeTree 表引擎 - 记录不会合并,即使它们具有相同的列值和不同的符号(+1/-1)

Posted

技术标签:

【中文标题】ClickHouse - CollapsingMergeTree 表引擎 - 记录不会合并,即使它们具有相同的列值和不同的符号(+1/-1)【英文标题】:ClickHouse - CollapsingMergeTree Table Engine - Records are not merged even if they have same column values and different signs(+1/-1) 【发布时间】:2020-02-27 07:18:14 【问题描述】:

我们有一个带有CollapsingMergeTree 引擎的ClickHouse 表。我们希望在从源导入数据时更新记录(可能很频繁)。最初,所有记录都插入 +1 符号列。我们更新记录的方法是使用 -1 符号插入要更新的相同值的记录,然后插入带有 +1 符号的更新记录,期望当数据部分时,具有相反符号的相同记录将被 ClickHouse 折叠在后台合并。

问题是'它永远不会发生'

我知道ClickHouse 将异步合并数据,但已经几个月了,ClickHouse 没有执行合并。

我查询了SELECT * FROM system.merges 以了解是否正在进行任何合并。查询结果为 0。还更新了 ClickHouse 到其最新版本。但没有运气!

如果有人能指出问题所在,不胜感激?我是否缺少任何服务器级别的设置? ClickHouse 何时合并此类记录?

或者我应该采取任何其他方法来更新ClickHouse 数据?

【问题讨论】:

【参考方案1】:

最终——可能永远不会。 您不应该依赖合并过程。它有自己复杂的算法来平衡零件的数量。 Merge 没有做最终合并的目标——只做 1 个部分,因为它效率不高。

optimize 确实/强制未计划的合并,例如,您将从 22 中获得 4 个部分 优化最终是否/强制所有部分的非计划合并,直到分区中只有一个部分 final 的唯一问题是它甚至将 1 部分重写为新的 1 部分。因为有时它需要在单个部分上折叠行。 因此,对于某些表,我们会针对具有多个部分的分区运行优化表 x 分区最终(通过 crond)。

select  concat('optimize table ',database, '.','\`', table, '\` partition ',  ((groupUniqArray(partition)) as partition_count)[1], ' final')
    from system.parts
    where (database = 'xxx' or database like 'zzzz\_%') and (database,table) in (select database, table from system.replicas where engine='ReplicatedReplacingMergeTree' and is_leader)
          and table not like '.inner%' 
    group by database,table having   length(partition_count)>1 and sum(rows) < 5000000

https://***.com/a/60154073/11644308

【讨论】:

感谢丹尼斯的回复。您能否建议任何其他方法来更新 ClickHouse 数据? 替换MergeTree?聚合mergeTreegist.github.com/den-crane/d03524eadbbce0bafa528101afa8f794

以上是关于ClickHouse - CollapsingMergeTree 表引擎 - 记录不会合并,即使它们具有相同的列值和不同的符号(+1/-1)的主要内容,如果未能解决你的问题,请参考以下文章

clickhouse-S3

clickhouse安装与启动

clickhouse常见的一些问题

大数据 OLAP ClickHouse 引擎ClickHouse 系统架构和存储引擎实现原理 : 为什么 ClickHouse 这么快? Why is ClickHouse so fast?

clickhouse-FREEZE分区操作

clickhouse 集群配置无法生效