美团点评基于 Druid 的 Kylin 存储引擎实践

栏目: 数据库 · 发布时间: 6年前

内容简介:8月11日,由 Kyligence 主办、美团点评协办的 Apache Kylin Meetup@北京,在美团公司总部圆满落幕。本文整理自当天美团大数据工程师、Apache Kylin Committer 康凯森的演讲实录,全文共6,600字,阅读时间大约15分钟。或点击以下视频观看 Meetup 现场实录

8月11日,由 Kyligence 主办、美团点评协办的 Apache Kylin Meetup@北京,在美团公司总部圆满落幕。本文整理自当天美团大数据工程师、Apache Kylin Committer 康凯森的演讲实录,全文共6,600字,阅读时间大约15分钟。

或点击以下视频

观看 Meetup 现场实录 美团点评基于 Druid 的 Kylin 存储引擎实践

本次分享会分为三个部分的内容,首先会介绍 Kylin On Hbase 的问题,引入我们为什么要给 Kylin 增加新存储引擎的问题;接下来介绍Kylin新存储引擎的过程,以此来说明为什么选择 Druid 作为我们新的存储引擎;最后给大家介绍 Kylin On Druid 的核心架构、核心原理、性能和我们的初步成果,以下分享中将 Kylin On Druid 简称 KOD。

Kylin 在美团点评的服务现状

美团点评基于 Druid 的 Kylin 存储引擎实践

进入正式主题前,我先介绍下Kylin在美团点评的现状。 目前我们线上 Cube 数有近1000个,Cube 单副本存储近1PB;每天查询量380多万次,查询的 TP50 时延在200ms左右,TP90时延在1.2s左右。目前 Kylin 已经覆盖了美团点评所有主要业务线。

Kylin on HBase 问题

随着 Kylin 在我司的大规模使用和我们对Kylin的深入优化改进,我们发现了 Kylin 本身的一些痛点和问题,其中之一便是 Kylin On HBase 的性能问题。如图:我们用同一  SQL  在同一集群查询同一 Cube,前后性能相差上千倍。 两次查询的唯一不同点就是 Kylin 维度在 HBase 的 RowKey 中位置不同, 耗时90ms的查询中维度dt和poi_id 在 RowKey 前两位,耗时100多s的查询中维度dt和 poi_id 在 RowKey 后两位。

美团点评基于 Druid 的 Kylin 存储引擎实践

下面我们来看下Kylin On HBase中前后缀过滤性能相差巨大的原因:如图所示:Kylin中会将Cuboid+所有维度拼接成HBase的Rowkey,Kylin默认会将所有普通指标拼接成HBase一个Column Family中同一列的Value。HBase只有单一Rowkey索引,所以只有查询能够匹配Rowkey的前缀时,查询性能会十分高效,反之,查询性能会比较低下,甚至会出现全表Scan。此外,即使只需要查询一个指标,Kylin在HBase侧也需要Scan所有指标列,相比列存性能也会有较大差距。 总的来说,HBase在Kylin的查询场景下Scan和Filter效率较低下。

对于Kylin On HBase Scan和Filter效率低下的问题,我们比较自然会想到的解法是: 用列存加速Scan,用索引来加速Filter

这里我简单介绍下列存的优点,主要包含以下3点:

  1. 因为只需要读取必需访问的列,所以 列存有高效的IO

  2. 因为每列数据的类型一致,格式一致,所以 列存可以进行高效的编码和压缩

  3. 列存更容易实现向量化执行 ,而向量化执行相比传统的火山模型,函数调用次数更少,对CPU Cache和SIMD更加友好。 总的来说,列存相比HBase的KV模型更适合Kylin的查询场景。

所以,要解决 Kylin On HBase Scan 和 Filter 效率低下的问题, 我们就需要为 Kylin 增加一个列存,有高效索引的存储引擎。

Kylin 新存储引擎探索之路

