ClickHouse和ES在人群圈选上的对比
ES标签存储的痛点
- 标签导入到ES的时间过长,需要等待各种数据准备就绪,才能关联查询
- Mapping在建好之后不能更改字段类型
- 新增或修改标签,不能够实时进行
- ES的DSL语法对用户不太友好
ClickHouse替代ES标签存储
- 相同数据量下,ClickHouse的聚合性能优于ES
- ClickHouse写入吞吐量优于ES
- ClickHouse数据压缩优于ES
- ClickHouse采用SQL语法,学习成本低
ES人群圈选
ClickHouse人群圈选
ClickHouse标签存储和人群圈选的优势
- 高效的批量数据导入性能
- 实时update的能力
- 具备添加/减少列的DDL的能力
- 指定任意列作为过滤条件的高效查询能力
ClickHouse集成Bitmap
什么是Bitmap
- 通过一个bit数组来存储特定数据的一种数据结构
- Bitmap节省大量的存储空间
- Bitmap能够能方便进行位运算
Bitmap位运算
- 单个Bitmap可以精确的去重
- 位运算:or、and、xor、not
- 多个Bitmap通过位运算可以完成留存分析,用户画像分析等场景的计算
Bitmap缺点
- 存储的Bitmap越大,需要的外部存储空间就越大
- Bitmap位数越多,计算时消耗的cpu时间也越多
- 当数据比较稀疏时,Bitmap比较浪费空间
Bitmap压缩算法
- 基于RLE编码的压缩算法
- 基于Roaring算法的压缩算法(被广泛使用的高效的Bitmap压缩算法)
RoaringBitmap原理
有3种类型的容器
- Array Container
- Run Container
- Bitmap Container
对于32位的整数,划分为高16位和低16位
将低16位的数放入容器,当容器包含的数小于4096个,认为其稀疏,用Array Container保存
将低16位的数放入容器,当容器包含的数大于4096个,认为其密集,用Bitmap Container保存
RoaringBitmap优点
- RoaringBitmap比Bitmap减少内存
- RoaringBitmap在交集和并集操作速度比Bitmap快
ClickHouse标签表设计的2种思路
- 大宽表
缺点:增加或删除标签字段时,表结构需要修改;当圈选的人群数量较大时,涉及到groupby的性能差 - Bitmap表
Hive导入数据到ClickHouse的几种方式
- Spark使用JDBC
- 通过dataX
- 通过HDFS
- 通过WaterDrop(主流方式)
WaterDrop
能够应用于Spark与Flink
- 高性能
- 简单易用
- 海量数据处理能力
- 多元数据处理
将Hive数据转换为ClickHouse的Bitmap
- 通过groupArray构造数组
- 构造物化视图
- 通过bitmapBuild构造Bitmap
- 插入到含有Bitmap数据类型的表