我们如何构建 ClickHouse 内部的数据仓库:一年回顾的思考 【Part2】

图片

本文字数:4105;估计阅读时间:11 分钟

作者:Mihir Gokhale

本文在公众号【ClickHouseInc】首发

图片

一年前,我的同事 Dmitry Pavlov 介绍了我们如何在 ClickHouse Cloud 上构建了公司内部的数据仓库,简称 “DWH”。该数据仓库负责收集各种系统的数据,经过模型处理后,用于 ClickHouse 内部的业务分析和报告。文章详细讨论了 DWH 的一些关键点,包括非规范化的数据集市、安全功能的实施以及基础设施的管理等。

随着 ClickHouse 的不断壮大,这个基于 ClickHouse Cloud 的 DWH 也随之扩展。这篇文章将分享在过去一年中,DWH 如何升级以支持更多元的用户、数据源和访问方式。特别值得一提的是,ClickHouse 和 dbt 这两个核心组件的结合,使得 DWH 实现了更多实时数据处理,并将其转化为定期批量报告——这是传统数据仓库所不具备的优势。这让我们能够从数据中做出更及时、更明智的决策。

什么是数据仓库?

数据仓库是一个集中存储系统,用于整合组织内不同来源的数据,帮助支持业务决策。以下是我们 DWH 架构的概览。

图片

目前,我们已配置了 19 个原始数据源,每小时或每天都会进行数据插入。每天约有 60 亿行、50 TB 的未压缩数据写入 DWH。ClickHouse 会对这些数据进行压缩,目前我们存储了过去两年内收集的 470 TB(压缩后)数据,过去 30 天内增长了 23%。每周大约有 70 个不同用户生成至少一次 SELECT 查询。

DWH 是我们组织中至关重要的系统,多个业务部门都依赖于 DWH 提供的数据,包括领导层、产品、工程、市场、销售和财务。此外,DWH 的预生产环境还被用作测试开源 ClickHouse 版本的金丝雀环境,以便在 ClickHouse Cloud 进行更广泛的升级之前进行测试。

批量报的设置

最初,我们的 DWH 是用于从少量业务系统中导入相对较小的数据量。导入原始数据后,我们会进行处理,生成如“试用次数”和“转化率”这类批量报告,这是数据仓库的核心。最早的批量报告主要依赖于 Airflow,我们当时并未使用 dbt。但随着数据源的不断增加、业务指标的复杂化以及服务的内部需求增长,这种方法已经无法适应新的需求。dbt 是一个开源工具,供数据工程师和分析师使用,它允许团队编写并迭代模块化 SQL 代码,构建数据管道。将 dbt 引入我们的技术架构后,有助于将批量报告的转换逻辑集中管理。

例如,在增加新的数据源时,dbt 允许我们通过时间函数轻松合并不同时间导入的数据,并在数据准备好后触发后续流程。比如,不同来源的数据可能分别在晚上 7:26 和 10:01 插入,而用于 JOIN 操作的逻辑时间戳是 7:00 这样的每小时增量。这样的逻辑可以高度自定义,并能根据业务需求灵活调整。借助 dbt 工具,我们能够更轻松地处理来自 19 个数据源的依赖关系,并自动生成数据血缘图表作为文档。

同时,随着指标的复杂性增加,原先简单的 count() 和 sum() 操作逐渐被更复杂的窗口函数和数据差异化处理所取代,这些操作还会基于外部表中的条件进行过滤。dbt 与 ClickHouse 的 SQL 方言相结合,成为应对日益复杂的业务逻辑的关键工具,也为我们构建了一个更具可扩展性的批量报告系统。

实时数据的集成

在批量报告流程中,构建复杂的业务指标是企业数据仓库的核心能力。ClickHouse 以其在处理 PB 级别数据时的高性能而闻名,可以轻松应对我们输入的数据。但 DWH 的真正优势在于处理新型、独特的实时数据格式,这些数据并不遵循固定的模式或关系(且对这类数据的支持还在持续增强)。这些数据源通常还伴随更大的数据量。

例如,我们的 DWH 中每天向某张表中插入约 40 亿行数据,而整个表的行数已接近一万亿。再比如,我们从 Google Analytics 导入的事件数据,将事件参数存储为嵌套的数组结构,代表 clickhouse.com 上的网页活动。同样,来自 NoSQL 控制平面数据库的数据卸载,则类似于带有灵活模式的嵌套 JSON 结构。

