ClickHouse深度解析
一、什么是ClickHouse?
ClickHouse由俄罗斯第一大搜索引擎Yandex于2016年6月发布, 开发语言为C++,ClickHouse是一个面向联机分析处理(OLAP)的开源的面向列式存储的DBMS,简称CK, 与Hadoop、Spark这些巨无霸组件相比,ClickHouse很轻量级,查询性能非常好,使用之后会被它的性能折服,非常值得安利。
二、适用场景
1.日志数据行为分析
2.标签画像的分析
3.数据集市分层
4.广告系统和实时竞价广告
5.电商和金融行业
6.实时监控和遥感测量
7.商业智能
8.在线游戏
9.信息安全
10.所有的互联网场景
三、特性
四、 缺陷
五、核心概念
1.表引擎(Engine)
2.表分区(Partition)
3.分片(Shard)
一个分片本身就是ClickHouse一个实例节点,分片的本质就是为了提高查询效率,将一份全量的数据分成多份(片),从而降低单节点的数据扫描数量,提高查询性能。
4. 复制集(Replication)
简单理解就是相同的数据备份,在CK中通过复制集,我们实现保障了数据可靠性外,也通过多副本的方式,增加了CK查询的并发能力。这里一般有2种方式:(1)基于ZooKeeper的表复制方式;(2)基于Cluster的复制方式。由于我们推荐的数据写入方式本地表写入,禁止分布式表写入,所以我们的复制表只考虑ZooKeeper的表复制方案。
5.集群(Cluster)
可以使用多个ClickHouse实例组成一个集群,并统一对外提供服务。
六、主要表引擎深入解析
1.TinyLog
create table stu1(id Int8, name String)ENGINE=TinyLog
2. Memory
create table stu1(id Int8, name String)ENGINE=Merge(db_name, 'regex_tablename')
3.Merge
create table t1(id Int8, name String)ENGINE=TinyLog create table t2(id Int8, name String)ENGINE=TinyLog create table t3(id Int8, name String)ENGINE=TinyLog create table t (id UInt16, name String)ENGINE=Merge(currentDatabase(), ‘^t’)
4.MergeTree
ENGINE MergeTree() PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) SAMPLE BY intHash32(UserID) SETTINGS index_granularity=8192
插入数据:
5.ReplacingMergeTree
在MergeTree的基础上,增加了“处理重复数据”的功能,和MergeTree的不同之处在于他会删除具有相同主键的重复项,数据的去重只会在合并的过程中出现,合并会在未知的时间在后台进行,所以你无法预先做出计划,有一些数据可能仍未被处理,适用于在后台清除重复的数据以节省空间,但是不保证没有重复的数据出现。
创建表:
6.SummingMergeTree
继承自MergeTree,区别在于,当合并SummingMergeTree表的数据片段时,ck会把具有相同主键的行合并为一行,该行包含了被合并的行中具有数值数据类型的列的汇总值,如果主键的组合方式使得单个键值对应于大量的行,则可以显著的减少存储空间并加快数据查询的速度,对于不可加的列,会取一个最先出现的值。
7.Distributed(重点)
分布式引擎,本身不存储数据,但可以在多个服务器上进行分布式查询,读是自动并行的,读取时,远程服务器的索引(如果有的话)会被使用。
七、最佳实践
1.HDFS数据导入Clickhouse
1.1 创建hdfs_engine
CREATE TABLE hdfs_engine_table (name String, value UInt32) ENGINE=HDFS('hdfs://hdfs1:9000/other_storage', 'TSV')
1.2 File file
INSERT INTO hdfs_engine_table VALUES ('one', 1), ('two', 2), ('three', 3)
1.3 数据查询
SELECT * FROM hdfs_engine_table LIMIT 2
┌─name─┬─value─┐ │ one │ 1 │ │ two │ 2 │ └──────┴───────┘
2.每分钟亿级别海量用户行为日志实时自助查询
2.1 数据链路
2.2 系统实现
在flink端动态设置schema信息,ETL处理数据,动态生成宽表,数据存入Clickhouse,按天分区,Clickhouse使用Distributed表引擎,数据保留7天,避免数据过度膨胀,导致查询性能降低,使用Redash报表工具,分析人员可以写SQL自助查询,结果自定义图表展示。
2.3 系统成果
每分钟乙级的数据量,整个数据链路数据延迟在毫秒,数据查询响应在秒级别,动态设置schema生成宽表,做到整个系统的复用性,避免重复开发,查询性能比Hive快几百倍,满足了实时性的要求。
八、大厂使用场景
1. 头条:用户行为分析系统,上报日志 大宽表,减少join,增加map数据类型,展平模型,支持动态scheam
2. 腾讯:游戏数据分析
3. 携程:内部从18年7月份开始接入试用,目前80%的业务都跑在ClickHouse上。每天数据增量十多亿,近百万次查询请求
4.快手:内部也在使用ClickHouse,存储总量大约10PB, 每天新增200TB, 90%查询小于3S
5.国外:Yandex内部有数百节点用于做用户点击行为分析,CloudFlare、Spotify等头部公司也在使用
九、结语
ClickHouse优秀的性能,适合实时OLAP场景,是一颗冉冉升起的星星,社区活跃度高,未来在大数据领域能发挥更闪耀的价值,非常期待。