【发布时间】:2020-12-19 09:19:10
【问题描述】:
我目前正在使用 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;
请帮我解决这个问题。
【问题讨论】:
-
maxState(bytes)*8 as peak_throughput 看起来很可疑,因为 AggregationState 和数字相乘。需要在计算总和的子查询中或外部应用乘法。或者考虑使用 SimpleAggregateFunction 而不是 AggregateFunction。
-
对不起。那是我正在尝试的事情。现在已经编辑了 MV 查询。
标签: sql replication distributed clickhouse