Categories
数据库

KYLIN、DRUID、CLICKHOUSE核心技术对比

KYLIN、DRUID、CLICKHOUSE是目前主流的OLAP引擎,本文尝试从数据模型和索引结构两个角度,分析这几个引擎的核心技术,并做简单对比。在阅读本文之前希望能对KYLIN、DRUID、CLICKHOUSE有所理解。

1. KYLIN数据模型

Kylin的数据模型本质上是将二维表(Hive表)转换为Cube,然后将Cube存储到HBase表中,也就是两次转换。详细信息可以参我的另一篇文章《Kylin数据模型》

第一次转换,其实就是传统数据库的Cube化,Cube由CuboId组成,下图每个节点都被称为一个CuboId,CuboId表示固定列的数据数据集合,比如“ AB” 两个维度组成的CuboId的数据集合等价于以下SQL的数据集合:

select A, B, sum(M), sum(N) from table group by A, B
image

第二次转换,是将Cube中的数据存储到HBase中,转换的时候CuboId和维度信息序列化到rowkey,度量列组成列簇。在转换的时候数据进行了预聚合。下图展示了Cube数据在HBase中的存储方式。

image

2. KYLIN索引结构

因为Kylin将数据存储到HBase中,所以kylin的数据索引就是HBase的索引。HBase的索引是简化版本的B+树,相比于B+树,HFile没有对数据文件的更新操作。

HFile的索引是按照rowkey排序的聚簇索引,索引树一般为二层或者三层,索引节点比MySQL的B+树大,默认是64KB。数据查找的时候通过树形结构定位到节点,节点内部数据是按照rowkey有序的,可以通过二分查找快速定位到目标。

image

KYLIN小结:适用于聚合查询场景;因为数据预聚合,Kylin可以说是最快的查询引擎(group-by查询这样的复杂查询,可能只需要扫描1条数据);kylin查询效率取决于是否命中CuboId,查询波动较大;HBase索引有点类似MySQL中的联合索引,维度在rowkey中的排序和查询维度组合对查询效率影响巨大; 所以Kylin建表需要业务专家参与。

4. DRUID数据模型

Druid数据模型比较简单,它将数据进行预聚合,只不过预聚合的方式与Kylin不同,kylin是Cube化,Druid的预聚合方式是将所有维度进行Group-by,可以参考下图:

image

5. DRUID索引结构

Druid索引结构可以参考我的另一篇文章《Druid存储结构》,它使用自定义的数据结构,整体上它是一种列式存储结构,每个列独立一个逻辑文件(实际上是一个物理文件,在物理文件内部标记了每个列的start和offset)。对于维度列设计了索引,它的索引以Bitmap为核心。下图为“city”列的索引结构:

image

首先将该列所有的唯一值排序,并生成一个字典,然后对于每个唯一值生成一个Bitmap,Bitmap的长度为数据集的总行数,每个bit代表对应的行的数据是否是该值。Bitmap的下标位置和行号是一一对应的,所以可以定位到度量列,Bitmap可以说是反向索引。同时数据结构中保留了字典编码后的所有列值,其为正向的索引。

那么查询如何使用索引呢?以以下查询为例:

select site, sum(pv) from xx where date=2020-01-01 and city='bj' group by site
  1. city列中二分查找dictionary并找到’bj’对应的bitmap
  2. 遍历city列,对于每一个字典值对应的bitmap与‘bj’的bitmap做与操作
  3. 每个相与后的bitmap即为city=’bj’查询条件下的site的一个group的pv的索引
  4. 通过索引在pv列中查找到相应的行,并做agg
  5. 后续计算

DRUID小结:Druid适用于聚合查询场景但是不适合有超高基维度的场景;存储全维度group-by后的数据,相当于只存储了KYLIN Cube的Base-CuboID;每个维度都有创建索引,所以每个查询都很快,并且没有类似KYLIN的巨大的查询效率波动。

7. CLICKHOUSE索引结构(只讨论MergeTree引擎)

因为Clickhouse数据模型就是普通二维表,这里不做介绍,只讨论索引结构。整体上Clickhouse的索引也是列式索引结构,每个列一个文件。Clickhouse索引的大致思路是:首先选取部分列作为索引列,整个数据文件的数据按照索引列有序,这点类似MySQL的联合索引;其次将排序后的数据每隔8194行选取出一行,记录其索引值和序号,注意这里的序号不是行号,序号是从零开始并递增的,Clickhouse中序号被称作Mark’s number;然后对于每个列(索引列和非索引列),记录Mark’s number与对应行的数据的offset。

下图中以一个二维表(date, city, action)为例介绍了整个索引结构,其中(date,city)是索引列。

image

那么查询如何使用索引呢?以以下查询为例:

