DoubleCloud 即将停止服务。在有限时间内,使用 ClickHouse 免费迁移服务迁移到 ClickHouse。立即联系我们 ->->

博客 / 产品

ClickHouse 2022年6月新闻简报:物化视图,但依然实时

author avatar
Christoph Wurm
2022年6月9日

欢迎北半球的夏季,也欢迎您每月必读的 ClickHouse 精彩内容。此外,我们定期的 5 月份版本为运行大型内存密集型工作负载的用户提供了新功能,我们讨论了查询不完整的时间序列数据,并在最后为您提供了一些阅读材料,供您在花园或阳台上享受。

即将举行的活动

请在您的日历上标记以下活动

ClickHouse v22.6 版本网络研讨会

  • 何时举行?太平洋标准时间 6 月 16 日星期四上午 9 点 / 格林威治标准时间下午 5 点
  • 如何参加?在此处注册 此处

ClickHouse v22.5

我们定期的每月 5 月份版本有哪些内容

  1. 内存超配 在 22.2 版本中,我们发布了内存超配作为一项实验性功能。它包括软限制和硬限制,允许查询在可能的情况下超出软限制,从而更轻松地在同一 ClickHouse 实例上运行非常不同的查询。在 22.5 中,内存超配默认启用,并且旧的 max_memory_usage 设置已从默认设置中删除。
  2. 并行哈希连接 一种新的连接类型将连接拆分为多个块并并行执行它们。这对于大型连接尤其有用,在大型连接中,高并行性可以将查询执行时间缩短 80% 以上。通过设置 join_algorithm = 'parallel_hash' 在您的连接查询中尝试此功能。
  3. 分组集 GROUP BY 有一个新的修饰符 GROUPING SETS,它允许您指定按任何列聚合。顺便说一下,您是否知道现有的修饰符 WITH TOTALSWITH ROLLUPWITH CUBE
  4. FIPS 我们切换到更新的 BoringSSL 模块,ClickHouse 现在符合 FIPS 标准!
  5. 最后,我们还添加了一个新设置,该设置(如果启用)会导致“不可避免的、无法避免的、致命的和危及生命的性能下降”。我们让您自己找出它是什么。不要在生产环境中使用它。

查看版本网络研讨会幻灯片录制视频,并请升级(除非您想保留在 LTS 版本上)。

本月查询:物化视图,但依然实时

ClickHouse 通常用于存储高频时间序列数据。例如,金融行情数据(股票、债券、加密货币等价格)或传感器数据。

此类数据的一个特征是,为了获得完整准确的图像,通常需要查看可能很远的历史数据。例如,并非每个股票的每条行情记录都包含在金融网站或移动应用程序上显示股票实时摘要所需的所有信息——通常至少包括当前价格以及最近的开盘价、低/高价、52 周低/高价和成交量。这有多种原因,但主要是因为其中许多数据不会发生变化——开盘价在一天中保持不变,因此没有理由将其包含在每条记录中。

类似地,物联网设备或传感器可能会报告各种指标,例如不同位置的几个温度值、压力、电压、流速和/或许多其他内容。在给定时间点,这些数据通常可能是不完整的——数据延迟到达、设备暂时或永久离线、并非所有信息都始终被测量等。

为了仍然能够使用 ClickHouse 获取数据的准确图像,通常需要使用从给定时间戳开始的“时间点查询”——这可能是当前时间或过去某个有意义的时间点。在 ClickHouse 中编写查询以查找存储为单独列的不同指标的最新值的常用方法是使用 argMax(arg, val) 函数。对于给定的列 val,它将找到最大值并返回相应的 arg 列。对于时间序列数据集,这将类似于 argMax(temp, timestamp) 查找最新的温度读数。

由于频繁的查询(例如阈值警报触发器)可能不仅查看单个列,因此查询最终通常如下所示

SELECT device_id, timestamp,
	argMax(temp1, timestamp),
	argMax(pressure, timestamp),
	argMax(flowRate, timestamp)
FROM readings
WHERE device_id IN (<list_of_devices>)
GROUP BY device_id

事实证明,这是一个非常昂贵的查询!对于每个 device_idargMax 函数,ClickHouse 需要扫描所有记录,直到找到最新值。

