ClickHouse面试

1.ClickHouse是什么

ClickHouse联机分析的数据库管理系统

2.列式存储和行式存储的区别

列式存储的优点是同一列存放在一起,由于数据类型相同,可以进行很好的压缩,排序更加方便,查询时不需要读取一整行数据
行式存储的优点是支持事务处理,更好的支持一致性

3.MergeTree是什么

mergetree有俩层含义:合并树表引擎家族或者是最基本的MergeTree表引擎

3.1MergeTree独有的两项技能TTL和存储策略

  1. TTL
    TTL有行级和表级,表示数据的存活周期,具体运行原理如果一张mergeTree被设置了TTL表达式,那么在写入数据时,会以数据分区为单位,在每个分区目录下生成一个TTL.txt文件,txt文件通过一串json保存了ttl的相关信息,column用于保存列级别,table用于保存表级别,max和min分别表示了ttl在该分区内指定日期最大值和最小值与interval计算后的时间戳
  2. 存储策略
    数据片段写入,数据片段不可改变,定期合并相同的数据片段
    多路径存储策略:根据配置策略的不同,目前有三类存储策略:

 - 默认策略:默认存储在config.xml配置的path目录下
 - JBOD策略:类似于raid0,每产生一次merge或者insert所产生的分区会轮询的写入磁盘
 - HOT/COLD策略:是有HOT和COLD两块区域,HOT区域主要使用SSD高性能存储媒介,COLD区域主要使用HDD高容量存储媒介。
 当时据写入mergetree之初会在HOT分区创建分区便于写入数据,当数据达到阈值会移动到COLD区

3.2MergeTree有俩种索引,一级索引和二级索引。

索引主要是帮助查询时减少扫描范围

  1. 一级索引
    MergeTree主键使用PRIMARY KEY定义,依据index_granularity间隔,为数据表生成一级索引并保存在primary.idx文件内,索引文件按照primarykey排序;primary.idx文件内的索引采用稀疏索引,稀疏索引的好处在于少量 的索引标记就能记录大量的区间位置信息
  2. 二级索引(跳数索引)

四种类型:minmax、set、布隆过滤器

索引的查询过程:MargeTee按照index_granularity的间隔粒度,将一段完整的数据划分为markrange(间隔数据段)
具体的查询过程

 1. 生成查询条件区间,首先将查询条件转换为条件区间,即便是单个值的查询条件也会被转换为条件区间
 2. 递归交集判断:以递归的形式依次对条件区间和数值区间做交集判断,如果条件区间和数值区间没有交集,就会通过剪枝算法优化整段的MarkRange,
 如果有交集,且MarkRange步数大于8,继续递归,如果有交集,MarkRange不可再分,记录MarkRange并返回
 3. 合并MarkRange

4.ReplicatedMergeTree

4.1ReplicatedMergeTree是什么

ReplicatedMargeTree是以去重为目的设计的,它在合并分区时删除重复的数据

  • 处理逻辑
    ①ReplicatedMergeTree是以OrdeBy排序键作为重复数据的唯一键
    ②只有在合并区间的时候才会触发删除重复数据,且同一分区的重复数据会被删除,不同分区的重复数据不会被删除
    ③在去重时,已经OrderBy进行排序能够找到相邻的的重复数据
    ④去重有俩种策略,如果没有ver版本号,保留同一组数据中的最后一行,如果有ver版本号,保留ver字段最大的一行
  • ReplicatedMergeTree有一些显著特点:
    在进行INSERT和ALTER时需要借助Zookeeper的分布式协同能力,且采用多主架构,这些操作会借助zookeeper协同能力被分发至每个副本以本地形式执行,查询时不需要zookeeper

4.2分片和副本

俩种区分方法

  • 从数据层面,例如ClickHouse集群有N个节点,各个节点有一张相同的数据表Y,如果N1和N2的Y的数据完全相同,则它们互为副本,如果完全不同则互为分片
  • 从功能层面,使用副本的只要目的是防止数据丢失,增加数据存储的冗余;使用分片的目的是实现数据的水平切分

5.AggregatingMergeTree

在GroupBy明确的状态下,如果使用MergeTree存储数据,然后通过GROUP BY聚合查询,并利用SUM聚合函数汇总结果,会产生额外的查询开销和存储开销

AggregatingMergeTree是什么

  • 使用是以二进制的形式存储中间状态结果,在写入数据时,需要调用state函数,在查询数据时则需要调用相应的merge函数。
  • 使用OrderBy排序键作为聚合数据的依据 在合并分区时会发生数据聚合,且数据只发生在同分区内
  • 在聚合数据时,相同聚合key的多行数据会合并成一行,对于非主键、非聚合方法类型字段,则会取第一行数据

物化视图是什么

与普通视图的不同,普通视图不保存数据,保存的仅仅是查询语句;物化视图是把查询结果根据相应的引擎存入到磁盘或内存中。引擎一般使用AggregatedMargeTree,与普通mergeTree搭配使用。优点在于查询速度快,因为进行预计算;缺点在于消耗很多的机器资源,由于存放的是历史数据,对历史数据的去重不好用

  • 基本语法
    物化视图创建好之后,若源表被写入新数据,则物化视图也会同步更新;不支持同步删除,源表数据被删除,物化视图不会被删除。

6.Distributed引擎是

Distributed引擎是什么

Distributed表引擎是分布式表的代名词,自身不存储任何数据,而是作为数据分片的透明代理,能够自动路由数据至集群的各个节点,distributed表引擎与其他数据表引擎协同工作

本地表(Local Table) 与 分布式表

本地表:通常以_local为后缀进行命名。本地表是承接数据的载体,可以使用非distributed的任意表引擎,一张本地表对应了一个数据分片
分布式表:通常以_all为后缀进行命名。分布式表只能使用distributed表引擎,他与本地表形成一对多的映射关系,日后将通过分布式表代理操作多张本地表

分布式写入流程

在向集群内的分片写入数据时,通常有两种思路

  • 借助外部计算系统,事先将数据均匀分片,再借助计算机系统直接将数据写入clickhouse集群的各个本地表
  • 通过Distributed表引擎代理写入分片数据

第二种思路:
1.在第一个分片节点写入本地分片数据,根据分片规则划分数据,第一个分片建立远端连接,准备发送远端分片数据,将远程分片数据写入临时数据文件,接着,会尝试与远端分片节点建立连接
2.像远端数据发送数据,数据在传输之前会被压缩
3.远端连接写入本地表,直至所有的数据发送完毕

问题:可能会造成单点瓶颈
解决方法:与ReplicatedMergeTree表引擎结合使用,
使用ReplicatedMergeTree作为本地表引擎,则在该分片内,多个副本之间的数据复制会交给ReplicatedMergeTree自己处理,不再由Distributed负责,从而减负

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值