这篇博文是系列文章的一部分
简介
在 ClickHouse,我们热衷于支持我们的生态系统。这包括在数据可视化方面为用户提供尽可能广泛的选择。本博客系列的每个部分都将探讨在 ClickHouse 中可视化数据的选项:Grafana、Superset 和 Metabase。
虽然这些工具中的每一个都可以用于几乎任何类型插入到 ClickHouse 中的数据,但它们各自都有优势。我们探讨了这些工具可能适用的场景,并且每个工具都展示了我们认为令人印象深刻的功能。
通常,关于可视化工具的决策取决于适用于您的数据类型的特定功能集,或者仅仅是用户的个人偏好。虽然我们希望这篇文章能够帮助您做出任何选择,但我们鼓励用户尝试它们!所有这些工具都可以免费使用,并且入门非常简单。
这篇文章引用了我们“将数据导入 ClickHouse”博客系列[1][2][3] 中的数据集。这些数据集在我们的 play.clickhouse.com 环境的 blogs
数据库中可用。用户应该能够使用 explorer
用户(无需密码)重现所有示例。
Grafana
Grafana 最初于 2014 年作为 Kibana 的一个分支而诞生,现已发展成为最流行的时序数据可视化技术之一。代码早已与其 Kibana 根源分道扬镳,扩展了对数据存储的支持,添加了新的可视化效果,并扩展到简单的仪表板工具之外。虽然适用于 BI 用例,但它主要侧重于服务可观测性用例,并为日志和追踪提供出色的专用视图支持。
在 ClickHouse,我们继续与 Grafana 团队密切合作,投资于官方 OSS ClickHouse 插件,使用户能够轻松地实时可视化数据。我们最近发布了 ClickHouse Grafana 插件 2.x 版本,其中包括期待已久的功能,如 JSON 和 HTTP 支持。在我们的示例中,我们使用 Grafana Cloud,它提供慷慨的免费层级,足以查询我们 ClickHouse Cloud 服务中的数据。有关安装官方 ClickHouse 插件的说明,请参见此处。这些说明对于自管理实例应该是相同的。
要将 Grafana 连接到 ClickHouse,用户只需创建一个 ClickHouse 数据源 - 实际上是插件的一个实例。用户可以创建多个数据源:每个数据源可能连接到不同的 ClickHouse 服务,或者可能使用不同的凭据访问同一实例。我们在下面说明此过程

在 Grafana 中可视化数据需要我们创建一个仪表板。从这里,用户可以添加一个可视化面板,并指定它应使用我们的 ClickHouse 数据源。

创建可视化效果时,用户需要熟悉 SQL 概念。但是,可视化查询构建器可以帮助构建大多数图表类型的 ClickHouse SQL。由于 Granfana 专注于时序数据,因此大多数图表都需要用户定义 DateTime/Date 列以及数值。
在下面的示例中,我们使用 早期文章中的 Hacker News 数据集,创建一个简单的条形图,显示 ClickHouse 随时间的活动。请注意,我们最初如何使用查询构建器开始,然后再直接编辑 SQL 以捕获每月的帖子数。

SELECT count() as `posts per month`, toStartOfMonth(time) as month FROM default.hackernews WHERE type IN ('comment', 'story') AND (text ILIKE '%ClickHouse%' OR title ILIKE '%ClickHouse%') GROUP BY month ORDER BY month LIMIT 1000✎
多线图,即具有多个系列的图表,除了标准的 Date/DateTime 和数值列之外,还需要一个字符串列。因此,此字符串列定义了系列键。下面我们使用来自我们之前的文章的外汇数据集,以显示以美元为基础的各种货币对的价格。请注意,我们在此处使用 SQL 查询和过滤器 $__timeFilter
,它会自动将我们选择的时间范围注入到查询中作为过滤器 - 从而允许我们向下钻取。我们使用 argMax 函数来获取每天的收盘价。最后,我们使用 SETTINGS max_result_rows = 10000
以允许我们从 play.clickhouse.com 获取更大的数据集。

SELECT toStartOfDay(datetime) as time, quote, argMax(bid,datetime) as close FROM blogs.forex WHERE (base ='EUR') AND quote IN ('GBP', 'USD', 'NZD', 'CAD') AND $__timeFilter(datetime) GROUP BY time, quote ORDER BY time ASC, quote ASC SETTINGS max_result_rows=10000✎
对于不太标准的可视化效果,如热图和烛台图,需要更多的工作。烛台图可视化效果需要每个时间段的值,指示开盘价、收盘价(使用 argMin)、最低价和最高价。这自然适合我们的外汇数据集,使我们能够可视化价格如何随时间变化。

SELECT toStartOfDay(datetime) as day, argMin(ask, datetime) as open, argMax(ask,datetime) as close, max(ask) as high, min(ask) as low FROM blogs.forex WHERE (base ='EUR') AND quote ='USD' AND $__timeFilter(datetime) GROUP BY day ORDER BY day ASC SETTINGS max_result_rows=10000✎
Grafana 中的热图要求我们对地理数据进行分桶,并提供一个数值来控制颜色比例。来自之前文章的天气数据集为我们提供了一种简单的方法来演示这一点。我们使用 ClickHouse geoHashEncode 函数来聚合我们的 Point 字段,找到每个网格记录的最高温度。然后可以使用 GeoMap 可视化效果将这些绘制为热图,以显示美国和墨西哥最热的地区。请注意通过多边形字典进行的地理限制 - 此处探讨的过滤器优化。

SELECT geoHash, geohashDecode(geoHash) as lon_lat, max(tempMax)/10 as max_temp FROM blogs.noaa WHERE date > '1970-01-01' and dictGet(blogs.country_polygons, 'name', location) IN ('United States of America', 'Mexico') GROUP BY geohashEncode(location.1, location.2, 3) as geoHash SETTINGS max_result_rows = 100000✎
以上示例侧重于我们之前文章中的数据集。然而,Grafana 通常用于可观测性用例。虽然一篇专门介绍 Grafana 与可观测性数据结合使用的文章是合理的(即将推出!),但在这里我们演示了使用 play.clickhouse.com 中可用的 JSON 日志数据 在 Grafana 的日志浏览器中构建简单视图。我们将此数据偏移到过去 24 小时,以简化可视化。请注意,我们还从状态代码创建了一个级别字段,以确保我们的日志被分类和颜色编码。

SELECT now() - (toDateTime('1998-05-08 13:44:46') - timestamp) AS log_time, multiIf(message.status > 500, 'critical', message.status > 400, 'error', message.status > 300, 'warning', 'info') AS level, message.request.method AS method, message.status AS status, message.size AS size, message.request AS log FROM blogs.http_logs ORDER BY timestamp DESC LIMIT 10000✎
结论
在这篇文章中,我们展示了一些使用 Grafana 插件的简单可视化技术。下次我们将探讨 Superset 及其对 BI 用例的更大关注。
如果您对最新技术充满热情,并且对开源充满热情,我们目前正在为我们的集成团队招聘,并且很乐意收到您的来信。