TLDR
作为我们使查询大型数据集比以往更容易的努力的一部分,我们很高兴地宣布 sql.clickhouse.com 的可用性!这个新的 SQL playground 拥有超过 35 个数据集和 220 个示例查询,可帮助您入门。我们还 включили 一些简单的图表功能,我们计划改进这些功能,以及保存和共享查询的功能!试用一下,并在社交媒体上或通过 GitHub 仓库 分享您最喜欢的查询,我们将在其中添加它们供其他人欣赏!
背景
作为 ClickHouse 用户,我们对数据集充满热情。我们甚至有一个内部 Slack 频道,恰如其分地命名为“数据爱好者”,用于分享有趣的数据集以进行实验和功能测试!从历史上看,我们记录了这些数据集,并尝试提供示例查询以帮助用户入门。虽然我们还在公共 ClickHouse 实例中提供了许多这些数据集,也在我们的文档中引用过,但这使用了 ClickHouse 附带的经典 Play 界面。
这个 Play 界面经过刻意简化,非常适合入门:它没有依赖项,并且是一个单独的 HTML 文件。
然而,这并没有为我们的 playground 提供我们想要的丰富用户体验。理想情况下,我们想要一些用户可以导航和保存示例查询的东西,同时支持语法高亮、自动完成、查询参数、结果导出、基本图表和丰富的共享功能。这些功能将允许用户探索数据集,并有望帮助用户开始使用 ClickHouse 并分享他们的问题。
幸运的是,我们最近为我们的 CryptoHouse 演示 构建了一个 UI,用户可以在其中免费查询超过 100TB 的区块链数据 - 包括 Solana、Ethereum 和 Polymarket。构建此 UI 的目的也是为了可重用,受益于重用我们自己的 ClickHouse Cloud SQL 控制台的一些经验和代码。通过一些增强,我们能够快速重新调整此演示的用途,并且我们还借此机会重新组织和编目我们现有的演示数据集。凭借超过 35 个数据集,总计 60 TB(并且还在增长!),我们还加载了文档和博客中的所有 220 个示例查询,以帮助用户入门。
我们的文档和博客将越来越多地引用这个环境,最近的 MTA 博客已经从这个新的 playground 中受益。
喜欢使用 clickhouse-client 或希望将服务集成到他们自己的应用程序中的用户,可以直接连接到 ClickHouse 实例 sql-clickhouse.clickhouse.com,例如
clickhouse client --host sql-clickhouse.clickhouse.com --secure --user demo --password ''
使用 ClickHouse 构建 UI 变得简单
demo-ui 仍然是一个使用 NextJS 和 React 构建的单页应用程序,其中客户端发出所有请求。正如我们在 中详细描述的那样,在我们的 关于使用 ClickHouse 和 HTTP 构建单页应用程序的博客文章 中,这是通过一些关键的 ClickHouse 功能实现的
- HTTP 接口 & REST API - 使从 Javascript 使用 SQL 查询 ClickHouse 变得非常简单。默认情况下,ClickHouse 监听端口 8123 或 8443(如果使用 SSL),后者在 ClickHouse Cloud 中公开。此接口包括对 HTTP 压缩和会话的支持。
- 输出格式 - 支持超过 70 种输出数据格式,包括 20 种 JSON 子格式,允许使用 Javascript 轻松解析。
- 查询参数 - 允许查询被模板化,并对 SQL 注入保持健壮性。
- 基于角色的访问控制 - 允许管理员限制对特定表和行的访问。
- 查询复杂性限制—我们限制用户为只读,并限制查询复杂性和可用资源。在 Playground 中,我们限制用户每次查询读取 100 亿行,并在结果集中返回 1000 行。
- 配额 - 限制来自任何特定客户端(通过 IP 地址键控)的查询数量,从而防止恶意客户端或恶意客户端压垮数据库。在 Playground 中,用户每小时最多可以进行 60 次查询。
后三者在这里尤为重要,因为它们允许我们将演示背后的 ClickHouse Cloud 实例暴露给公共互联网,并安全地暴露只读凭据。有关所用 ClickHouse 的确切配置的更多详细信息,请参阅 此处。
UI 还大量使用了我们的组件库 click-ui。该库提供了一组与我们自己的品牌保持一致并提供一组固定的行为的 React 组件。该库是我们 Cloud UI 的支柱,可快速加速开发,避免花费数小时“像素推送”来获得恰到好处的外观。当您想为演示快速行动时,这尤其有用!
最后,我们想提及 Apache Echarts。这个图表库易于集成且文档非常完善,使我们能够以最小的努力提供图表功能。
运行高性价比的演示 Playground
虽然演示 Playground 对于任何 OSS 数据库都是必不可少的,但我们也必须经济高效地提供服务。 配额 是其中的一个组成部分,确保公平使用并防止一个用户消耗所有资源。该服务还受益于 ClickHouse Cloud 的存储和计算分离,数据备份在对象存储上。这最大限度地降低了数据存储成本,并允许我们在添加更多演示数据集时无限扩展。
虽然 ClickHouse Cloud 支持自动扩展,但集群目前固定为 3 个节点,每个节点 30 个 vCPU——主要是因为我们预计如果我们的用户采用演示,查询负载将相当恒定。我们监控资源消耗并发出警报,并将根据需求审查这些资源,根据需要进行垂直或水平扩展。
最后,虽然我们当前的数据集是静态的,但我们接下来的努力将集中在确保尽可能多地保持数据集更新。这可能会利用 ClickHouse Cloud 的两个关键功能
- ClickPipes - 一个托管集成平台,使将数据摄取到 ClickHouse 中变得简单。虽然这将要求我们确保数据集更改定期在 Kafka 或对象存储上可用,但这应该大大简化数据加载。
- 计算-计算分离 - 目前处于预览阶段,这提供了创建多个计算节点组的灵活性,每个节点组都有自己的端点,同时共享相同的对象存储。这种架构实现了各种类型工作负载之间的隔离,从而可以进行微调的资源分配。对于 playground,这意味着我们可以为写入分配专用计算,将此工作负载与用户查询隔离(从而不影响其性能),并允许独立扩展以实现更好的成本效益。
一些技术亮点
虽然演示 UI 很简单,但有一个功能值得分享实现细节。ClickHouse 的新用户经常评论说,首次运行查询时,clickhouse-client
中提供的活动查询反馈是亮点之一。
随着用户编写更复杂的查询,此反馈变得越来越重要 - 不仅用于估计查询需要多长时间,还用于其性能和资源消耗。我们渴望确保 Playground 中的用户也可以获得类似的体验,并支持在明显查询可能耗尽复杂性限制(例如,扫描了 100 亿行)且永远无法完成时取消查询。
虽然 ClicKHouse 的 HTTP 接口将在查询执行时 发送响应标头,但浏览器 的 fetch API 不支持这些标头,并且很难读取。虽然存在替代方案,例如,使用在响应流中返回进度的格式,例如 JSONEachRowWithProgress,但这些也不是理想的,并且会产生开销。相反,我们显式地为每个查询分配一个 查询 ID,并使用在固定间隔(每 100 毫秒)运行的单独查询,该查询检查 system.processes 表
SELECT
sum(read_rows) AS read_rows,
sum(total_rows_approx) AS total_rows,
sum(read_bytes) AS read_bytes,
read_rows / max(elapsed) AS rps,
read_bytes / max(elapsed) AS bps,
formatReadableQuantity(read_rows) AS formatted_rows,
formatReadableQuantity(total_rows) AS formatted_total_rows,
formatReadableSize(read_bytes) AS formatted_bytes,
formatReadableQuantity(rps) AS formatted_rps,
formatReadableSize(bps) AS formatted_bps
FROM clusterAllReplicas(default, system.processes)
WHERE (initial_user = 'demo') AND startsWith(query_id, {uuid:String})
此查询在 monitor
用户下运行,该用户在可以读取的行数方面具有较低的复杂性限制,但每小时允许的查询数配额更高。这使我们能够在查询运行时提供有关查询进度的丰富详细信息
贡献查询和数据集
Playground 允许用户在本地保存查询(及其配置的图表)。这仅在浏览器存储中持久存在,尽管您可以通过链接共享查询及其图表。如果您认为某个查询值得记录并与更广泛的社区分享作为官方示例,请在 源示例查询文件 上提出问题或 PR。我们还将确保 贡献给文档的示例查询和新数据集 在 playground 中可用。
正如我们在下面强调的那样,我们希望通过简化示例查询的提交来改善这种体验。
展望未来
我们未来改进 SQL playground 的努力将侧重于三个领域
- 实时数据集 - 确保数据集在新数据可用时得到更新。虽然某些数据集不会发生更改,但其他数据集(例如 GitHub 事件)可以实时更新。我们预计这将是一项循序渐进的努力。
- 共享小部件 - 虽然我们已将文档和博客中的所有示例查询积极链接到新的 playground,但用户最好能够就地运行这些查询。这需要一个查询小部件,我们可以将其嵌入到页面中,并在适当位置呈现结果和图表。同一个小部件随后可以在论坛或基于讨论的格式中使用,以改善我们社区之间的协作。
- 简化共享 - 正如我们在上面指出的那样,共享新数据集和示例查询的过程目前有点繁琐。我们正在探索使此过程更顺畅和更容易的方法。
敬请期待发展!
结论
新的 ClickHouse SQL Playground 是我们社区和数据爱好者探索、实验和分享使用真实世界数据集的见解,同时学习 ClickHouse 的资源。我们希望我们的用户发现 playground 很有价值,并鼓励您分享您的反馈(以及最喜欢的查询)!