Apache Kylin 是 Hadoop 大数据平台上的一个开源 OLAP 引擎。它采用多维立方体预计算技术,可以将大数据的 SQL 查询速度提升到亚秒级别,它是一种以空间换时间的做法。
SQL on Hadoop 技术(Hive, Impala, SparkSQL等)将传统的数据库查询的小时级别提升到分钟级别,而 OLAP on Hadoop 则将 SQL on Hadoop 的分钟级别提升到亚秒级别。
SQL on Hadoop 的技术主要是:“大规模并行处理”(MPP: Massive Parallel Processing)和 “列式存储”(Columnar Storage)。MPP可以调动多台机器一起进行并行计算,通过增加机器来减少计算时间。列式存储则将记录按列存放存放,这样做不仅可以在访问时只读取需要的列,还可以利用存储设备擅长连续读取的特点,大大提高读取的速率。虽然这两项技术能提高计算和存储的速度,但还是无法改变查询问题本身的时间复杂度,查询时间总得跟数据量线性增长的关系。如果随着数据量的增加还想保持查询的时间不变就得扩大集群规模增加机器,但这样,机器成本高之外运维成本也随之增加。
Apache Kylin 的初衷就是要让千亿条、万亿条的数据达到秒级查询,其中的关键就是要打破查询时间随着数据量成线性增加的这个规律。大数据 OLAP 都有两个事实:1.大数据查询要的一般是统计结果,是多条记录经过聚合函数计算后统计值。原始的记录不是必需的,或者访问频率和概率极低。2.聚合是按维度进行的,由于业务范围和分析需求是有限的,有意义的维度聚合也是相对有限的,一般不会随着数据的膨胀而增长。基于以上两点,可以得到新思路--“预计算”。在查询前进行尽量多地预先计算聚合结果,查询的时候尽量使用预算的结果得出查询结果,从而避免直接扫描可能无限增长的原始记录。
举例:select item, sum(sell_amount) from sell_details where sell_date = '2016-10-01' group by item order by sum(sell_amount) desc
这个 sql 语句是查询10月1日当天的销售商品的排行,是我们在业务场景中经常遇到的。如果用传统的方法,假设当天有1亿条数据,那就得全局扫描并累计,要是有2亿条,那查询时间就翻一倍,这就是所谓的时间随数据线性增长。
如果使用预计算,则会事先按维度 [sell_date, item] 计算 sum(sell_amount) 并存储下来,查询的时候就少了聚合sum运算,直接就可查询sum后的数然后加以排序的就可以了。如果商品有10000条,那么查询的记录数就不会超过10000,也就是不会超过维度[sell_date, item]的组合数。而且这样查询速度不会随记录的增加而增加,只会受到维度sell_date和item的影响,当这两个值增大时,查询时间才会增加。
所以预计算就是 Kylin 在 ”大规模并行处理“ 和 ”列式计算“之外提供给大数据分析的第三个关键技术。