Clickhouse实时数仓建设
1.概述
Clickhouse是一个开源的列式存储数据库,其主要场景用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告。今天,笔者就为大家介绍如何使用Clickhouse来构建实时数仓,来满足一些实时性要求较高的使用场景。
2.内容
2.1 什么是OLAP场景
在介绍Clickhouse构建实时数仓之前,我们先来了解一下OLAP的使用场景,通常OLAP的使用场景包含如下特征:
- 绝大多数是读取请求;
- 数据以相当大的Batch进行更新;
- 已存储的数据不能随意修改;
- 对于读取,从数据存储中提取相当多的行,但是只提取列的一小部分;
- 大宽表,即每个表包含着大量的列;
- 查询相对较少(QPS很小);
- 对于简单查询,允许有较低的延迟,比如50ms~100ms;
- 列中的数据相对较小,比如字符串长度很短;
- 处理单个查询时需要高吞吐量;
- 事务非必须;
- 对数据一致性要求低;
- 每一个查询有一个大表,除了它其他都是很小的;
- 查询结果明显小于源数据。
通过观察这些特征,我们可以看出,对于OLAP场景与其他业务场景(比如OLTP、KV等)有所不同,因此想要使用OLTP或者KV来高效的处理数据分析查询场景,并不是非常完美的解决方案。
2.2 Clickhouse更适合OLAP的原因
Clickhouse更适合OLAP场景,对于大多数查询而言,处理速度至少提高了100倍,下面我们可以通过图片来详细了解其中的原因:
2.2.1 行式

2.2.2 列式

接下来,给大家分析一下这2张图发生了什么。
2.2.3 输入与输出
- 针对分析类查询,通常只需要读取表的一小部分列。在列式数据库中你可以只读取你需要的数据。例如,如果只需要读取100列中的5列,这将帮助你最少减少20倍的 I/O 消耗;
- 由于数据总是打包成批量读取的,所以压缩是非常容易的。同时数据按列分别存储这也更容易压缩。这进一步降低了 I/O 的体积;
- 由于 I/O 的降低,这将帮助更多的数据被系统缓存。
例如,查询 “统计每个广告平台的记录数量” 需要读取 “广告平台ID” 这一列,它在未压缩的情况下需要 1 个字节进行存储。如果大部分流量不是来自广告平台,那么这一列至少可以以 10 倍的压缩率被压缩。当采用快速压缩算法,它的解压速度至少在 10 亿字节(未压缩数据)每秒。换而言之,这个查询可以在单个服务器上以每秒大约几十亿行的速度进行处理。这实际上是当前实现的速度。
2.2.4 CPU
由于执行一个查询需要处理大量的行,因此在整个向量上执行所有操作将比在每一行执行所有操作更加高效。同时,这将有助于实现一个几乎没有调用成本的查询引擎。如果你不这样来操作,使用任何一个机械硬盘,查询引擎都不可避免的停止CPU进行等待。所以,在数据按列存储并且按列执行是很有意义的。
这里有两种方法可以来实现这一点,它们分别是:
- 向量引擎:所有的操作都是为向量而不是为单个值编写的。这意味着多个操作之间不再需要频繁的调用,并且调用的成本基本可以忽略不计。操作代码包含一个优化的内部循环;
- 代码生成:生成一段代码,包含查询中的所有操作。
这是不应该在一个通用数据库中实现的,因为这在运行简单查询时是没有意义的。但是也有例外,比如,MemSQL使用代码生成来减少处理SQL查询的延迟(这里只是为了比较,分析型数据库通常需要优化的是吞吐而不是延迟)。
这里需要注意,为了提高CPU效率,查询语言必须是声明型的(SQL或者MDX),或者至少一个向量(J,K)。查询应该只包含隐式循环,允许进行优化。
2.3 Clickhouse构建实时数仓的场景
一般来说,使用Clickhouse构建实时数仓的场景,主要包含如下:
- 数据探索:通过即席查询做业务上的归因推测;
- 数据看板:展示所关注的核心指标;
- 数据实验:将新的算法模型,放在 A/B 实验平台上做假设验证,看模型是否符合预期;
- 实时监控:对业务指标进行实时监控,观察实时效果。
在上述场景中,使用者都非常看重实时性,希望查询响应速度快。
在引入Clickhouse之前,我们通常使用主流的Hadoop生态来构建数仓,但是,Hadoop生态构建的数仓会有些痛点:
- 时效性差:基本上是分钟级别,甚至是小时级别,导致分析过程偏长;
- 开发周期长:由于传统架构数仓理念的多层架构,使得更新一个指标的成本代价会很高。
- 架构复杂:在一套成熟运行很久的系统框架下,难以实现流批一体,间接导致模块无法复用,代码需要写多套,数据口径难以收敛,数据存储冗余。
经过对业界的主流技术进行调研对比,使用Clickhouse作为OLAP的主要核心引擎,其原因如下:
- 效率:真实数据的实验场景下,Clickhouse要比传统的Hadoop生态(比如Hive)要快很多;
- 开源:数据实验、算法特征等场景的个性化需求,能够对Clickhouse进行引擎层面的改动。
在使用原生Clickhouse时,在数据流量增大时会有很多问题:
- 稳定性:原生的Clickhouse存在设计缺陷,分布式下的Clickhouse集群对Zookeeper存在依赖,随着数据的增长(体量非常大的情况下)Zookeeper会成为Clickhouse瓶颈;
- 门槛较高:需要对Clickhouse有较深的经验积累,对于经验不足和经验丰富的两类人员,部署出来的Clickhouse集群的性能差别会很大。
2.4 ClickHouse生态建设
想要比较好的解决Clickhouse的易用性和稳定性,需要生态来支撑,整体的生态方案有以下几个重要部分,它们分别是:
- 数据网关:用来管理请求,智能分配;
- 数据分流:缓冲大流量数据,读写控制;
- 集群管理:整体集群的数据迁移、数据均衡、容灾切换等;
- 数据监控:查询耗时监控、慢查询分析、异常指标监控等。
基于Clickhouse生态建设,有以下几个典型的应用场景:
1. BI分析与看板
由于数据探索是随机的,很难通过预构建的方式来解决,如果使用Hadoop的生态只能实现小时到分钟的级别。在引入Clickhouse后,在单表千亿级别的数据量下,大多数查询都是很快的,对于数据分析师来说是非常友好的。
2. 实验平台
使用Hadoop生态做 A/B 实验的时候,前一天要把所有的实验数据统计出来,做好预聚合。第二天才能查询实验效果。使用Clickhouse来做实时JOIN,效果非常的好。

