内容简介: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 现场实录
本次分享会分为三个部分的内容,首先会介绍 Kylin On Hbase 的问题,引入我们为什么要给 Kylin 增加新存储引擎的问题;接下来介绍Kylin新存储引擎的过程,以此来说明为什么选择 Druid 作为我们新的存储引擎;最后给大家介绍 Kylin On Druid 的核心架构、核心原理、性能和我们的初步成果,以下分享中将 Kylin On Druid 简称 KOD。
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 后两位。
下面我们来看下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点:
-
因为只需要读取必需访问的列,所以 列存有高效的IO
-
因为每列数据的类型一致,格式一致,所以 列存可以进行高效的编码和压缩
-
列存更容易实现向量化执行 ,而向量化执行相比传统的火山模型,函数调用次数更少,对CPU Cache和SIMD更加友好。 总的来说,列存相比HBase的KV模型更适合Kylin的查询场景。
所以,要解决 Kylin On HBase Scan 和 Filter 效率低下的问题, 我们就需要为 Kylin 增加一个列存,有高效索引的存储引擎。
Kylin 新存储引擎探索之路
在我们为Kylin新增一个存储引擎之前,我们自然就需要先了解Kylin的存储引擎组成。主要有5部分:存储格式,Cache,计算,调度和元数据。 计算指数据的Scan,过滤,聚合等,调度指文件增删,复制和负载均衡等,这里的元数据指的是存储引擎本身的元数据。其中存储格式对查询性能影响很大,也是HBase在Kylin查询场景下的痛点,所以我们决定首先去寻找或改造一个适合Kylin的存储格式。
Kylin 新存储引擎实现思路
当时我们主要有两个思路, 一种思路是基于Spark + 存储格式进行演进 : 就是找到一个优秀的存储格式后,和Spark进行集成。大概思路是将文件Cache到本地,用Spark来实现计算和查询的调度,整个方案大体上就可以Run起来。大家对这种思路感兴趣的话,可以参考TiDB的TiSpark项目,以及Snappydata这个系统。
第二种思路就是 找到或自研一个优秀的存储格式后,再参考HBase, 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的方案。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 存储助力业务:58对象存储系统WOS研发实践
- Android数据存储安全实践
- 基于 Ceph 对象存储构建实践
- 中通统一安全文件存储服务实践
- HIDS 系统存储方案探索与实践
- MySQL中存储UUID的最佳实践
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Art of Computer Programming, Volumes 1-3 Boxed Set
Donald E. Knuth / Addison-Wesley Professional / 1998-10-15 / USD 199.99
This multivolume work is widely recognized as the definitive description of classical computer science. The first three volumes have for decades been an invaluable resource in programming theory and p......一起来看看 《The Art of Computer Programming, Volumes 1-3 Boxed Set》 这本书的介绍吧!