select count(distinct action) where date=toDate(2020-01-01) and city=’bj’
  1. 二分查找primary.idx并找到对应的mark’s number集合(即数据block集合)
  2. 在上一步骤中的 block中,在date和city列中查找对应的值的行号集合,并做交集,确认行号集合
  3. 将行号转换为mark’s number 和 offset in block(注意这里的offset以行为单位而不是byte)
  4. 在action列中,根据mark’s number和.mark文件确认数据block在bin文件中的offset,然后根据offset in block定位到具体的列值。
  5. 后续计算

该实例中包含了对于列的正反两个方向的查找过程。反向:查找date=toDate(2020-01-01) and city=’bj’数据的行号;正向:根据行号查找action列的值。对于反向查找,只有在查找条件匹配最左前缀的时候,才能剪枝掉大量数据,其它时候并不高效。

Clickhouse小结:MergeTree Family作为主要引擎系列,其中包含适合明细数据的场景和适合聚合数据的场景;Clickhouse的索引有点类似MySQL的联合索引,当查询前缀元组能命中的时候效率最高,可是一旦不能命中,几乎会扫描整个表,效率波动巨大;所以建表需要业务专家,这一点跟kylin类似。

小结

  • KYLIN、DRUID只适合聚合场景,CLICKHOUSE适合明细和聚合场景
  • 聚合场景,查询效率排序:KYLIN > DRUID > CLICKHOUSE
  • KYLIN、CLICKHOUSE建表都需要业务专家参与
  • KYLIN、CLICKHOUSE查询效率都可能产生巨大差异
  • CLICKHOUSE在向量化方面做得的最好,DRUID少量算子支持向量化、KYLIN目前还不支持向量化计算。

版权声明:文章为作者辛勤劳动的成果,转载请注明作者与出处。

4,459 replies on “KYLIN、DRUID、CLICKHOUSE核心技术对比”

etkisizecekler köprü altı çocuğuacaktım kimyasalıyortular kemerlemekmiştim kökleşmeecektim kiklotronuyortular doğrucaytım deniz rezenesinin kaprismiştim kabaklıkıyor 65125

I was curious if you ever considered changing the layout of your blog?
Its very well written; I love what youve got to say.
But maybe you could a little more in the way of content so people could
connect with it better. Youve got an awful lot of text for only having 1 or 2 pictures.

Maybe you could space it out better?

Wow that was strange. I just wrote an very long comment but after I clicked
submit my comment didn’t appear. Grrrr… well I’m not
writing all that over again. Regardless, just wanted to say
wonderful blog!

An impressive share! I’ve just forwarded this onto a co-worker
who has been conducting a little homework on this. And he actually ordered me breakfast due to the fact that I discovered
it for him… lol. So allow me to reword this….

Thanks for the meal!! But yeah, thanks for spending time to talk about this topic here on your blog.

Greetings I am so excited I found your blog, I really found you by error, while I was
searching on Askjeeve for something else, Anyways I am here now and would just like to say thank you for a marvelous post and
a all round interesting blog (I also love the theme/design),
I don’t have time to go through it all at the minute but I have book-marked it and also added in your RSS
feeds, so when I have time I will be back to read a lot more,
Please do keep up the superb work.

Информационная статья от врачей и экспертов о ковиде, на авторитетном портале Coronavirus-Control со ссылками на официальные и государственные источники стопкоронавирус.рф – https://hacknicovid19.ru/
Эта информация для меня была полезна, сохранила в закладки.

I’m not certain where you are getting your information, but good
topic. I must spend some time studying much
more or figuring out more. Thanks for great info I was on the lookout for this information for
my mission.

“สล็อตออนไลน์” ถ้าพูดถึงเกมสล็อตที่เล่นง่าย สล็อตค่าย pg ที่ดีที่สุด เครดิตฟรีกดรับเองยืนยันเบอร์
ต้องยกให้superslot เครดิตฟรี50
ยืนยันเบอร์ล่าสุดเกมสล็อต The Great Icescape
เกมสล็อตเพ็นกวินที่อยู่ในดินแดนน้ำแข็ง ไม่ว่าใครๆ ก็สามารถพบกับความน่ารักชวนหลงใหลของเจ้าเพนกวินน้อยได้ที่นี่เว็บไซต์ เป็นอีกหนึ่งเกมที่เล่นง่ายสามารถเล่นได้บนมือถือทุกระบบ สะดวกสบายต่อการเข้าถึง สามารถเล่นได้ทุกที่ทุกเวลาเรียกได้ว่าตลอด 24 ชั่วโมงเลยก็ว่าได้

Every weekend i used to pay a visit this web site, as i wish for enjoyment, for the reason that this this
website conations in fact nice funny data too.

I know this if off topic but I’m looking into starting my own weblog and
was wondering what all is required to get setup?
I’m assuming having a blog like yours would cost a pretty penny?
I’m not very web savvy so I’m not 100% sure. Any suggestions or advice would be greatly appreciated.
Thank you