博客 / 产品

ClickHouse 2022年6月新闻通讯:物化视图,但仍然是实时的

author avatar
Christoph Wurm
2022年6月9日 - 8 分钟阅读

欢迎来到北半球的夏天,以及您每月一次的 ClickHouse 精华内容。此外,我们的常规五月版本为那些运行大型内存密集型工作负载的用户带来了新功能,我们讨论了查询不完整的时间序列数据,并为您带来一些阅读材料,供您在花园或阳台上享受。

近期活动

为此标记您的日历

ClickHouse v22.6 版本发布网络研讨会

  • 时间? 6月16日星期四 上午9点(太平洋夏令时)/ 下午5点(格林威治标准时间)
  • 如何加入? 在此注册

ClickHouse v22.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 子句,它组合了来自两个表的值,以及补充的 WHERE 条件。

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

阅读角

我们一直在阅读的内容

  1. 我们在新的 AWS Graviton 3 机器上对 ClickHouse 进行了基准测试——结果令人印象深刻,请看一看
  2. ClickHouse 的鲜为人知的功能:使用无头 ClickHouse 进行数据转换、用户定义的函数、对文件和其他数据库的查询、匿名化数据以及其他很酷的内置 ClickHouse 功能。
  3. ClickHouse 的活跃提交者 (349) 比任何其他开源数据库都
  4. ClickHouse Inc. 首席执行官 Aaron Katz 在 dbt 的“分析工程播客”中发表了讲话
  5. Apache SeaTunnel,一个高性能数据集成框架,增加了对使用 clickhouse-local 离线生成 ClickHouse 数据文件的支持,并在此处对此进行了介绍
  6. Yugabyte 撰写了关于使用 Debezium 和 Kafka 将变更数据捕获 (CDC) 流写入 ClickHouse 的文章。
  7. 新的 ClickHouse 采用者**:**本月人数众多!欢迎 UptraceLuabaseJunePoeticMetricWebGazerGraphQL HiveXenossClickVisualG-Core LabsTeamAptQuickCheck。也让自己被添加进来吧!

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

ClickHouse 团队

Maxim Hopman 在 Unsplash 上的照片

分享这篇文章

订阅我们的新闻通讯

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