1 Kylin是什么
[size=13.3333px]今天,随着移动互联网、物联网、AI等技术的快速兴起,数据成为了所有这些技术背后最重要,也是最有价值的“资产”。如何从数据中获得有价值的信息?这个问题驱动了相关技术的发展,从最初的基于文件的检索、分析程序,到数据仓库理念的诞生,再到基于数据库的商业智能分析。而现在,这一问题已经变成了如何从海量的超大规模数据中快速获 取有价值的信息,新的时代、新的挑战、新的技术必然应运而生。
[size=13.3333px]在大数据处理技术领域,用户最普遍的诉求就是希望以很简易的方式从大数据平台上快速获取查询结果,同时也希望传统的商务智能工具能够直接和大数据平台连接起来,以便使用这些工具做数据分析。目前已经出现了很多优秀的SQL on Hadoop引擎,包括Hive、Impala及 SparkSQL等,这些技术的出现和应用极大地降低了用户使用Hadoop平台的难度。
为了进一步满足“在高并发、大数据量的情况下,使用标准SQL查询聚合结果集能够达到毫秒级”这一应用场景,Apache Kylin应运而生,在 eBay孵化并最终贡献给开源社区。Apache Kylin是2013年由eBay 在上海的一个中国工程师团队发起的、基于Hadoop大数据平台的开源 OLAP引擎,它采用多维立方体预计算技术,利用空间换时间的方法,把很多分钟级别乃至小时级别的大数据查询速度一下子提升到了亚秒级别,极大地提高了数据分析的效率,填补了业界在这方面的空白。该引擎为超大规模数据集上的交互式大数据分析打开了大门。
2 为什么要用Kylin
[size=13.3333px]自从10年前Hadoop诞生以来,大数据的存储和批处理问题均得到了 妥善解决,而如何高速地分析数据也就成为了下一个挑战。于是各式各 样的“SQLon Hadoop”技术应运而生,其中以Hive为代表,Impala、Presto、 Phoenix、Drill、SparkSQL等紧随其后。它们的主要技术是“大规模并行处理”(Massive Parallel Processing,MPP)和“列式存储”(Columnar Storage)。 大规模并行处理可以调动多台机器一起进行并行计算,用线性增加的资源来换取计算时间的线性下降。列式存储则将记录按列存放,这样做不仅可以在访问时只读取需要的列,还可以利用存储设备擅长连续读取的特点,大大提高读取的速率。这两项关键技术使得Hadoop上的SQL查询 速度从小时提高到了分钟。
[size=13.3333px]然而分钟级别的查询响应仍然离交互式分析的现实需求还很远。分析师敲入查询指令,按下回车,还需要去倒杯咖啡,静静地等待查询结 果。得到结果之后才能根据情况调整查询,再做下一轮分析。如此反复, 一个具体的场景分析常常需要几小时甚至几天才能完成,效率低下。 这是因为大规模并行处理和列式存储虽然提高了计算和存储的速 度,但并没有改变查询问题本身的时间复杂度,也没有改变查询时间与 数据量成线性增长的关系这一事实。假设查询1亿条记录耗时1分钟,那么查询10亿条记录就需10分钟,100亿条记录就至少需要1小时40分钟。 当然,可以用很多的优化技术缩短查询的时间,比如更快的存储、更高效 的压缩算法,等等,但总体来说,查询性能与数据量呈线性相关这一点是 无法改变的。虽然大规模并行处理允许十倍或百倍地扩张计算集群,以 期望保持分钟级别的查询速度,但购买和部署十倍或百倍的计算集群又 怎能轻易做到,更何况还有高昂的硬件运维成本。
[size=13.3333px]另外,对于分析师来说,完备的、经过验证的数据模型比分析性能更 加重要,直接访问纷繁复杂的原始数据并进行相关分析其实并不是很友 好的体验,特别是在超大规模的数据集上,分析师将更多的精力花在了 等待查询结果上,而不是在更加重要的建立领域模型上。
3 Kylin怎样解决关键问题
[size=13.3333px]Apache Kylin的初衷就是要解决千亿条、万亿条记录的秒级查询问 题,其中的关键就是要打破查询时间随着数据量成线性增长的这个规 律。仔细思考大数据OLAP,可以注意到两个事实。
- 大数据查询要的一般是统计结果,是多条记录经过聚合函数计算后 的统计值。原始的记录则不是必需的,或者访问频率和概率都极低。
- 聚合是按维度进行的,由于业务范围和分析需求是有限的,有意义 的维度聚合组合也是相对有限的,一般不会随着数据的膨胀而增长。
基于以上两点,我们可以得到一个新的思路——“预计算”。应尽量多 地预先计算聚合结果,在查询时刻应尽量使用预算的结果得出查询结果,从而避免直接扫描可能无限增长的原始记录。
[size=13.3333px]举例来说,使用如下的SQL来查询10月1日那天销量最高的商品:
select item,sum(sell_amount) from sell_detailswhere sell_data=’2016-10-1’group by itemorder by sum(sell_amount) desc;
[size=13.3333px]用传统的方法时需要扫描所有