首页 > 解决方案 > 在对clickhouse中的各个值求和后计算每秒峰值

问题描述

我目前正在使用 Clickhouse 集群(2 个分片,2 个副本)从我的服务器读取事务日志。日志包含时间戳、传递的字节数、ttms 等字段。我的表结构如下:

CREATE TABLE db.log_data_local ON CLUSTER '{cluster}' (
  timestamp DateTime,
  bytes UInt64,
  /*lots of other fields */
  ) ENGINE = ReplicatedMergeTree('/clickhouse/{cluster}/db/tables/logs/{shard}','{replica}')
PARTITION BY toYYYYMMDD(timestamp)
ORDER BY timestamp
TTL timestamp + INTERVAL 1 MONTH;

CREATE TABLE db.log_data ON CLUSTER '{cluster}'
AS cdn_data.http_access_data_local
ENGINE = Distributed('{cluster}','db','log_data_local',rand());

我正在从 Kafka 摄取数据并使用物化视图来填充此表。现在我需要从这个表中计算每秒的峰值吞吐量。所以基本上我需要总结每秒字节字段,然后找到 5 分钟期间的最大值。

我尝试将 ReplicatedAggregatingMergeTree 与聚合函数一起用于吞吐量,但与直接查询原始表时获得的值相比,我得到的峰值要小得多。

问题是,在创建材料视图以填充峰值时,直接查询分布式表不会给出任何结果,但如果我查询本地表,则只考虑部分数据集。我尝试使用中间表来计算每秒总数,然后创建具体化但我遇到了同样的问题。

这是我的 peaks 表的架构和我正在尝试创建的物化视图:

CREATE TABLE db.peak_metrics_5m_local ON CLUSTER '{cluster}'
(
  timestamp DateTime,
  peak_throughput AggregateFunction(max,UInt64),
)
ENGINE=ReplicatedAggregatingMergeTree('/clickhouse/{cluster}/db/tables/peak_metrics_5m_local/{shard}','{replica}')
PARTITION BY toYYYYMMDD(timestamp)
ORDER BY (timestamp)
TTL timestamp + toIntervalDay(90);


CREATE TABLE db.peak_metrics_5m ON CLUSTER '{cluster}'
AS cdn_data.peak_metrics_5m_local
ENGINE = Distributed('{cluster}','db','peak_metrics_5m_local',rand());

CREATE MATERIALIZED VIEW db.peak_metrics_5m_mv ON CLUSTER '{cluster}'
TO db.peak_metrics_5m_local
AS SELECT
        toStartOfFiveMinute(timestamp) as timestamp,
        maxState(bytes) as peak_throughput,
    FROM (
        SELECT 
            timestamp,
            sum(bytes) as bytes,
        FROM db.log_data_local
        GROUP BY timestamp
    )
    GROUP BY timestamp;

请帮我解决这个问题。

标签: sqlreplicationdistributedclickhouse

解决方案


用 MV 是不可能实现的。MV 是一个插入触发器。

sum(bytes) as bytes, ... GROUP BY timestamp适用于插入的缓冲区并且不从 log_data_local 表中读取数据。

https://github.com/ClickHouse/ClickHouse/issues/14266#issuecomment-684907869


推荐阅读