加速此类查询的常用方法是使用物化视图,预先聚合给定时间段内所有设备的最新值。但是,这仅在预先知道所有指标(永远不会添加新列)的情况下才能正常工作,并且它将降低数据的粒度,不再允许对任意时间戳进行准确的时间点查询。相反,您可以将两者结合起来,既获得物化视图的性能改进,又获得查询原始数据的灵活性。该方法是生成物化视图并使用它查询所有历史数据,但将其与最新的请求时间戳之前的实时数据相结合。

首先创建一个汇总表,物化视图将向其中写入数据的 15 分钟摘要(或任何其他有意义的间隔,例如 5 分钟或 1 小时)

CREATE TABLE readings_15min
	device_id LowCardinality(String),
	timestamp_start DateTime64,
	temp AggregateFunction(argMax, Nullable(Float64), DateTime64),
	pressure AggregateFunction(argMax, Nullable(Float64), DateTime64),
	flowRate AggregateFunction(argMax, Nullable(Float64), DateTime64)
ENGINE = AggregatingMergeTree
ORDER BY (timestamp_start, device_id)

创建物化视图

CREATE MATERIALIZED VIEW readings_mv TO readings_15min 
AS SELECT toStartOfFifteenMinutes(timestamp) AS timestamp_start,
	device_id,
	argMaxState(temp, timestamp) AS temp,
	argMaxState(pressure, timestamp) AS pressure,
	argMaxState(flowRate, timestamp) AS flowRate
FROM readings
GROUP BY device_id, toStartOfFifteenMinutes(timestamp)

查询时,将物化视图中的数据与原始数据中最新的数据相结合,在最终聚合中组合结果以获得正确的结果

WITH '2022-06-06 15:02:00'::DateTime64 as point_in_time
SELECT
	device_id,
	argMax(temp, timestamp_outer) as temp,
	argMax(pressure, timestamp_outer) as pressure,
	argMax(flowRate, timestamp_outer) as flowRate
FROM
	(SELECT max(timestamp_start) as timestamp_outer,
       device_id,
       argMaxMerge(temp) as temp,
       argMaxMerge(pressure) as pressure,
       argMaxMerge(flowRate) as flowRate
	FROM readings_15min 
	WHERE timestamp_start <= toStartOfFifteenMinute(point_in_time)
	GROUP BY device_id
	UNION ALL
	SELECT max(timestamp) as timestamp_outer,
		device_id
		argMax(temp, timestamp) as temp,
		argMax(pressure, timestamp) as pressure,
		argMax(flowRate, timestamp) as flowRate
	FROM readings
	WHERE timestamp BETWEEN toStartOfFifteenMinute(point_in_time) AND point_in_time
	GROUP BY device_id)
GROUP BY device_id

请注意 UNION ALL 子句将来自两个表的 Value 组合在一起,以及补充的 WHERE 条件。

在最近对超过 2 亿行数据集的测试中,这种方法将查询时间缩短了 98%!

阅读角

我们一直在阅读什么

  1. 我们在新的 AWS Graviton 3 机器上对 ClickHouse 进行了基准测试——结果令人印象深刻,请查看
  2. ClickHouse 鲜为人知的功能:使用无头 ClickHouse 进行数据转换、用户定义函数、对文件和其他数据库的查询、匿名化数据以及其他很酷的 ClickHouse 内置功能。
  3. ClickHouse拥有比任何其他开源数据库都多的活跃提交者(349 个)!
  4. ClickHouse Inc. 的首席执行官 Aaron Katzdbt 的“分析工程播客”中发表了讲话。
  5. Apache SeaTunnel 是一个高性能数据集成框架,它添加了对使用 clickhouse-local 生成 ClickHouse 数据文件的功能,并在此处写道。
  6. Yugabyte写道关于使用 Debezium 和 Kafka 将更改数据捕获 (CDC) 流写入 ClickHouse。

  7. **新增 ClickHouse 用户**:**本月新增用户众多!欢迎 UptraceLuabaseJunePoeticMetricWebGazerGraphQL HiveXenossClickVisualG-Core LabsTeamAptQuickCheck 加入我们。您也可以加入!

感谢您的阅读。我们下个月再见!

ClickHouse 团队

照片由 Maxim HopmanUnsplash 上拍摄

分享此文章

订阅我们的时事通讯

随时了解功能发布、产品路线图、支持和云服务!
正在加载表单...
关注我们
Twitter imageSlack imageGitHub image
Telegram imageMeetup imageRss image