【问题标题】:clickhouse merge one partition at a timeclickhouse 一次合并一个分区
【发布时间】:2020-05-25 20:34:13
【问题描述】:

当我运行优化表****最终时,如何强制 ClickHouse 一次只合并一个分区(不指定分区 201304 和 201305 并按顺序运行)?

我正在使用 CollapsingMergeTree。它使用大量 RAM 对许多分区进行多次合并并杀死服务/机器。

【问题讨论】:

    标签: clickhouse


    【解决方案1】:

    optimize final 的主要问题(表或分区无关紧要)即使分区只有 1 个部分,它也会完全重写/重新合并一个分区,这在 99.9999% 的情况下是多余的!!!!它重新合并了最终已经合并的旧数据!!!

    之所以需要,是因为有时需要将通过单个插入插入的行(重复)折叠到具有永久单个部分的分区中。这是非常非常罕见的必需品。

    所以我建议对包含多个部分的分区运行优化最终。你可以使用这样的东西

    select concat('optimize table ',database, '.','\`', table, '\` partition ',partition , ' final;')
    from system.parts
    where active and (engine like '%ReplacingMergeTree' or  engine like '%CollapsingMergeTree')
    group by database,table,partition
    having   count()>1
    

    PS:如果您使用 GraphiteMergeTree,那就另当别论了,还有更简单的解决方案。

    【讨论】:

    • 我正在运行一个优化表分区,分区它占用大量内存(15G)。我认为合并应该以流的方式进行?有没有可以设置为上限的设置?
    • @saurabhdaga 这是一个复杂的问题,最好在单独的问题中提出。但无论如何,有两种类型的合并垂直和水平。垂直使用较少的内存,您可以强制一个表使用它。它也采用流式传输方式——但如果你存储长字符串——即 10KB——10k*8k*16(parts) ~ 1.2GB,则在缓冲区中缓冲 8k 行。您可以使用 merge_max_block_size 调整行数。另一个故事 AggregatingMT - 状态(Uniq - HLL)可以是巨大的 1MB - 10 MB。因此,如果不知道有关您的表格的详细信息,很难回答 - 偶数列确实很重要。
    猜你喜欢
    • 2020-10-12
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2015-08-30
    • 1970-01-01
    相关资源
    最近更新 更多