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. 真正的列式数据库
  2. 数据压缩
  3. 数据的磁盘存储
  4. 多核并行处理
  5. 多服务器分布式处理(数据保存在不同的shard上,每一个shard都由一组用于容错的副本组成,可并行查询所有shard)
  6. 向量引擎(按列的一部分进行处理,高效实用CPU)
  7. 实时的数据更新(支持在表中定义主键,数据增量有序存储在mergeTree中)
  8. 索引(按照主键对数据进行排序,毫秒内完成对数据的查找)
  9. 适合在线查询
  10. 支持近似计算(允许牺牲精度的情况下低延迟查询)
  11. 支持数据复制和数据完整性(异步多主复制技术)

四、 缺陷

  1. 没有完整的事务支持
  2. 缺少高频率低延迟的修改或删除数据的能力
  3. 不适合通过其检索单行的点查询
  4. 联机事物处理
  5. 二进制数据或文件存储
  6. 键值对数据高效率访问请求

五、核心概念

5.1.表引擎(Engine)

         表引擎决定了数据在文件系统中的存储方式,常用的也是官方推荐的存储引擎是MergeTree系列,如果需要数据副本的话可以使用ReplicatedMergeTree系列,相当于MergeTree的副本版本。读取集群数据需要使用分布式表引擎Distribute。

5.2.表分区(Partition)

         表中的数据可以按照指定的字段分区存储,每个分区在文件系统中都是都以目录的形式存在。常用时间字段作为分区字段,数据量大的表可以按照小时分区,数据量小的表可以在按照天分区或者月分区,查询时,使用分区字段作为Where条件,可以有效的过滤掉大量非结果集数据。

5.3.分片(Shard)

         一个分片本身就是ClickHouse一个实例节点,分片的本质就是为了提高查询效率,将一份全量的数据分成多份(片),从而降低单节点的数据扫描数量,提高查询性能。

5.4. 复制集(Replication)

         简单理解就是相同的数据备份,在CK中通过复制集,我们实现保障了数据可靠性外,也通过多副本的方式,增加了CK查询的并发能力。这里一般有2种方式:
(1)基于ZooKeeper的表复制方式;
(2)基于Cluster的复制方式。由于我们推荐的数据写入方式本地表写入,禁止分布式表写入,所以我们的复制表只考虑ZooKeeper的表复制方案。

5.5.集群(Cluster)

可以使用多个ClickHouse实例组成一个集群,并统一对外提供服务。

六、主要表引擎深入解析

6.1.TinyLog

最简单的表引擎,用于将数据存储在磁盘上,每列都存储在单独的压缩文件中,写入时,数据附加到文件末尾.
缺点:(1)没有并发控制(没有做优化,同时写会数据会损坏,报错) (2)不支持索引 (3)数据存储在磁盘上
优点:(1)小表节省空间 (2)数据写入,只查询,不做增删改操作
创建表:

create table stu1(id Int8, name String)ENGINE=TinyLog

6.2. Memory

内存引擎,数据以未压缩的原始形式直接保存在内存中,服务器重启,数据会消失,读写操作不会相互阻塞,不支持索引。
建议上限1亿行的场景。
优点:简单查询下有非常高的性能表现(超过10G/s)
创建表:

create table stu1(id Int8, name String)ENGINE=Merge(db_name, 'regex_tablename')

6.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’)

6.4.MergeTree

ck中最强大的表引擎MergeTree(合并树)和该系列(*MergeTree)中的其他引擎。
使用场景:有巨量数据要插入到表中,高效一批批写入数据片段,并希望这些数据片段在后台按照一定规则合并。相比在插入时不断修改(重写)数据进行存储,会高效很多。
优点:(1)数据按主键排序 (2)可以使用分区(如果指定了主键)(3)支持数据副本 (4)支持数据采样
创建表:

ENGINE MergeTree() PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) SAMPLE BY intHash32(UserID) SETTINGS index_granularity=8192

插入数据:

