ClickHouse 是一个用于联机分析 (OLAP) 的列式数据库管理系统 (DBMS)。
异域是因为它来自俄罗斯,Yandex 公司,这家公司是俄罗斯本土搜索引擎企业,原本是为了分析自家的 Web 流量而开发的一款产品 ,后来经过演变,逐渐形成为现在的 ClickHouse,全称是:Click Stream,Data WareHouse
它具有 ROLAP、在线实时查询、完整的 DBMS 功能支持、列式存储、不需要任何数据预处理、支持批量更新、拥有非常完善的 SQL 支持和函数、支持高可用、不依赖 Hadoop 复杂生态、开箱即用等许多特点。
今天我们来剖析ClickHouse 设计思路
先看看这下面的2个SQL
-- 场景1 根据键key找到值
select name from table where id = 1
-- 场景2 统计平均金额
select city,avg(amount) from table group by city
对于上面这两种场景,
数据量不大,而且又是结构化数据,可以用MySQL存储和分析
数据量大的话,对于场景1来说可以使用HBase来解决。
但是大数据量情况下场景2需求特别多,那么需要设计一个专门用来做分析的存储计算引擎解决分
析的低效率问题。
海量数据中,如果能够快速的把待搜寻的数据范围降低到原来的1/n,然后在结合索引或者热点数
据放在内存等思想,就能实现高效率的查询了
那么一个专门用来做 OLAP 分析的存储引擎该如何设计呢?如何在海量数据中,针对大量数据进
行查询分析呢?一些常见的方案和手段如下:
1、列式存储+字段类型统一
2、列裁剪
3、数据排序
4、数据分区分片+ 分布式查询
5、预聚合
6、利用CPU特性:向量化引擎,
7、构建多种不同索引:主键索引+二级索引+位图索引+布隆索引
8、支持近似计算 pv
9、定制引擎:多样化的存储引擎满足不同场景的特定需要
10、多样化算法选择
具体设计思路:单挑记录的增删改等操作,通过数据的横向划分,做到数据操作的快速定位
在海量的数据查询分析中,一般就是针对某些列做分析既然并不是全部列,
那么把数据做纵向切分把表的数据按照列的单独存储,那么在做分析的时候,同样可以快速把待查
询分析的数据总理降低到原来的1/n
说到OLAP,Kylin也是适合于OLAP场景的一个分布式分析引擎, Kylin 把预聚合发挥到极致,但是它的缺点:
- 只支持固定的分析场景,无法满足自定义分析场景
- 维度组合爆炸会导致数据膨胀
- 增量数据 ,预聚合不能进行数据更,所以会产生大量的重算
ClickHouse优点
- 1.非常快的扫描,可用于实时查询
- 2.在多个服务器上分布式处理
- 3.并行处理单个查询(利用多核)
- 4.列存储非常适用于“宽”/“非规格化”表(多列)
- 5.SQL支持(有限的支持)
- 6.良好的压缩特性
- 7.不同的存储引擎的支持(磁盘存储格式)
- 8.一系列函数的支持,包括对近似计算的支持
- 9.非常适合结构性日志/事件数据以及时间序列数据(引擎的合并树需要日期字段)
- 10. 索引支持(仅主键支持,不是所有的存储引擎都支持)
- 11.漂亮的命令行界面,用户友好的进度条和格式
当然ClickHouse 也并不完美,比如
- 没有完整的事务支持
- 稀疏索引,不擅长细粒度查询
- 不擅长高频率,低延迟修改或者删除数据
- 不擅长join操作