美团点评基于 Druid 的 Kylin 存储引擎实践

在我们为Kylin新增一个存储引擎之前,我们自然就需要先了解Kylin的存储引擎组成。主要有5部分:存储格式,Cache,计算,调度和元数据。 计算指数据的Scan,过滤,聚合等,调度指文件增删,复制和负载均衡等,这里的元数据指的是存储引擎本身的元数据。其中存储格式对查询性能影响很大,也是HBase在Kylin查询场景下的痛点,所以我们决定首先去寻找或改造一个适合Kylin的存储格式。

Kylin 新存储引擎实现思路

美团点评基于 Druid 的 Kylin 存储引擎实践

当时我们主要有两个思路, 一种思路是基于Spark + 存储格式进行演进 : 就是找到一个优秀的存储格式后,和Spark进行集成。大概思路是将文件Cache到本地,用Spark来实现计算和查询的调度,整个方案大体上就可以Run起来。大家对这种思路感兴趣的话,可以参考TiDB的TiSpark项目,以及Snappydata这个系统。

第二种思路就是 找到或自研一个优秀的存储格式后,再参考HBase, Druid等系统,逐步完善成一个完整的存储引擎

所以,无论哪一种思路,我们都需要首先找到或者自研一个优秀的适合Kylin的存储格式。

美团点评基于 Druid 的 Kylin 存储引擎实践

我们在调研存储格式时 主要考虑Scan和Filter性能,导入性能,压缩率,集成难度这4点因素 ,其中重点关注Scan和Filter性能。

Kylin On Parquet POC

我们首先对Parquet进行了调研。因为Parquet是当前Hadoop生态列式文件的标准,在Hadoop生态中广泛使用。一个Parquet文件先按行逻辑上水平拆分成row groups,row groups内是列存,每一列是一个Column chunks,Column chunks进一步拆分成Page, Page是数据访问的最小单位。Parquet 可以通过min,max索引和字典实现row groups粒度的过滤,但是 没有Page粒度的索引

我们在17年5月份的时候进行了Kylin On Parquet POC,POC的结果也符合我们的理论预期:由于Parquet是列存,所以在Scan部分列时性能优于HBase,但由于存在Tuple重组,也就是列转行的开销,Scan性能会随着访问列的个数增加而降低,Scan全部列时性能不如HBase。 Filter方面,Parquet在前缀和后缀过滤上性能没有差别,但是由于当时的Parquet没有Page粒度的细粒度索引,所以前缀过滤性能明显比HBase差。

Kylin On CarbonData

由于Parquet过滤性能不足,所以我们就Pass了Kylin On Parquet的方案。 Parquet之后,我们又调研了当时新起的华为开源的存储格式CarbonData。和Parquet类似,CarbonData首先将数据水平切分成若干个Blocklet,Blocklet内部按列存储,每列的数据叫做一个Column Chunk。和Parquet不同的是,CarbonData拥有丰富的索引:MDK索引;Min,Max索引;倒排索引。MDK索引是多维度索引,类似Kylin中的维度索引,整个文件会按照多个维度列进行排序,这样对MDK列中的维度进行前缀过滤就会很高效。

CarbonData的列存+丰富索引的设计的确是我们所期望的,不过CarbonData和Spark耦合较深,且当时的CarbonData没有OutputFormat,也不是很成熟,所以我们也Pass了Kylin On CarbonData的方案。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

极简人工智能

极简人工智能

[英] 理查德·温 / 有道人工翻译、吴乔 / 电子工业出版社 / 2018-3-1 / 50

本书以通俗的语言和生动的案例带领你探索人工智能的世界,全面展示人工智能的概念、理论框架与应用价值,探讨人工智能的过去和将来,是一本深入浅出的人工智能通识书。从蚂蚁习性谈到股票市场,本书将带领你开启人工智能的奇幻之旅。一起来看看 《极简人工智能》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

html转js在线工具
html转js在线工具

html转js在线工具