ClickHouse介绍

ClickHouse的全称是:Click Stream,Data WareHouse 简称:CH

是用于联机分析处理(OLAP)的列式数据库管理系统(DBMS),提供千亿级大数据集的在线多维查询和分布式存储

适用场景

  • 各种OLAP分析场景
  • 提供PB级数据的列式存储,千亿级结构化数据的快速查询能力,即便是在复杂查询的场景下,也能极快响应。
  • 支撑大规模快速搜索、高并发查询、多维度关联查询分析场景。
  • 随着数据体量的增大,优势会变得越为明显

不适用的场景

  • 不支持事务
  • 不擅长根据主键按行粒度进行查询,不应该把CH当作key-value数据库使用
  • 不擅长按行删除数据

核心特性

  • 完备的DBMS功能
  • 列式存储和数据压缩
  • 向量化执行引擎: 为了实现向量化执行,需要CPU的SIMD指令(Single Instruction Multiple Data 即用单条指令操作多条数据,它是通过数据并行以提高性能的一种实现方式(其他的还有指令级并行和线程级并行),它的原理是在CPU寄存器层面实现数据的并行操作。CH目前利用SSE4.2指令集实现向量化执行
  • LLVM:
  • 简化了条件分支
  • 使用代码生成来替代数据加载
  • 内联虚函数的调用
  • 关系模型和SQL
  • 多样化的表引擎:拥有MergeTree、内存、文件、接口和其它6大类20多种表引擎,可以根据业务场景的要求,选择合适的表引擎使用。
  • 多线程和分布式
  • 多主架构 :采用多master节点方式,消除中心节点性能瓶颈,大幅提升集群性能。
  • 在线查询
  • 数据分片: 将数据切片,多节点多分片同时写入数据,提升数据写入性能。
  • 分布式查询:多分片的数据并发查询,提升数据查询性能
  • 线性扩展:灵活添加节点,支持平滑扩展。

在计算机系统的体系结构中,存储系统是一种层次结构。典型服务器计算机的存储层次结构如图1所示。存储媒介距离CPU越近,则访问数据的速度越快。所以基于向量化执行引擎,在寄存器上并行计算,为上层应用程序的性能带来了指数级的提升

spark clickhouse 查询 clickhouse查询并发_CH

ClickHouse架构

架构示意图

目前ClickHouse公开的资料相对匮乏,架构图示意如下:

  • Column和Field是ClickHouse数据最基础的映射单元
  • ClickHouse按列存储数据,内存中的一列数据由一个Column对象表示,Column对象分为接口和实现两个部分,采用泛化设计思路
  • Field对象使用了聚合的设计模式。在Field对象内部聚合了Null、UInt64、String和Array等13种数据类型及相应的处理逻辑。
  • DataType 数据的序列化和反序列化工作由DataType负责。
  • IDataType接口定义了许多正反序列化的方法,它们成对出现,例如serializeBinary和deserializeBinary
  • DataType 不直接负责数据的读取,而是转由从Column或Field对象获取
  • Block与Block流:ClickHouse内部的数据操作是面向Block对象进行的,并且采用了流的形式
  • Block对象可以看作数据表的子集。Block对象的本质是由数据对象、数据类型和列名称组成的三元组,即Column、DataType及列名称字符串
  • Column提供了数据的读取能力,而DataType知道如何正反序列化,所以Block在这些对象的基础之上实现了进一步的抽象和封装,从而简化了整个使用的过程,仅通过Block对象就能完成一系列的数据操作。
  • 在具体的实现过程中,Block并没有直接聚合Column和DataType对象,而是通过ColumnWithTypeAndName对象进行间接引用。
  • Table 直接使用IStorage接口指代数据表。
  • 表引擎是ClickHouse的一个显著特性,不同的表引擎由不同的子类实现,例如IStorageSystemOneBlock ( 系统表 )、StorageMergeTree ( 合并树表引擎 ) 和StorageTinyLog ( 日志表引擎 ) 等
  • 在数据查询时,IStorage负责根据AST查询语句的指示要求,返回指定列的原始数据
  • Parser分析器负责创建AST对象
  • Interpreter解释器则负责解释AST,并进一步创建查询的执行管道。它们与IStorage一起,串联起了整个数据查询的过程
  • 针对IStorage返回的原始数据进一步加工、计算和过滤,则会统一交由Interpreter解释器对象处理
  • Functions 与Aggregate Functions
  • Cluster与Replication: ClickHouse的集群由分片 ( Shard ) 组成,而每个分片又通过副本 ( Replica ) 组成。
  • ClickHouse的1个节点只能拥有1个分片,也就是说如果要实现1分片、1副本,则至少需要部署2个服务节点。
  • 分片只是一个逻辑概念,其物理承载还是由副本承担的。

    CH采用分布式架构,基于客户端/服务器模式提供数据存储访问,大体可能分为如下4层:

clickhouse-jdbc-bridge

clickhouse-jdbc-bridge充当一个无状态代理,将查询从ClickHouse传递到外部数据源。有了这个扩展,你可以在ClickHouse上运行实时跨多个数据源的分布式查询,这在某种程度上简化了为数据仓库、监控和完整性检查等构建数据管道的过程。

Known Issues / Limitation 详见官网介绍。

spark clickhouse 查询 clickhouse查询并发_ClickHouse_02