大数据-133 ClickHouse 概念与基础|为什么快?列式 + 向量化 + MergeTree 对比

TL;DR

场景:要做高并发低延迟 OLAP,且不想上整套 Hadoop/湖仓。 结论:ClickHouse 的核心在列式+向量化+MergeTree+近似统计;适合即席分析与近实时写入,不适合强事务与高频行级更新。 产出:选型决策表 + 分区/排序键速查卡 + 5 条查询模板(安装/集群放到下一章)。

简要概述

ClickHouse 是一个快速开源的OLAP数据库管理系统,它是面向列的,允许使用SQL查询实时生成分析报告。

随着物联网IOT时代的来临,IOT设备感知和报警存储数据越来越大,有用的价值数据需要数据分析师去分析。大数据分析成了非常重要的环节,开源也为大数据分析工程师提供了十分丰富的工具,但这也增加了开发者选择适合的工具的难度,尤其是新入行的开发者来说。

框架的多样化和复杂度成了很大的难题,例如:Kafka、HDFS、Spark、Hive等等组合才能产生最后的分析结果,把各种开源框架、工具、库、平台人工整合到一起所需的工作之复杂,是大数据领域开发和数据分析师常有的抱怨之一,也就是他们支持大数据分析简化和统一化的首要原因。

从业务维度来分析,用户需求会反向促使技术发展。

简要选型

需求/约束 适合 不适合
高并发、低延迟 OLAP
重事务/强一致 OLTP
近实时写入、即席分析
频繁行级更新/删除 ⚠️(有 mutations 但代价高)
  • 需要强事务/OLTP → 不是 CH
  • OLAP + 近实时 + 自建机房成本敏感 → CH 优先
  • 只做离线、成本不敏感且现有湖仓成熟 → SparkSQL/Trino 也行
  • 预计算立方体 + 报表固化 → Druid/Kylin 也可

OLTP

OLTP:Online Transaction Processing:联机事务处理过程。

应用场景

  • ERP:Enterprise Resource Planning 企业资源计划
  • CRM:Customer Relationship Management 客户关系管理

流程审批、数据录入、填报等

具体特点

线下工作线上化,数据保存在各自的系统中,互不相同(数据孤岛)

OLAP

OLAP:On-Line Analytical Processing:联机分析系统

分析报表、分析决策等。

应用场景

方案1:数仓

如上图所示,数据实时写入HBase,实时的数据更新也在HBase完成,为了应对OLAP需求,我们定时(通常是T+1或者T+H)将HBase数据写成静态的文件(如:Parquet)导入到 OLAP引擎(如HDFS,比较常见的是Impala操作Hive)。这一架构又能满足随机读写,又可以支持OLAP分析的场景,但是有如下缺点:

  • 架构复杂:从架构上看,数据在HBase、消息队列、HDFS间流转,涉及到的环节过多,运维成本也很高,并且每个环节需要保证高可用,都需要维护多个副本,存储空间也有一定的浪费。最后数据在多个系统上,对数据安全策略、监控都提出了挑战。
  • 时效性低:数据从HBase导出静态文件是周期性的,一般这个周期一天(或者一小时),有时效性上不是很高。
  • 难以应对后续的更新:真实场景中,总会有数据是延迟到达的,如果这些数据之前已经从HBase导出到HDFS,新到的变更数据更难以处理了,一个方案是把原有数据应用上新的变更后重写一遍,但这代价又很高。

方案2:ClickHouse、Kudu

实现方案2就是 ClickHouse、Kudu

发展历史 Yandex在2016年6月15日开源了一个数据分析数据库,叫做ClickHouse,这对保守的俄罗斯人来说是个特大事件。更让人惊讶的是,这个列式数据库的跑分要超过很多流行的商业MPP数据库软件,例如Vertica。如果你没有Vertica,那你一定听过Michael Stonebraker,2014年图灵奖的获得者,PostgreSQL和Ingres发明者(Sybase和SQL Server都是继承Ingres而来的),Paradigm4和SciDB的创办者。Micheal StoneBraker于2005年创办的Vertica公司,后来该公司被HP收购,HP Vertica成为MPP列式存储商业数据库的高性能代表,Facebook就购买了Vertica数据用于用户行为分析。

ClickHouse技术演变之路

Yandex公司在2011年上市,它的核心产品是搜索引擎。 我们知道,做搜索引擎的公司营收非常依赖流量和在线广告,所以做搜索引擎公司一般会并行推出在线流量分析产品,比如说百度的百度统计,Google的Google Analytics等,Yandex的Yandex.Metricah。ClickHouse就是在这种背景下诞生的。

  • ROLAP:传统关系型数据库OLAP,基于MySQL的MyISAM表引擎
  • MOLAP:借助物化视图的形式实现数据立方体,预处理的结果存在HBase这类高性能的分布式数据库中
  • HOLAP:R和M的结合体H
  • ROLAP:ClickHouse

