写点什么

极客星球|数据分析引擎黑马 ClickHouse 技术研究与实践

  • 2023-04-27
    上海
  • 本文字数:3337 字

    阅读完需:约 11 分钟

ClickHouse 在近几年是大数据分析引擎界的一匹黑马,从默默无闻到一路起飞,在 DB engine Rank 上进入前 50 名,成为全球数据引擎界耀眼的一颗明星。在全球范围内,ClickHouse 单表查询比其他引擎要快数倍以上,在过去的几年以来未曾有对手。ClickHouse 为什么会这么快?在实际使用当中如何应用这样一个引擎?本文根据 MobTech 袤博科技 Java 开发专家墨子的演讲分享整理而成,为大家详尽介绍最新的 ClickHouse Feature 和实战应用。

 

一、初探 OLAP 和 ClickHouse

在数据科学领域,数据库系统可以分为联机事务处理(OLTP)和联机分析处理(OLAP)两种面向不同领域的数据库,OLAP 数据库也被称为数据仓库。在探究 ClickHouse 之前,我们先了解 OLAP 和 OLTP 有何不同。OLAP 是数据仓库系统的主要应用,其支持的对象主要是面向分析场景的应用,提供结构化的、主题化的数据给运营,实现业务反馈和辅助决策。同时,在有些场景中,也可以由数据仓库对业务进行支持。OLTP 存储的主要是与业务直接相关的数据,强调准确、低时延、高并发,如果没有特别强调,基本上数据库里只会存储与业务相关的数据。

 

从产品上看,有专门面向 OLTP 的数据库,例如 MySQL、PostgreSQL、Oracle 等,也有专门面向 OLAP 的数据库,例如 Presto、Druid、Apache Kylin、Apache Doris、ClickHouse 等,本期侧重介绍不同的 OLAP 系统在应用场景中的表现。

 

OLAP 场景中,已添加到数据库的数据不能修改,绝大多数是读请求。对于读取,从数据库中提取相当多的行,但只提取列的一小部分。数据以相当大的批次(> 1000 行)更新,而不是单行更新,或者根本没有更新。宽表,即每个表包含着大量的列,查询相对较少(通常每台服务器每秒查询数百次或更少),对于简单查询,允许延迟大约 50 毫秒。通常,列中的数据相对较小,一般是数字和短字符串(例如,每个 URL 60 个字节),处理单个查询时需要高吞吐量(每台服务器每秒可达数十亿行)。事务不是必须的,对数据一致性要求低。每个查询有一个大表,除了它以外,其他的都很小。查询结果明显小于源数据。换句话说,数据经过过滤或聚合,因此结果适合于单个服务器的 RAM 中。

 

以下是现行的几款 OLAP 系统对比:

  • Presto

是在 Hadoop 上运行的分布式系统,使用与经典大规模并行处理(MPP) 数据库管理系统相似的架构。 它有一个协调器节点,与多个工作线程节点同步工作。 用户将其 SQL 查询提交给协调器,由其使用自定义查询和执行引擎进行解析、计划并将分布式查询计划安排到工作线程节点之间。

评估:Presto 优点是基于 hadoop 生态,存储和计算分离,基于 Java 开发。缺点是依赖大内存,查询速度比较慢。

 

  • Druid

Druid 专为需要快速数据查询与摄入的工作流程而设计,在即时数据可见性、即席查询、运营分析以及高并发等方面表现非常出色。 在实际中众多场景下数据仓库解决方案中,可以考虑将 Druid 当做一种开源的替代解决方案。

评估:Druid 的数据维度预聚合,没有明细数据。

 

  • Apache Kylin

Apache Kylin™是一个开源的、分布式的分析型数据仓库,提供 Hadoop/Spark 之上的 SQL 查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由 eBay 开发并贡献至开源社区。 它能在亚秒内查询巨大的表。 Apache Kylin™ 令使用者仅需三步,即可实现超大数据集上的亚秒级查询。

评估:Kylin 优点是查询速度特别快,缺点是基于数据预计算,数据膨胀比较大,无明细数据。

 

  • Apache Doris

Apache Doris 是一个现代化的 MPP 分析型数据库产品。仅需亚秒级响应时间即可获得查询结果,有效地支持实时数据分析。Apache Doris 的分布式架构非常简洁,易于运维,并且可以支持 10PB 以上的超大数据集。Apache Doris 可以满足多种数据分析需求,例如固定历史报表,实时数据分析,交互式数据分析和探索式数据分析等,令您的数据分析工作更加简单高效。

 

  • ClickHouse

ClickHouse 是俄罗斯的 Yandex 于 2016 年开源的列式存储数据库(DBMS),使用 C++语言编写,主要用于在线分析处理查询(OLAP) ,能够使用 SQL 查询实时生成分析数据报告。ClickHouse 可以做用户行为分析,流批一体,线性扩展和可靠性保障能够原生支持 shard + replication,ClickHouse 没有走 hadoop 生态,采用 Local attached storage 作为存储。