3. 实时特征计算
虽然实时特征计算不是Clickhouse的强项,但是通过相关优化,还是可以实现。
4.总结
Clickhouse OLAP的生态相对于Hadoop生态,性能提升是比较明显的,通过流批一体提供更加稳定可靠的服务,使得业务决策更加迅速,实验结论更加准确。
5.结束语
这篇博客就和大家分享到这里,如果大家在研究学习的过程当中有什么问题,可以加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!
另外,博主出书了《Hadoop大数据挖掘从入门到进阶实战》,喜欢的朋友或同学, 可以在公告栏那里点击购买链接购买博主的书进行学习,在此感谢大家的支持。
Clickhouse实时数仓建设的更多相关文章
- 美团点评基于 Flink 的实时数仓建设实践
https://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651749037&idx=1&sn=4a448647b3dae5 ...
- 基于 Kafka 的实时数仓在搜索的实践应用
一.概述 Apache Kafka 发展至今,已经是一个很成熟的消息队列组件了,也是大数据生态圈中不可或缺的一员.Apache Kafka 社区非常的活跃,通过社区成员不断的贡献代码和迭代项目,使得 ...
- 基于Flink构建全场景实时数仓
目录: 一. 实时计算初期 二. 实时数仓建设 三. Lambda架构的实时数仓 四. Kappa架构的实时数仓 五. 流批结合的实时数仓 实时计算初期 虽然实时计算在最近几年才火起来,但是在早期也有 ...
- HBase实战 | 知乎实时数仓架构演进
https://mp.weixin.qq.com/s/hx-q13QteNvtXRpNsE5Y0A 作者 | 知乎数据工程团队编辑 | VincentAI 前线导读:“数据智能” (Data Inte ...
- 基于 Flink 的实时数仓生产实践
数据仓库的建设是“数据智能”必不可少的一环,也是大规模数据应用中必然面临的挑战.在智能商业中,数据的结果代表了用户反馈.获取数据的及时性尤为重要.快速获取数据反馈能够帮助公司更快地做出决策,更好地进行 ...
- (转)用Flink取代Spark Streaming!知乎实时数仓架构演进
转:https://mp.weixin.qq.com/s/e8lsGyl8oVtfg6HhXyIe4A AI 前线导读:“数据智能” (Data Intelligence) 有一个必须且基础的环节,就 ...
- 大数据之Hudi + Kylin的准实时数仓实现
问题导读:1.数据库.数据仓库如何理解?2.数据湖有什么用途?解决什么问题?3.数据仓库的加载链路如何实现?4.Hudi新一代数据湖项目有什么优势? 在近期的 Apache Kylin × Apach ...
- 实时数仓(二):DWD层-数据处理
目录 实时数仓(二):DWD层-数据处理 1.数据源 2.用户行为日志 2.1开发环境搭建 1)包结构 2)pom.xml 3)MykafkaUtil.java 4)log4j.properties ...
- 更强大的实时数仓构建能力!分析型数据库PostgreSQL 6.0新特性解读
阿里云 AnalyticDB for PostgreSQL 为采用MPP架构的分布式集群数据库,完备支持SQL 2003,部分兼容Oracle语法,支持PL/SQL存储过程,触发器,支持标准数据库事务 ...
随机推荐
- Python的组合数据类型
""" Python的组合类型: 序列类型:元素之间存在先后关系,可以通过索引来访问 列表: 元组: 字符串: 映射类型:用键值来表示数据 字典: 集合类型:元素是无序的 ...
- 火狐浏览器Hackbar安装破解
1 下载 https://pan.baidu.com/s/18cKoJAam9by7AB168Im57g 64mt 下载后解压到一个固定文件夹下 2 安装 选择xpi进行安装 3 关闭插件更新 点击插 ...
- numpy教程02---ndarray数据和reshape重塑
欢迎关注公众号[Python开发实战], 获取更多内容! 工具-numpy numpy是使用Python进行数据科学的基础库.numpy以一个强大的N维数组对象为中心,它还包含有用的线性代数,傅里叶变 ...
- OllyDbg---比较、条件跳转指令
比较和条件跳转 CMP 比较两个操作数,相当于SUB指令,但是相减的结果不保存到第一个操作数,而是根据相减的结果来改变零标志位.当两个操作数相等时,零标志位Z置为1. 两个操作数不相等时,零标志位Z被 ...
- python函数基础算法简介
一.多层语法糖本质 """ 语法糖会将紧挨着的被装饰对象名字当参数自动传入装饰器函数中""" def outter(func_name): ...
- oracle各种用户登录的方式
Oracle有3种用户: system.sys.scott 1.system和sys的差别在与是否能创建数据库2.sys用户登录创建数据库,3.scott是给刚開始学习的人学习的用户.学习者能够用Sc ...
- 使用 LOAD DATA LOCAL INFILE,sysbench 导数速度提升30%
1. LOAD DATA INFILE 为什么比 INSERT 快? 2. sysbench 压测 MySQL 的四个标准步骤. 3. 怎么让 sysbench 支持 LOAD DATA LOCAL ...
- Git原理学习记录
Git原理学习记录 1.git init git-test git init 实际上就是在特定的目录下创建对应的目录和文件 2.object $ echo "V1" > ...
- os、sys、json、subprocess模块
今日内容概要 1.os模块 2.sys模块 3.json模块 4.subprocess模块 今日内容详细 os模块 """该模块主要是跟操作系统打交道"&quo ...
- 第十三届蓝桥杯省赛C/C++ B组
@(第十三届蓝桥杯省赛C/C++B组) A顺子日期 答案是1478 B顺子日期 答案14(如果012算的话) C刷题统计 数据范围1e18,所以不能直接暴力,先取余,再暴力剩下的 #include&l ...