这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战
背景
提到大数据不得不提 Hadoop,当下的 Hadoop 已不仅仅是当初的 HDFS + MR(MapReduce) 这么简单。基于 Hadoop 而衍生的 Hive、Pig、Spark、Presto、Impala 等一系列组件共同构成了 Hadoop 生态体系。Hadoop 生态为今天的大数据领域提供着稳定可靠的数据服务。
Hadoop 生态体系解决了大数据界的大部分问题,当然其也存在缺点。Hadoop 体系的最大短板在于数据处理时效性。基于 Hadoop 生态的数据处理场景大部分对时效要求不高,按照传统的做法一般是 T + 1 的数据时效。即 Trade + 1,数据产出在交易日 + 1 天。
ClickHouse 的产生就是为了解决大数据量处理的时效性。
概述
Clickhouse 由俄罗斯 Yandex 公司开发,专为在线数据分析而设计。Yandex 是俄罗斯搜索引擎公司,官方提供的文档表明 ClickHouse 日处理记录数“十亿级” 无压力。
特性
- 采用列式存储。
- 数据压缩。
- 基于磁盘的存储,大部分列式存储数据库为了追求速度,会将数据直接写入内存,按时内存的空间往往很小。
- CPU 利用率高,在计算时会使用机器上的所有 CPU 资源。
- 支持分片,并且同一个计算任务会在不同分片上并行执行,计算完成后会将结果汇总。
- 支持 SQL,SQL 几乎成了大数据的标准工具,使用门槛较低。
- 支持联表查询。
- 支持实时更新。
- 自动多副本同步。
- 支持索引。
- 分布式存储查询。
性能
根据官方提供的数据,性能表现大致如下:
- 低延迟:对于数据量(几千行,列不是很多)不是很大的短查询,如果数据已经被载入缓存,且使用主码,延迟在50MS左右。
- 并发量:虽然 ClickHouse 是一种在线分析型数据库,也可支持一定的并发。当单个查询比较短时,官方建议 100 Queries / second。
- 写入速度:在使用 MergeTree 引擎的情况下,写入速度大概是 50 - 200 M / s,如果按照 1 K 一条记录来算,大约每秒可写入 50000 ~ 200000 条记录每秒。如果每条记录比较小的话写入速度会更快。
接口
- 对外提供 Http,JDBC 两种接口方式
- 对内各模块间使用 TCP 连接通信。
与 Hadoop 区别
- Hadoop 体系是一种离线系统,一般很难支持即席查询。ClickHouse 可以支持即席查询。
- Hadoop 体系一般不支持实时更新,都采用批量更新和写入。ClickHouse 支持实时数据更新。
- Hadoop 体系一般采用行记录存储,数据查询需要扫描所有列,当表很宽时会扫描很多用不到的列。ClickHouse 是列式存储,查询只需要加载相关的列。
引擎
ClickHouse 提供了丰富的存储引擎,存储引擎的类型决定了数据如何存放、如何做备份、如何被检索、是否使用索引。不同的存储引擎在数据写入/检索方面做平衡,以满足不同业务需求。
ClickHouse 提供了十多种引擎,这里介绍两种最重要的引擎:MergeTree、Distributed。
MergeTree
MergeTree 是 ClickHouse 中最先进的引擎,并由 MergeTree 衍生出了一系列的引擎,统称 MergeTree 系引擎。
特性
- 支持主键索和日期索引。
- 可以提供实时的数据更新。
- MergeTree 是 ClickHouse 数据库提供的最理想的引擎。
- MergeTree 类型的表必须有一个 Date 类型列。因为默认情况下数据是按时间进行分区存放的。
分区
- MergeTree 默认分区是以月为单位,同一个月的数据永远都不会被合并。
- 同一个分区的数据会被切割到不同的文件夹中。
- 当有新数据写入时,数据会被写入新的文件夹中,后台会有线程定时对这些文件夹进行合并。
- 每个文件夹中包含当前文件夹范围内的数据,数据按照主码排序,并且每个文件夹中有一个针对该文件夹中数据的索引文件。
分区新特性
- 在老版本的 ClickHouse 中只支持按月分区,在 1.1.54310 版之后,支持用户自定义分区。
- 可以通过 system.parts 表查看表的分区情况。
索引
- 每个数据分区的子文件夹都有一个独立索引。
- 当 where 子句中在索引列及 Date 列上做了“等于、不等于、>=、<=、>、<、IN、bool 判断”操作,索引就会起作用。
- Like 操作不会使用索引如下面的 SQL 将不会用到索引。
- SELECT count()FROM table WHERE CounterID = 34 OR URL LIKE '%xxxx%'。
- 对于日期索引,查询仅仅在包含这些数据的分区上执行。
- 查询时最好指定主码,因为在一个子分区中,数据按照主码存储。所以,当定位到某天的数据文件夹时,如果这一天数据量很大,查询不带主码就会导致大量的数据扫描。
Distributed
Distributed 引擎并不存储真实数据,而是来做分布式写入和查询,与其他引擎配合使用,比如:Distributed + MergeTree。
- Distributed 引擎可以认为是 Proxy,仅仅存有表结构。
- MergeTree 引擎可以认为是 DataNode,存储真实数据。
- Distributed 引擎需要指定如下参数:<集群名称,远程数据库名,远程表名,分片规则>
- 集群名:即当前集群名称。
- 远程数据库名:比如存储具体数据的MergeTree引擎的数据库名
- 远程表名:存储真实数据的表的名字。
- 分片规则:可选。
- 分片:一个 Distributed 表可以被切成多个分片(shard),分片之间没有数据重合。
- 副本:一个 Distributed 分片可以有多个副本,副本的数据完全相同。
相关资料
- ClickHouse 快速上手:zhuanlan.zhihu.com/p/34669883
- ClickHouse 使用:www.zouyesheng.com/clickhouse.…
- ClickHouse 快速入门:www.cnblogs.com/glon/p/6761…
- First Time ClickHouse:toutiao.io/posts/6wsc2…
- 彪悍开源的分析数据库-ClickHouse:zhuanlan.zhihu.com/p/22165241
- Clickhouse 使用总结:wchch.github.io/2018/12/20/…
- 将数据通过 spark 从 hive 导入到 Clickhouse:wchch.github.io/2018/12/20/…