在基础的批量报告系统搭建完成后,我们逐渐将更多的实时数据源纳入报告体系。用户反映,尽管这些实时数据的结构较为松散,查询时需要进行轻量处理(例如,从 JSON 列中提取字段),但这些数据直观易用,且极具价值。我们的营销团队可以更清楚地了解哪些网页访问量最大,支持工程师通过分析客户最近的云端活动日志,能够更快速地诊断出查询问题。与此同时,产品团队也能通过自定义逻辑,更精准地跟踪用户转化事件。

图片

在 DWH 中,我们不仅提供这些实时数据的原始格式,还提供其转换后的聚合状态,例如实时事件的聚合结果。ClickHouse 丰富的函数库和广泛的数据格式支持,使得探索原始实时数据变得简单,用户可以直接通过 SQL 客户端进行临时分析,无需依赖数据工程师。同时,我们利用 dbt 定义了实时数据聚合逻辑,当数据进入 DWH 时,自动生成并存储在独立的表中。我们之所以选择 dbt,是因为它已在我们的其他数据处理流程中使用,这样可以集中管理。然而,这些聚合在 ClickHouse 中也可以通过物化视图等功能进行本地配置。这些实时聚合数据与现有的批量报告结合,用于跟踪“客户查询失败数量”等关键指标。

这种架构使我们能够为实时数据配置类似批量处理的报告管道,同时保留原始记录,以便深入分析。在 ClickHouse Cloud 和 dbt 的协同作用下,用户可以同时利用批量处理报告和实时数据流,进行更加综合的分析。

配置其他访问途径

在 DWH 的初版中,我们选择了 Apache Superset 作为用户访问数据的 BI 工具。Superset 提供了仪表板、SQL 客户端、告警、用户管理等多项核心功能,且开源,方便维护团队统一部署。然而,Superset 也存在局限,特别是它的 SQL 客户端存在一些问题,严重影响了用户体验。

为了解决这一问题,我们启用了 ClickHouse Cloud 的原生 SQL 控制台,作为 DWH 的另一访问方式。SQL 控制台在编写临时 SQL 查询和浏览数据库表与视图方面,表现更优。我们还利用 ClickHouse Cloud API 来管理敏感数据的用户权限,并通过 Google Groups 分配用户角色。许多用户表示,使用 SQL 控制台的体验比 Superset 的原生 SQL 客户端好得多。

针对更专业的使用场景,我们还配置了与 Growthbook 的连接,以便使用 DWH 中的数据进行 A/B 测试。设置 Growthbook 与 ClickHouse Cloud 的连接只需几分钟,并且可以开箱即用,用于分析 A/B 测试结果(即 DWH 中的 SELECT 查询)。Growthbook 能直接查询 DWH 的 ClickHouse Cloud 服务,因此基于日志级别的原始数据进行实验变得非常简单。

此外,我们还设置了从 ClickHouse Cloud 向 Salesforce 导出数据的任务,使销售团队可以在 Salesforce(我们的 CRM 系统)中直接使用 DWH 的数据。由于我们的 Salesforce 实例不支持从静态 IP 地址进行查询,增加了设置难度,并降低了安全性。最终,我们通过将 DWH 数据推送到 S3 存储桶,再让 Salesforce 查询这个存储桶,解决了这一问题。

我们未来对 DWH 的展望

展望未来,我们将继续扩展 DWH,计划通过配置更多的数据源和接纳更多用户来实现。为确保 DWH 能随业务增长而扩展,我们打算将工作负载拆分成可独立扩展的计算组,以实现性能优化和成本节约。

在 DWH 刚建立时,我们只有一个“每小时加载 DAG”任务,这个 ETL 作业通过 Airflow 调度,负责导入所有新数据。当时我们只有少量的数据源和简单的模型架构。然而,随着数据源和模型的增加,单一任务变得不再可扩展:作业执行时间过长,且不同数据模型之间的依赖关系导致任何错误都会影响所有数据的插入。引入 dbt 后,我们将这一任务拆分成了九个进程,服务可靠性也显著提高。这些作业大多仍然是每小时运行一次,因此我们的 ClickHouse Cloud 服务需要全天候运行以处理数据的插入。

