现在已经名满天下的 Apache Kylin,是 Hadoop 大数据生态系统不可或缺的一部分,要知道在 Kylin 项目早期,可是以华人为主的开源团队,一路披荆斩棘经过几年的奋斗,才在 Apache 基金会牢牢的巩固了自己的位置。作为本土第一个进入到世界*基金会的项目,Kylin 的经验是值得大家学习的。
以下内容根据 COSCon'17讲师史少锋(Apache Kylin PMC&Committer 、Kyligence 技术合伙人兼高级架构师)的演讲速记所整理。
演讲实录
今天我主要介绍一下 Apache Kylin 一路走过来的心路历程。
时间倒退到2014年,那时候 Kylin 刚开源,我们选择了将项目捐赠给 Apache 孵化器,后来经过了大约一年的时间,Kylin 顺利地从孵化器毕业,成为 Apache 的*开源项目。
此次的分享大概分如下这么几个部分:
第一是 Kylin 简介。国内叫 Kylin 的项目比较多,我们这个项目全名要加上 Apache,即 Apache Kylin。
第二,架构与核心,和其它大数据项目有什么不同。
第三,这部分是重点,我会回顾一下 Kylin 的开源之路。
第四,一点感慨和总结。
我先自我介绍一下,我叫史少锋,2014年加入 Kylin 项目,是早期的贡献者之一,从开始给 Kylin 写代码,到现在运营社区,跟用户、开发者一起完善和改进 Kylin;期间我也做了很多新版本的发布。此外,Kylin 的文档也主要由我维护。
Kylin 项目诞生于 eBay,当初开源出去讲它是第一个由华人主导的项目,很多人还以为是 eBay 美国的华人工程师开发的,其实它是完完全全由 eBay 在上海的开发人员所开创、贡献出来的项目。当时国内进入 Apache 基金会的项目几乎还没有,Kylin 是第一个;现在这两年逐渐的多了起来,如 CarbonData,Eagle, Grffin, RocketMQ, WeeX 等。
Kylin 是在大数据生态中的一个项目,它解决的是在海量数据集上进行快速查询的难题。这个项目之所以诞生在 eBay,也是因为 eBay 拥有海量数据,有迫切的交互分析的需求。
曾经 eBay 是 Teradata 最大用户,Teradata 的设备非常昂贵,每年 eBay 需要付给 TD 非常大一笔费用。但是 eBay 也是一家技术公司,为什么不能来自己自研一些技术,来取代或降低 TD 的使用呢?但这是一件非常困难的事情,当时内部有很多争论,最后由在上海的韩卿(Luke Han,Apache Kylin Co-creator&PMC ,Kyligence CEO)带领的团队,通过研究和摸索做了出来。因为在 Hadoop 的生态中,很多项目代号都是动物,于是 Luke 就找了中国神话中象征吉祥和力量的动物——麒麟来命名。
现在国内很多大的互联网公司都在用Kylin,而且这个趋势正在往制造业、金融业等传统行业渗透。例如手机厂商 OPPO、VIVO、小米都在使用 Kylin 分析大数据。
什么是 Kylin?Kylin 的定位是什么呢?这张图非常清晰地显示了它在大数据生态的结构,它下面依赖的是 Hadoop 的分布式计算能力,对上提供的是标准 SQL接口,它集成了 Hadoop 主流的技术,像 HDFS、Hive、HBase 等等。
在 Hadoop 上做 SQL 查询的引擎有很多,比如说 Hive 本身就可以查询,那么Kylin 的 SQL 引擎跟它们有什么区别,为什么可以号称最快呢?原因是 Kylin 是唯一一个在 Hadoop 上做预计算的分析引擎,其它技术都不是做预计算,他们主要的核心技术是大规模并行计算(MPP)。我们认为当数据量大到一定程度的时候,MPP 无法提供高性能,所以我们借鉴了传统的预计算的技术并把它移植到了 Hadoop 上,就有了 Kylin。这是 Kylin 与其它 SQL 引擎的本质区别。
下面是 Apache Kylin 的两个特性:
超高性能。可以万亿数据上达到亚秒级的数据,典型案例来自今日头条,它的一个 Cube 里有3万亿条数据,90%的查询能够在1秒以内完成。
高并发。我们知道,一般性能上去以后,并发也就可以提高。Kylin 的另一大优势就是高并发。不少互联网公司把 Kylin 用在高并发的查询上,比如京东用在对外的数据接口上。比如美团,每日有130万次查询,99%的查询在1秒内。当然美团的技术能力是比较强的,我们团队有三个来自美团的 committer,他们对 Kylin 技术进行了深入的研究,帮助做了很多优化和改进。
下面是 Apache Kylin 的架构:
Kylin 的设计非常巧妙,它没有做别人已经做的东西,而且充分利用了一些成熟的技术,并且充分地发挥了它们的优势。左边是 Kylin 支持的数据源,主要支持的数据源有批数据源 hive 和流数据源 kafka。把海量的数据抽取出来,接下来预计算怎么做呢?Kylin 整合了 MR, Spark;Spark 引擎是在 Kylin2.0 引进的。会并发对你的数据,根据建立的模型做预先的计算处理、编码等等。最后计算好的数据,会转换并存储到 HBASE。
HBASE 是 Hadoop 上的海量数据库,是一个列式的,基于 KV 的 Storage 。它可以提供非常低延迟的查询,我们把关系型数据最终转成了 KV 的方式。但 Kylin 对外暴露的依然是 SQL 的接口,是关系型的模型。以前是怎么查 Hive 表,可以把这个 SQL 给到 Kylin,Kylin 会把这些 SQL 进行转换,变成对 Cube 的查询。从而最终基于先前的预计算的结果,再次的后计算。往往后计算就会非常快,在几十毫秒或者几百毫秒就完成结果,以上这些就是 Kylin 所做的事情。
Kylin 的安装部署也非常简单,它只有一个包,下载下来找一台机器就可以运行 Hadoop 的资源,不需要装到 Hadoop 上的每个节点。
Kylin 的核心就是 Cube 理论,大家如果学过数据仓库的话就很清楚,Cube 是其中非常核心的一块。Cube是存放多维聚合数据的集合,比如我们能想象到的一个三维的立方体,它有长宽高三个维度。通过长宽高三个值可以定位到一个小的数据格,在这个里面就可以存储数据。如果把这个概念延伸出去,可以有十维、二十维的 Cube。在线分析领域会按一些纬度去分析特定的指标,我们可以根据维度建立多维的向量空间,当查询来的时候,根据查询中所体现出的纬度和过滤条件去直接定位多维空间的数值,从而给到最终的结果。
比如这里是一个四维的 Cube,有时间纬度、商品纬度、地点纬度、供应商纬度,总共组合下来有16种纬度组合。每一个组合中每个纬度有自己的值,所以最终会形成一个大的 Cube。Cube 可以带来什么好处呢?它可以让查询比以前快很多倍,怎么快呢?这里看一个例子,它是一个典型的 SQL 查询,会查询多张表,按条件组装和过滤,过滤完以后还要做聚合,计算出结果后可能还会有排序。这样会形成一个从上到下的执行计划。当数据量加倍后,这个表的 Join 和聚合的计算量也会加倍,所以我们说没有预计算的查询引擎,它的时间复杂度是 O(N)。
如果我们把它计算成 Cube,在计算 Cube 的时候会预先把表做 join 及聚合。聚合完转换成 Cube,Cube 里面有很多 Cuboid 里面有很多的索引。最终查询过来的时候,透明地转换成右边的执行计划,以Cube 为起点,再去根据你的条件做一些过滤,再做少量的排序。由于在 Cube 中数据已经进行了聚合和索引以及压缩,所以查询响应非常快。它已经跟原始数据量的大小没有关系了,只跟数据模型的复杂度有关。一般业务的复杂度是基本稳定的,所以我们说用了 Kylin 后,查询时间复杂度可以降到 O(1)。
这里是网易提供的性能数据,比如网易云音乐经常要去找现在最流行的歌手和歌曲,这个查询量很大。之前用 Oracle 查询,延迟很高。用了 Kylin 预计算后,性能提升百倍、千倍甚至更多。Kylin 的架构适合做水平扩展,当需要的并发量更高,单个 Kylin 的节点不能满足的时候,只要相应的增加节点数就可以使得吞吐率得到线性的增长。
下面介绍一下Apache Kylin 的开源之路。
Kylin 诞生于 eBay,因为 eBay 是一个全球性的公司,有世界级的市场,有非常多的交易数据、用户数据。eBay 分析师团队非常庞大,这些数据分析非常依赖于数据仓库,这些数据仓库是非常昂贵的。今天有越来越多的数据在 Hadoop 被加工、采集、转换,以前这些数据加工完以后,要到 TD 中才能做分析,首先这个架构就是割裂的架构,非常容易出错。我们想为什么不能在 Hadoop 直接做,当时也是做了各种各样的调研,做了很多的调研,试用了很多项目,但是不能解决 eBay 所遇到的问题。所以最后决定自己做。
当时 eBay 在上海有非常不错的工程师团队和工程师文化,Luke 找到了蒋旭,蒋旭对数据分析、搜索引擎比较了解,再加上在 eBay 做了 Hadoop 相关的开发,所以对 Hadoop 很懂,所以拿来书就开始研究。最后,他想出一条路——在 Hadoop 上做预计算,思路定下来以后,就开始招兵买马找人做这个项目。
这个项目从2013年开始做,加班加点差不多一年时间,在2014年的10月1号项目在 eBay 内部上了生产。上了生产的同一天 Luke 他们就把代码放在 Github 上进行开源,为什么要开源?一个原因是eBay 的主营业务是电商,技术并不是它的主要业务;另一方面,eBay 也是硅谷技术公司,本身用了很多开源技术,拥有开源的传统。
项目在 Github 上开源以后,很快收获了很多赞,很多大佬对这个项目给予了非常高的评价,因为Kylin 确实做了一件别人没有做的事情。随后有人提议,项目要不要去 Apache孵化?Kylin而言,去Apache 非常好的一个选择,因为大数据的开源项目基本上都在 Apache,进 Apache 相当于回归到Kylin应该在的地方,而且这个社区知名度、品牌度都高。
所以2014年11月,Kylin 进入了 Apache 软件基金会孵化。进入 Apache 孵化器并不意味着就成功了,而是一个按照 Apache 要求进行孵化的过程,各项都要按照 Apache 要求来做,代码要迁移到 Apache 的仓库,committer 要签 Apache 的协议,使用的第三方类库许可证要做清理,不满足 Apache 的要求的许可证的依赖都要去除、剥离。
大概过了好几个月,在2015年的3月份,我们才做了第一个 Apache Release。第一个版本出来安装起来并不是很容易,当然这跟 Hadoop 的环境有关。所以在2015年的时候我们主要是解决用户各种各样的问题来完善项目。
期间很有意思的是美国有一个科技媒体 InfoWorld,每年它都会评选最佳开源软件。那年 Kylin 刚开源不到一年,它就把最佳开源大数据的奖项给了 Kylin。由于这个奖是独立评选的,我们甚至都没有得到通知,我们是在几个月以后在 twitter 上被人 @ 并恭喜了才得知自己获奖了,这给了我们一个很大的鼓舞——原来这个工具在海外评价如此高!
2015年,Kylin 已经被很多大厂商应用于生产环境,包括百度、京东等,这很重要,这说明了Kylin项目经受住了实战的考验,正逐渐成熟。后来我们开始发起关于从孵化器毕业的讨论,由于 Kylin 的社区活跃度比较高,代码的质量也毋庸置疑,所以我们以为讨论会比较顺利,但有意思的是,因为这是第一个来自中国的项目,在投票的时候有人提出了质疑,甚至修改主题为讨论来自中国的开源项目,他们说中国工程师总喜欢在 QQ 群里面讨论,不喜欢在邮件里讨论,这不符合 Apache 的精神,而且经常用中文讨论导致他们看不懂云云。
这种带有偏见性的邮件出来以后,我们心里难免有一些气愤。因为事实是,的确有一些技术的 QQ 群成立了,我也曾经被人拉进去,但每一次我们确实都在解释说 Apache 不建议通过 QQ 群讨论,有问题还是去社区发邮件,大家在 QQ 群问了问题,我们给你做了答复,但下一个用户看不到这个问题,搜索引擎也没有办法检索到,这些知识没法被沉淀,所以我们退了群,我们给出的回应是:有问题在社区提问,这样下次有人问类似问题的时候不需要再回答,只需要给一个链接。当然,关于上面说到的邮件,随后 Luke 给出了一个有力的回复,Luke 用数字证明了 Kylin 社区的活跃度。当时也有 Apache 的资深人士站出来说,要停止这样无意义的、有偏见性的讨论。
到毕业投票的时候,也还是发生了一些小插曲。一开始的投票都是+1赞成,但突然有个 reviewer 给了个-1,因为他仔细扫描了我们的代码,发现前端页面有打包一个谷歌的字体文件,这个字体的 license 来源不明,不适合打包在 Apache 软件。当时我们紧急撤换字体,换到其它可用的字体,再补发一个新的版本,这位 reviewer 随后说我改变我的投票为+1。至此我们项目以全票通过的方式顺利从孵化器毕业了。
毕业成为*项目在我们看来还只是一个起点,它代表我们的项目得到了大家的认可,但前面还有更长的路要走。在2016年初的时候,当时的团队几名成员出来成立了一家公司,专门致力于 Kylin 的发展。
这里有一个争论,就是 Kylin 是不是获得了知识产权呢?其实这个项目是捐献给了 Apache 基金会,它不属于任何一家公司,它的知识产权是属于社区,属于大家的,每个人都可以致力于这样的开源项目做二次开发。我们成立公司以后,在2016年发布了 Kylin 的商业版 KAP,因为一些行业和客户对产品有更高的需求,现在我们开源版和企业版一起在推动。2016年的时候 Kylin 又蝉联了最佳大数据工具的奖项,2016获奖的名单比2015年减少了一半,从22个变成了11个,足以说明了用户对 Kylin 的认可。
在今年 Kylin 版本已经最新发布到 2.2。接下来简要介绍一下 Kylin 版本的一些主要变化吧。第一个版本2014天10月的时候是比较简陋粗糙,很多用户在安装的时候遇到问题。1.0 版本的时候兼容性已经大大提高,大家拿去解压基本上就可以运行了,不像之前 0.7 的版本还要做很多手工配置。后来到 1.5 版本,对底层的存储引擎做了大幅改进,改成了分片的存储,使得它的性能提升若干倍。随后的 1.6 版本加入了对流式数据的支持,使得数据从产生到被查询到的时间大幅缩减。今年初更大的一个版本 2.0 发布,最大的变化是支持雪花模型,还有是对 Spark 的支持,使得构建的时间可以减少三分之一到二分之一。2.2 版本又支持了查询下压到其他引擎的功能。
如今 Kylin 的用户数非常多,不止二三百个,互联网企业很多都在用 Kylin,包括国外也有多的用户在使用。现在我经常接到一些帮助请求,来自英国、意大利、法国、以色列等等。我们在金融、电信领域,有非常大的发展空间。例如太保、银联、华泰证券,陆金所,还有三大电信公司,都跟我们有合作。中国前三大手机厂商,包括华为,都是 Kyin 的用户。
Kylin 今天取得的成功是我们最初没有看到的。当初做这个项目的一些伙伴,有一些陆续离开了团队。从始至终麒麟的核心人员也就四五个,Kylin 的贡献者远少于其他的开源项目,但是社区的邮件非常活跃,我们第三季度有超过1000个邮件讨论,当然线下还很多的 QQ 群、微信群在讨论,那个就不统计了。我每天固定抽出一定时间,会到邮件社区帮助用户解决这些问题,大家都是义务在为开源项目工作。
最后总经一下,如何成为一个成功的开源项目。
产品要好用。易用性非常重要,Kylin 不仅性能好,而且还提供了丰富易用的接口和用户界面。
性能追求极致。不断优化查询引擎、存储引擎,追求更好的性能。
构建生态。我们不是一家什么都做的公司,跟其他厂商一起合作发展有助于生态的构建。
轻量级架构。对管理员友好,架构要非常容易地扩展部署,满足企业不同的 IT 架构。
倾听社区用户的反馈。这样他们才会长期地跟随你一起来发展。
我们非常欢迎大家贡献到开源社区,贡献到 Apache。为 Apache *开源项目贡献代码并不难,第一步先加入社区讨论,知道大家做什么,知道大家有哪些难点。其次在学习之后贡献你的 patch,有了第一个 patch 后,希望你持续地贡献,贡献到10个20个,或者更多的时候我们就可以来投票,将你发展成 committer。Apache Committer 对于个人是一个很好的认可,你的品牌、代码全世界的人都可以看到。
最后和大家简单提一下我们公司 -- Kyligence,基于 Apache Kylin 之上提供商业服务的大数据创业公司。公司位于上海张江,已经在硅谷设立分公司,以后会有更多。我们这家公司跟交大有非常深的渊源,我们的主力都是交大的校友。Kylin 头六号的贡献者中五位是交大毕业,所以我们也非常欢迎交大的师弟师妹加入我们公司,大家一起来做一个世界级的项目。