评估:Clickhouse 优点是采用列式存储,支持 SQL,丰富的表引擎,有索引优化策略,基于 cpu 向量执行引擎查询速度特别快。缺点是计算和存储在一起,无法大规模搭建集群。

 

二、ClickHouse 现状和核心能力

ClickHouse 完美的实现了 OLAP 和列式数据库的优势,因此在大数据量的分析处理应用中 ClickHouse 表现很优秀。ClickHouse 版本迭代迅速,几乎每个月都有新版本发布,支持表引擎非常多,可达 40 多种。单机查询性能非常强悍,使用普通机械硬盘,每秒可扫描 1 亿行记录,数据压缩率比较高。

 

ClickHouse 中最强大的表引擎是 MergeTree 系列。MergeTree 系列的引擎被设计用于插入极大量的数据到一张表当中。数据可以以数据片段的形式一个接着一个的快速写入,数据片段在后台按照一定的规则进行合并。相比在插入时不断修改(重写)已存储的数据,这种策略会高效很多。

 

MergeTree 系列主要特点:

存储的数据按主键排序;

支持数据分区;

支持数据副本;

支持数据采样;

支持轻量级更新和删除操作;

支持表和列 TTL。

 

  • 支持数据修改和删除的 MergeTree 引擎:

VersionedCollapsingMergeTree  

CollapsingMergeTree

ReplacingMergeTree

 

  • 支持数据聚合的 MergeTree 引擎:

AggregatingMergeTree

SummingMergeTree

 

  • 分布式表

在 ClickHouse 中,分布式表是由多个分片组成的逻辑表,分片可以存储在不同的物理节点上。每个分片都包含表的一部分数据,并且可以独立读取和写入数据。这种分片存储的方式有助于实现高扩展性和高可用性,因为当需要增加存储容量或提高性能时,可以通过添加更多的节点来实现。

 

要创建一个分布式表,首先需要定义该表的模式(即列的名称和类型),然后指定每个分片的位置和复制策略。对于每个分片,可以指定其副本数目和副本放置的位置。

 

当向分布式表中插入数据时,ClickHouse 会根据每个分片配置的比重,把数据插入对应的分片种。查询也可以跨多个分片执行,以便并行化处理大量数据。

 

总的来说,ClickHouse 的分布式表使得数据处理变得非常高效和可扩展,能够应对大规模的数据集合和高并发访问的需求。

 

  • 集成表:Kafka 集成

通过 kafka 集成方式可以实现数据实时入库。Kafka 集成表不存储数据,是一个数据管道。

步骤:

1,创建 Kafka 集成表。

2,创建业务表。

3,创建物化视图将两张表关联起来。



  • 集成表:Hive 集成

通过与 Hive 集成,可以通过 Clickhouse 对 hive 数据进行读写。其本质是通过 hive 获取 Hadoop 文件地址进行读写。在该集成模式,Clickhouse 扮演计算引擎角色,hive 扮演数据存储角色。主要用于离线数据查询。

 


  • 数据副本的两种方式:ReplicatedMergeTree 和 Shard 配置

ReplicatedMergeTree,基于表级别的数据复制,利用 zookeeper 实现副本间发现和通讯。但是 zookeeper 不涉及数据查询和传输。所有的 MergeTree 表前加 Replicated 即可实现副本功能,每个副本表都有全量数据。

 

Shard,每个 ClickHouse 节点都是一个分片,可以进行横向扩展。可以配置每个 Shard 多个副本,基于数据库实例级别的副本。

 

三、ClickHouse 索引介绍

  • 索引

ClickHouse 支持主键索引,它将每列数据按照 Index granularity 进行划分,每个 index granularity 的开头第一行被称为一个 mark 行,主键索引存储该 mark 行对应的 primary key 值。对于 where 条件中含有 primary key 查询,通过对主键索引进行二分查找,能够指定定位到对应的 index granularity,避免了全表扫描。 

 

ClickHouse 主键索引,并不对数据去重 。数据是按照 Order by 字段的顺序存储,primary key 字段需要是 order by 字段的一部分。

 

  • 稀疏索引

ClickHouse 支持对任意列创建任意数量的稀疏索引。之所以叫稀疏索引,是因为它本质上行是对一个完整 index   granularity 的统计信息,并不会记录具体每一行在文件中的位置。目前支持的稀疏索引类型:

1. minmax。以 index granularity 为单位,存储指定表达式计算后的 min、max 值。在等值和范围查询中能够快速跳过不满足要求的块,减少 io。  

2.  set(max_rows)。以 index granularity 为单位,存储指定表达式的 distinct value 集合,用于快速判断等值查询是否命中该块。  

3. ngrambf_v1。索引对于 equals,like 和 in 查询有很大优化。

用户头像

还未添加个人签名 2019-05-08 加入

还未添加个人简介

评论

发布
暂无评论
极客星球|数据分析引擎黑马ClickHouse技术研究与实践_MobTech袤博科技_InfoQ写作社区