6.5.ReplacingMergeTree

         在MergeTree的基础上,增加了“处理重复数据”的功能,和MergeTree的不同之处在于他会删除具有相同主键的重复项,数据的去重只会在合并的过程中出现,合并会在未知的时间在后台进行,所以你无法预先做出计划,有一些数据可能仍未被处理,适用于在后台清除重复的数据以节省空间,但是不保证没有重复的数据出现。
创建表:

6.6.SummingMergeTree

         继承自MergeTree,区别在于,当合并SummingMergeTree表的数据片段时,ck会把具有相同主键的行合并为一行,该行包含了被合并的行中具有数值数据类型的列的汇总值,如果主键的组合方式使得单个键值对应于大量的行,则可以显著的减少存储空间并加快数据查询的速度,对于不可加的列,会取一个最先出现的值。

6.7.Distributed(重点)

         分布式引擎,本身不存储数据,但可以在多个服务器上进行分布式查询,读是自动并行的,读取时,远程服务器的索引(如果有的话)会被使用。

七、最佳实践

7.1.HDFS数据导入Clickhouse

创建hdfs_engine

CREATE TABLE hdfs_engine_table (name String, value UInt32) ENGINE=HDFS('hdfs://hdfs1:9000/other_storage', 'TSV')

File file

INSERT INTO hdfs_engine_table VALUES ('one', 1), ('two', 2), ('three', 3)

数据查询

SELECT * FROM hdfs_engine_table LIMIT 2
┌─name─┬─value─┐
│ one  │     1 │
│ two  │     2 │
└──────┴───────┘

7.2.每分钟亿级别海量用户行为日志实时自助查询

数据链路

系统实现
         在flink端动态设置schema信息,ETL处理数据,动态生成宽表,数据存入Clickhouse,按天分区,Clickhouse使用Distributed表引擎,数据保留7天,避免数据过度膨胀,导致查询性能降低,使用Redash报表工具,分析人员可以写SQL自助查询,结果自定义图表展示。

系统成果
         每分钟乙级的数据量,整个数据链路数据延迟在毫秒,数据查询响应在秒级别,动态设置schema生成宽表,做到整个系统的复用性,避免重复开发,查询性能比Hive快几百倍,满足了实时性的要求。

八、大厂使用场景

1. 头条:用户行为分析系统,上报日志 大宽表,减少join,增加map数据类型,展平模型,支持动态scheam
2. 腾讯:游戏数据分析

3. 携程:内部从18年7月份开始接入试用,目前80%的业务都跑在ClickHouse上。每天数据增量十多亿,近百万次查询请求
4.快手:内部也在使用ClickHouse,存储总量大约10PB, 每天新增200TB, 90%查询小于3S
5.国外:Yandex内部有数百节点用于做用户点击行为分析,CloudFlare、Spotify等头部公司也在使用

九、结语

ClickHouse优秀的性能,适合实时OLAP场景,是一颗冉冉升起的星星,社区活跃度高,未来在大数据领域能发挥更闪耀的价值,非常期待。

扫码关注

大数据老哥
希望这篇文章可以帮到你~
记得点赞收藏哦

更多精彩内容请关注 微信公众号 👇「大数据老哥」🔥:
         一枚专注分享和探讨大数据技术、多年打大厂编程经验(Flink、Spark、Hadoop、Hive、Kafka等)、分享在工作实际开发中遇到的问题及解决方案、不定期分享面试经验、技术选型、架构设计等方面。目前帮助数百人成功获取offer。