即将推出的 ClickHouse Cloud 新功能——计算资源分离——让我们感到非常期待。这将允许我们将 DWH 的计算资源拆分成多个服务,每个服务都可以独立扩展或缩减。比如,我们可以为 BI 工具配置只读服务,关键 ETL 作业使用 24x7 读写服务,而非关键作业则只需要每天更新一次的数据刷新服务。后者在闲置时可以缩减规模,从而大幅节省成本。通过这种方式,我们可以让不同的计算资源独立工作,实现更灵活的扩展。

在 AI 时代,我也非常期待将 AI 融入 DWH。ClickHouse Cloud 已支持 AI 查询构建器,帮助用户编写简单的 SQL 查询。展望未来,我期待能有 AI 商业分析师为那些不熟悉 SQL 的用户提供帮助。此外,许多用户目前需要手动编写每周、每月或每季度的报告,我希望未来能借助 AI 自动生成这些报告,进一步简化流程。

总结思考

在 ClickHouse,我们每周都会通过管理层会议来审视和讨论公司最关键的指标,其中很多直接来自 DWH。随着组织的扩展和 DWH 的发展,我逐渐意识到数据仓库的作用远不止展示仪表板和生成报告。它是一个复杂而强大的系统,通过提供唯一的数据源,促进跨团队的沟通和决策。无论是工程师、营销人员、销售团队、产品经理,还是公司高层,都能依赖相同的信息来做出明智的决定。对于我们的数据仓库,ClickHouse 的强大之处在于,它能轻松将实时数据与批处理报告结合,从而扩展了可查询的数据范围。

征稿启示

面向社区长期正文,文章内容包括但不限于关于 ClickHouse 的技术研究、项目实践和创新做法等。建议行文风格干货输出&图文并茂。质量合格的文章将会发布在本公众号,优秀者也有机会推荐到 ClickHouse 官网。请将文章稿件的 WORD 版本发邮件至:Tracy.Wang@clickhouse.com

​​联系我们

手机号:13910395701

邮箱:Tracy.Wang@clickhouse.com

满足您所有的在线分析列式数据库管理需求

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/442535.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

外贸财务管理必备,6款热门软件优势对比

外贸企业的财务管理面临着多币种结算、汇率波动、跨境支付等复杂问题。本文将盘点Zoho Books、KashFlow、Sage Intacct等六款热门的外贸财务软件,并探讨它们各自的优势与特点,以帮助外贸企业做出明智的选择。 一、Zoho Books Zoho Books是一款面向中小企…

RNN(循环神经网络)简介及应用