ClickHouse 的核心特点

超高的查询性能

  • 列式存储:只读取查询所需的列,减少了磁盘 I/O。
  • 向量化计算:批量处理数据,提高了 CPU 使用效率。
  • 数据压缩:高效的压缩算法,降低了存储成本。

水平可扩展性

  • 分布式架构:支持集群部署,轻松处理 PB 级数据。
  • 线性扩展:通过增加节点提升性能,无需停机。

实时数据写入

  • 高吞吐量:每秒可插入数百万行数据。
  • 低延迟:数据写入后立即可查询,满足实时分析需求。

丰富的功能支持

  • 多样的数据类型:支持从基本类型到复杂类型的数据。
  • 高级 SQL 特性:窗口函数、子查询、JOIN 等。
  • 物化视图:预计算和存储查询结果,进一步提升查询性能。

典型应用场景

  • 用户行为分析:电商、游戏、社交平台的实时用户行为跟踪。
  • 日志和监控数据存储:处理服务器日志、应用程序日志和性能监控数据。
  • 商业智能(BI):支持复杂的报表和数据分析需求。

部署与运维

  • 单机部署:适合测试和小规模应用。
  • 集群部署:用于生产环境,可通过 Zookeeper 进行协调。
  • 运维工具:提供了监控和管理工具,如 clickhouse-client、clickhouse-copier。

最佳实践

  • 数据分区:根据时间或其他字段进行分区,提高查询效率。
  • 索引优化:使用主键和采样键,加速数据定位。
  • 硬件配置:充分利用多核 CPU、高速磁盘和大内存。

ClickHouse支持特性

ClickHouse具体有哪些特性呢:

  • 真正的面向列的DBMS
  • 数据高效压缩
  • 磁盘存储的数据
  • 多核并行处理
  • 在多个分布式服务器上分布式处理
  • SQL语法支持
  • 向量化引擎
  • 实时数据更新
  • 索引
  • 适合在线查询
  • 支持近似预估计算
  • 支持嵌套的数据结构
  • 支持数组作为数据类型
  • 支持限制查询复杂性以及配额
  • 复制数据和对数据完整性的支持

ClickHouse和其他对比

商业OLAP

例如:

  • HP Vertica
  • Actian the Vector

区别:

  • ClickHouse 是开源而且免费的

云解决方案

例如:

  • 亚马逊 RedShift
  • 谷歌 BigQuery

区别:

  • ClickHouse 可以使用自己机器部署,无需云付费

Hadoop生态

例如:

  • Cloudera Impala
  • Spark SQL
  • Facebook Presto
  • Apache Drill

区别:

  • ClickHouse 支持实时的高并发系统
  • ClickHouse不依赖于Hadoop生态软件和基础
  • ClickHouse支持分布式机房的部署

开源OLAP数据库

例如:

  • InfiniDB
  • MonetDB
  • LucidDB

区别:

  • 应用规模小
  • 没有在大型互联网服务中蚕尝试

非关系型数据库

例如:

  • Druid
  • Apache Kylin

区别:

  • ClickHouse 可以支持从原始数据直接查询,支持类SQL语言,提供了传统关系型数据的便利。

真正的面向列DBMS

如果你想要查询速度变快:

  • 减少数据扫描范围
  • 减少数据传输时的大小 在一个真正的面向列的DBMS中,没有任何无用的信息在值中存储。 例如:必须支持定长数值,以避免在数值旁边存储长度数字,10亿个Int8的值应该大约消耗1GB的未压缩磁盘空间,否则这将强烈影响CPU的使用。由于解压的速度(CPU的使用率)主要取决于未压缩的数据量,即使在未压缩的情况下,紧凑的存储数据也是非常重要的。

因为有些系统可以单独存储独列的值,但由于其他场景的优化,无法有效处理分析查询,例如HBase、BigTable、Cassandra和HypeTable。在这些系统中,每秒可以获得大约十万行的吞吐量,但是每秒不会到达数亿行。

另外,ClickHouse是一个DBMS,而不是一个单一的数据库,ClickHouse允许运行时创建表和数据库,加载数据和运行查询,而不用重新配置或启动系统。

之所以称作 DBMS,因为ClickHouse:

  • DDL
  • DML
  • 权限管理
  • 数据备份
  • 分布式存储
  • 等等功能

数据压缩

一些面向列的DBMS(InfiniDB CE 和 MonetDB)不使用数据压缩,但是数据压缩可以提高性能。

磁盘存储

许多面向列的DBMS(SAP HANA和GooglePower Drill)只能在内存中工作,但即使在数千台服务器上,内存也太小,无法在Yandex.Metrica中存储所有浏览和会话。