👉 关注后回复【大数据面试题】获取大数据互联网大厂面试题汇总一份
👉关注后回复【简历】获取简历模板一份200+
👉关注后回复【Java面试题】获取大厂常面的面试题供你学习

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: clickhouse原理解析与应用实践 pdf是一本介绍clickhouse数据库的书籍,其中包含了clickhouse的原理解析和应用实践方面的内容。clickhouse是一款高性能的列式存储数据库,适用于大数据场景下的数据分析和查询。本书通过深入剖析clickhouse的架构、存储模型、查询引擎等方面,帮助读者更好地理解clickhouse的工作原理和优势。同时,本书还提供了一些clickhouse的应用实践案例,包括数据导入、查询优化、高可用性等方面,帮助读者更好地应用clickhouse解决实际问题。 ### 回答2: ClickHouse是一种基于列式存储的高性能分布式数据库,它采用了一系列优化策略以提高查询和插入的速度,并支持快速的数据导入和导出。该数据库能够快速地处理海量数据,因此受到了广泛的关注和应用。 ClickHouse采用列式存储方式来存储数据,与传统的行式存储方式不同,列式存储在处理大量数据时具有很高的效率。当从大量数据中搜索特定数据时,列式存储可以让系统尽可能快地查找目标数据并返回结果。另外,列式存储还可以减少数据的重复存储,从而更有效地使用可用的空间。 ClickHouse还支持多种数据压缩和预处理方式,以提高查询和索引的效率。例如,使用字典压缩可以在存储的同时减少空间占用,同时查询时也可以更快地查找数据。此外,还可以使用异步复制和内存表等技术来提供更快的数据插入和查询速度。 ClickHouse具有以下特点: 1.可扩展性 ClickHouse可以简单地扩展到很多节点,因此,就可以处理更大的数据量。另外,ClickHouse还支持复制和分片等技术,可以进一步提高读写操作的性能。 2.高性能 ClickHouse支持在线聚合,可以在数据写入的同时计算部分聚合结果,因此,速度非常快。另外,ClickHouse还支持异步数据复制、多副本备份和分布式查询等功能,可以进一步提高性能和可靠性。 3.丰富的查询支持 ClickHouse支持SQL查询,并提供了大量的聚合函数和数据格式转换函数,这样就可以满足各种不同的查询需求。 4.多种数据导入和导出方式 ClickHouse支持从各种数据源中导入数据,并支持将数据导出到各种数据存储和数据分析工具中,例如Hadoop、Spark和Kafka等。 在应用实践中,ClickHouse被广泛用于数据仓库、日志分析、实时数据处理等领域。ClickHouse的性能和可扩展性优势得到了很多用户的认可,其使用场景也在不断扩大。通过对ClickHouse原理的深入了解,可以更好地应用该技术,实现高效的数据存储和分析。 ### 回答3: ClickHouse是一个高性能分布式列式数据库系统,专门用于快速处理大规模数据。它是由俄罗斯搜索引擎公司Yandex开发的,现已开源提供给使用者。 ClickHouse的核心思想是通过利用硬件资源提高数据处理速度,采用面向列的存储方式,同时支持分布式和复制。这种设计可以实现高性能的数据处理,而且可以在数据可用性、容错性和可扩展性等方面具备非常高的灵活性。 ClickHouse存储的是单个列的数据,而不是传统关系型数据库存储的行。这种列式存储方式可以在查询大数据集时提供显著的查询性能优势。同时,由于ClickHouse在物理上只为列存储预先分配足够的磁盘空间,因此数据可以快速重建索引或压缩,从而最大限度地减少了数据的占用空间。 ClickHouse使用强大的分布式方法完成数据存储和查询。它采用的是“sharding”和“replication”技术,其中每个分片被分配给一个或多个节点,并在多个节点之间复制数据来提供高可用性。如此一来,我们可以处理高吞吐量和低延迟的查询请求,而且可以在数据节点之间并行加载数据。 此外,ClickHouse支持SQL查询。虽然其SQL支持与传统关系型数据库不同,但是可以通过使用一些SQL扩展来实现更灵活的查询和数据操作。此外,它还支持插入、更新和删除等相关操作。 实践上,ClickHouse可以用于各种用例,包括Web应用程序、日志分析、在线广告、电子商务等等。许多公司都在选择使用ClickHouse作为其数据存储和分析平台,因为它可以处理数十亿行数据并提供极高的查询性能。 总的来说,ClickHouse是一个功能强大的分布式列式数据库,在大规模数据处理方面具有显著的优势。由于其提供高可用性和可扩展性,因此它在企业中的应用可能会越来越广泛。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据老哥

欢迎支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值