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存储过程,触发器,支持标准数据库事务 ...
随机推荐
- java基础-多线程-线程组
线程组 * Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制. * 默认情况下,所有的线程都属于主线程组. * public fi ...
- macos停止MySQL服务
1.命令行中 使用 find /usr -name mysql 查找自己电脑中MySQL的安装位置 例如我查找到我电脑MySQL安装位置是 /usr/local/Cellar/mysql@5.6/5 ...
- Python入门-深入了解数据类型以及方法
写在开始:每一种数据类型,有对应一种功能,面对不同的问题,使用不同类型. 1.全部数据类型 1.2数值型:解决数字的计算问题 #基础的计算,求除结果,求商,求余数 print(10 / 3) prin ...
- numpy教程03---ndarray的运算
欢迎关注公众号[Python开发实战], 获取更多内容! 工具-numpy numpy是使用Python进行数据科学的基础库.numpy以一个强大的N维数组对象为中心,它还包含有用的线性代数,傅里叶变 ...
- 帝国CMS网站地图生成插件
可以生成电脑端也可以生成手机端的地图XML. 安装方法: 这个帝国sitemap插件的安装跟其他插件的安装方式一样,介于可能有人不会安装帝国的插件,就写一下吧,以后你们如果碰到帝国插件也可以参考这个. ...
- linux中LNMP架构和location用法
location 使用Nginx Location可以控制访问网站的路径,但一个server可以有多个location配置, 多个location的优先级该如何区分 location匹配符号 匹配符 ...
- docker中mysql导入sql文件
1.先将文件导入到容器 docker cp **.sql [容器名]:/root/ 2.进入容器 docker exec -ti [容器名/ID]/bin/bash 3.将文件导入数据库 mysql ...
- 基于kubernetes的分布式限流
做为一个数据上报系统,随着接入量越来越大,由于 API 接口无法控制调用方的行为,因此当遇到瞬时请求量激增时,会导致接口占用过多服务器资源,使得其他请求响应速度降低或是超时,更有甚者可能导致服务器宕机 ...
- 今天写了一个可以测试并发数和运行次数的压力测试代码。(Java)
今天写了一个可以测试并发数和运行次数的压力测试代码 介绍一下为什么会写这么一个工具. 介绍一个这个工具怎么用的. 背景 最近在开发CoapServer端,以及模拟设备侧发送数据调用开发好的CoapSe ...
- 使用 shell 脚本自动获取发版指标数据
问题背景 大一点的公司都会建立一套规章流程来避免低级错误,例如合入代码前必需经过同行评审:上线前必需提测且通过 QA 验证:全量前必需经过 1%.5%.10%.20%.50% 的灰度过程.尤其是最后一 ...