多核并行

多核并行进行大型的查询。

在多个服务器上分布式处理

上面列出的DBMS几乎不支持分布式处理,在ClickHouse中,数据可以驻留不同的分片上,每个分片可以是用于容错的一组副本,查询在所有分片上并行处理,这对用户来说是透明的。

SQL支持

  • 支持的查询包括 GROUP BY、ORDER BY
  • 子查询在FROM、IN、JOIN子句中被支持
  • 标量子查询支持
  • 关联子查询不支持
  • 真是因为ClickHouse提供了标准协议的SQL查询接口,使得现有可视化分析系统能够轻松的与它集成对接

向量化引擎

数据不仅案列存储,而且由矢量-列的部分进行处理,这使我们能够实现高CPU性能。 向量化执行时寄存器硬件层面上的特性,可以理解为消除程序中循环的优化。 为了实现向量化执行,需要利用CPU的SIMD指令(Single Instrution Multiple Data),即用单条指令处理多条数据。现代计算机系统概念中,它是利用数据并行度来提高性能的一种实现方式,它的原理是在CPU寄存器层面实现数据并行的实现原理。

实时数据更新

ClickHouse支持主键表,为了快速执行对主键范围的查询,数据使用合并树(MergeTree)进行递增排序,由于这个原因,数据可以不断的添加到表中,添加数据时无锁处理。

索引

例如,带有主键可以在特定的时间范围内为特定的客户端(Metrica计数器)抽取数据,并且延迟事件小于几十毫秒。

支持在线查询

我们可以使用该系统作为Web界面的后端,低延迟意味着可以无延迟的实时的处理查询。

支持近似计算

  • 系统包含用于近似计算各种值,中位数和分位数的集合函数
  • 支持基于部分(样本)数据运行查询并获得近似结果,在这种情况下,从磁盘检索比例较少的数据。
  • 支持为有限数量的随机秘钥(而不是所有秘钥)运行聚合,在数据中秘钥分发的特定场景下,这提供了相对准确的结果,同时使用较少的资源。

数据复制和对数据完整性支持

使用异步多主复制,写入任何可用的副本后,数据将分发到所有剩余的副本,系统在不同的副本上保持相同的数据。 要注意的是,ClickHouse并不完美:

  • 不支持事务
  • 虽然已支持条件 Delete/Update(mutations),只是非事务型、异步、重写分片数据开销大;生产要谨慎,用 TTL/分区替代更常见。
  • 支持有限的操作系统

最后总结

在大数据分析领域中,传统的大数据分析需要不同框架和技术组合才能达到最终效果,在人力成本、技术能力、硬件成本、维护成本上,让大数据分析变成了很昂贵的事情,很多中小企业非常痛苦,不得不被迫租赁第三方大型数据分析服务。 ClickHouse开源的出现让许多想做大数据且想做大数据分析的很多公司和企业都耳目一新。ClickHouse正是以不依赖Hadoop生态、安装维护简单、查询快速、支持SQL等特点,在大数据领域越走越远。

其他系列

🚀 AI篇持续更新中(长期更新)

AI炼丹日志-29 - 字节跳动 DeerFlow 深度研究框斜体样式架 私有部署 测试上手 架构研究 ,持续打造实用AI工具指南! AI-调查研究-108-具身智能 机器人模型训练全流程详解:从预训练到强化学习与人类反馈 🔗 AI模块直达链接

💻 Java篇持续更新中(长期更新)

Java-154 深入浅出 MongoDB 用Java访问 MongoDB 数据库 从环境搭建到CRUD完整示例 MyBatis 已完结,Spring 已完结,Nginx已完结,Tomcat已完结,分布式服务正在更新!深入浅出助你打牢基础! 🔗 Java模块直达链接

📊 大数据板块已完成多项干货更新(300篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈! 大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT案例 详解 🔗 大数据模块直达链接

相关推荐
序安InToo1 天前
第6课|注释与代码风格
后端·操作系统·嵌入式
xyy1231 天前
C#: Newtonsoft.Json 到 System.Text.Json 迁移避坑指南
后端
洋洋技术笔记1 天前
Spring Boot Web MVC配置详解
spring boot·后端
JxWang051 天前
VS Code 配置 Markdown 环境
后端
navms1 天前
搞懂线程池,先把 Worker 机制啃明白
后端
JxWang051 天前
离线数仓的优化及重构
后端
Nyarlathotep01131 天前
gin01:初探gin的启动
后端·go
JxWang051 天前
安卓手机配置通用多屏协同及自动化脚本
后端
JxWang051 天前
Windows Terminal 配置 oh-my-posh
后端
SimonKing1 天前
OpenCode AI编程助手如何添加Skills,优化项目!
java·后端·程序员