一、引言 在深度学习领域,神经网络被广泛应用于各种任务,从图像识别到语音合成。但对于序列数据处理的任务,如自然语言处理(NLP)、语音识别或时间序列预测等,传统的前馈神经网络(Feedforward N…

docker compose入门5—创建一个3副本的应用

1. 定义服务 version: 3.8 services:web:image: gindemo:v2deploy:replicas: 3ports:- "9090" 2. 启动服务 docker compose -f docker-compose.yml up -d 3. 查看服务 docker compose ps 4. 访问服务

如何使用jmeter进行压测

简介: 1.概述 一款工具,功能往往是很多的,细枝末节的地方也很多,实际的测试工作中,绝大多数场景会用到的也就是一些核心功能,根本不需要我们事无巨细的去掌握工具的所有功能。所以本文将用带价最小的方式讲…

相亲交友系统源码开发:构建高效互动平台的技术探索

在数字化时代,相亲交友系统已成为人们寻找伴侣、拓展社交圈的重要方式之一。这类平台不仅促进了人与人之间的连接,还通过算法匹配、兴趣筛选等功能,提高了用户找到合适伴侣的效率。本文将从技术角度出发,探讨相亲交友系统源码开发…

[paddle]paddleseg快速开始

快速开始 为了让大家快速了解PaddleSeg,本文档使用一个简单示例进行演示。在实际业务中,建议大家根据实际情况进行调整适配。 在开始下面示例之前,请大家确保已经安装好PaddleSeg开发环境(安装说明)。 1 准备数据 …

Java->优先级队列(堆)

一、优先级队列 1.概念 数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象。这种数 据结构就是优先级队列(Priority Queue)。 2.堆的概念 把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中 3.堆的性质 …

python中,try-except捕获异常的意义(通过ai智库学习)

python中,不但可以用try-except捕获异常, 还可以自定义异常提示字符串,更可以自定义捕获异常后的处置。 (笔记模板由python脚本于2024年10月03日 06:47:06创建,本篇笔记适合喜欢研究python的coder翻阅) 【学习的细节是欢悦的历程】…

基于SSM车位租赁系统【附源码】

基于SSM车位租赁系统 效果如下: 注册页面 首页展示 车位租赁订单展示 车位列表页面 公告信息管理页面 公告类型管理界面 研究背景 随着经济的持续增长和城市化进程的加速,土地资源变得日益紧缺,停车难问题已成为许多城市面临的共同挑战。随…

【JavaEE】——文件IO

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 一:认识文件 1:文件的概念 2:文件的结构 3:文件路径…

No package nodejs available.No package npm available.

安装nodejs时出现的报错 这个错误的原因是当前的 yum 源没有包含 Node.js 和 npm 的安装包。 解决方法 使用 NodeSource 仓库 curl -fsSL https://rpm.nodesource.com/setup_14.x | bash -运行 yum install 安装 Node.js 和 npm: yum install -y nodejs使用 E…

登录注册静态网页实现(HTML,CSS)

实现效果图 实现效果 使用HTML编写页面结构,CSS美化界面,点击注册,跳转到注册界面,均为静态网页,是课上的一个小作业~ 使用正则表达式对输入进行验证,包括邮箱格式验证,用户名格式验证。 正则…

YOLO 二元分类器

YOLO 二元分类器 在评估二元分类器性能时,TP、FP、TN和FN是四个核心指标,它们分别代表真阳性、假阳性、真阴性和假阴性。以下是这些指标的定义、计算方法以及在实际应用中的意义: 定义 TP(真阳性):模型正…

嵌入式 c 内存堆栈增长方向往低地址方向好处

如下是堆和栈内存空间使用方式有如下好处: 1、stack从高地址向低地址扩展,这样栈空间的起始位置就能确定下来;如果反向,则要考虑这个起点从哪里合适,要确定堆的大小。 2、可以共用中间部分区域空间,最大化…

kafka-windows集群部署

kafka-windows集群部署目录 文章目录 kafka-windows集群部署目录前言一、复制出来四个kafka文件夹二、修改集群每个kafka的配置文件四、启动zookeeper,kafka集群 前言 部署本文步骤可以先阅读这一篇博客,这篇是关于单机kafka部署测试的。本文用到的文件…

Linux驱动学习——内核编译

1、从官网下载适合板子的Linux内核版本 选择什么版本的内核需要根据所使用的硬件平台而定,最好使用硬件厂商推荐使用的版本 https://www.kernel.org/pub/linux/kernel/ 2、将压缩包复制到Ubuntu内进行解压 sudo tar -xvf linux-2.6.32.2-mini2440-20150709.tgz 然…

职场上的人情世故,你知多少?这五点一定要了解

职场是一个由人组成的复杂社交网络,人情世故在其中起着至关重要的作用。良好的人际关系可以帮助我们更好地融入团队,提升工作效率,甚至影响职业发展。在职场中,我们需要了解一些关键要素,以更好地处理人际关系&#xf…

前端练习小项目 —— 让图片变得更 “色”

前言:相信读者在学习完了HTML、CSS和JavaScript之后已经想要迫不及待的想找一个小型的项目来练练手,那么这篇文章就正好能满足你的 “需求”。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 在开始学习…

详解JavaScript中函数式编程

函数式编程 JS并非函数式编程语言,但可以应用函数式编程技术,这种风格很多语言都用,例如Java. 使用函数处理数组 假设有一个数组,数组元素都是数字,我们想要计算这些元素的平均值和标准差。使用非函数式编程风格的话…

微信小程序python+uniapp毕业论文选题系统设计与实现 lj141

目录 项目介绍具体实现截图开发者工具介绍技术路线性能/安全/负载方面开发语言以及框架介绍python-flask核心代码部分展示python-django核心代码部分展示详细视频演示源码获取 项目介绍 考虑到实际生活中在毕业论文选题管理方面的需要以及对该系统认真的分析,将小程序权限按管…