此博客文章是系列的一部分
介绍
在 ClickHouse,我们热衷于支持我们的生态系统。这包括在可视化数据时为用户提供尽可能广泛的选择范围。本博客系列的每一部分都将探讨一个在 ClickHouse 中可视化数据的选项:Grafana、Superset 和 Metabase。
虽然这些工具都可以与插入 ClickHouse 的几乎所有类型的数据一起使用,但它们各有优势。我们提到了这些工具何时可能适用,并展示了我们认为令人印象深刻的功能。
通常,关于可视化工具的决定取决于适用于您数据类型的特定功能集,或者只是您的用户个人喜好。虽然我们希望这篇文章能帮助您做出任何必要的选择,但我们鼓励用户尝试它们!所有这些工具都是免费使用的,而且很容易上手。
这篇文章引用了我们“将数据导入 ClickHouse”博客系列[1][2][3] 中的数据集。这些数据集在我们 play.clickhouse.com 环境的 blogs
数据库中可用。用户应该能够使用 explorer
用户(无需密码)复制所有示例。
Grafana
自 2014 年作为 Kibana 的分支诞生以来,Grafana 已成为最流行的时间序列数据可视化技术之一。代码早已偏离了其 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。由于 Grafana 专注于时间序列数据,因此大多数图表都要求用户定义一个 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 和数字列之外,还需要一个字符串列。因此,此字符串列定义了序列键。下面,我们利用我们 以前文章 中的汇率数据集,显示各种以 USD 为基准的货币对的价格。请注意,我们在此使用带有过滤器 $__timeFilter
的 SQL 查询,该过滤器会自动将我们选择的时间范围作为过滤器注入到查询中 - 从而允许我们深入挖掘。我们使用 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 使用案例。
如果您对最新技术充满热情,并且对开源充满热情,我们目前正在招聘我们的 集成团队,并希望收到您的来信。