大数据实时多维分析工具选型

Apache Kylin

一个采用多维立方体预计算技术的 OLAP 引擎框架,简单来说就是做大数据查询的。

Apache Kylin 的工作原理本质上是 MOLAP(Multidimensional Online Analytical Processing)Cube,也就是多维立方体分析。

特性
  • SQL 接口

    标准查询 SQL 支持

  • 支持海量数据集,增量更新

    不会随着数据量的增长导致查询时间线性增长,查询时间只跟维度的个数和基数

  • 亚秒级响应

    因为预计算,所以查询时间就是一个查询结果的时间

  • 水平扩展

    扩展查询性能,预计算性能扩展需要根据底层计算引擎分别扩展

  • 可视化集成

    提供了 ODBC/JDBC 接口和 RESTful API ,方便集成

  • 计算引擎可插拔

    目前主要的两个引擎是 MR 和 Spark

  • 存储后端可插拔

    目前主要是 基于HBase 的查询后端,也可以基于 Druid 等。

缺点
  • 不支持随机和明细查询

    因为预计算的都是多维度的聚合结果,因为随机和明细的查询是不支持的

  • 只支持星型模型

    雪花模型和星座模型可以转为星型模型

  • 空间换时间

    因为预计算的原因,结果数据会因为维度和度量的个数和基数而直线膨胀

  • 数据结构发生变化需要重新 build cube

    因为预计算的原因,导致历史结果数据无法更新只能重写覆盖

Apache Druid

是一个为在大数据集之上做实时统计分析而设计的开源数据存储。这个系统集合了一个面向列存储的层,一个分布式、shared-nothing的架构,和一个高级的索引结构,来达成在秒级以内对十亿行级别的表进行任意的探索分析。

特性
  • 亚秒级响应
  • 实时导入-kafka
  • 支持复杂的聚合
  • 不支持大表join
  • lookup功能可以join维表
  • 预计算-使用 MR 导入数据
缺点
  • 集群复杂

    各个节点的配置太多,难以管理

  • SQL支持不完善

  • 集成 BI 只能 superset 等几个

  • 无法精确计算

Presto

特性
  • 多数据源

    MySQL、Hive、Kafka、PostgreSQL、Cassandra等多种connector,并且支持分库分表。

  • 支持 SQL

    完全支持标准 SQL

  • 扩展性强

    很容易自定义特定数据源的 connector

  • 混合计算

    同一个类型数据源可以配多个 catalog,多个catalog之间能直接进行 join 查询和计算

  • 高性能

    平均性能是 Hive 的 10 倍。

  • BI 集成

    ODBC和JDBC进行 BI 集成,无 REST API

缺点
  • 性能不稳定,延迟不稳定

    受数据量和查询维度的影响较大,到达一定数量级,性能直线下降。

  • 并发不高

    受内存资源影响,查询并发不够高

选型要求

总体来说,多维分析有两类场景:

  • 随机查询:临时性的数据分析需求,手写 SQL,形式多变,逻辑也不定,这种场景一般对响应时间没有具体要求,越快越好

  • 固化查询:已经固定的维度分析以及报表分析等场景,对响应时间要求高,聚合查询的 SQL 较多

随机查询选型

正常情况下,随机查询没有捷径可走。只能通过优化计算来提高查询速度,同时保证数据准确度和用户友好即SQL支持好,因此,此类场景下的选型比较简单,以下选择:

  • Hive

    原生的Hadoop生态的数据仓库,相对来说,用于存数据比较好,查询用MR计算,比较耗时。

  • SparkSQL

    Spark体系的,完全支持读 Hive数据,内存计算,内存不够磁盘来凑。

  • Presto

    纯内存计算,并发读不够,支持跨数据源 join

  • Impala

    CDH粘合度较高,不支持跨库查询

固化查询选型

一般来说,适用固化查询的有两类,一个是MPP架构,一个是基于预计算的。在 MPP架构方面,Impala 和 Presto 等性能还不错,但是随着数据量的增加,查询性能直线下降。预计算方面,只要有 Kylin 和 Druid 两个开源组件,各有优劣。通过表格来进行比较。

对比项 Presto Apache Druid SparkSQL Apache Kylin
亚秒级响应 N Y N Y
高并发 N Y N Y
百亿数据集 N Y Y Y
SQL支持 Y Y (接近完成) Y Y
离线 Y Y Y Y
实时 N Y N Y (接近完成)
精确去重 Y N Y Y
明显查询 Y N Y N
随机查询 Y N Y N
模型改变 Y N Y N
多表 join Y N Y Y
ODBC/JDBC 集成 Y N Y Y
Rest API for BI N Y N Y

简单的测试:

Presto: count 13亿数据 花了 大概半分钟,40G的环境内存没吃满

SparkSQL:同样数据同样SQL情况下,花了大概 十几秒,具体吃的资源忘记看了,但是应该也不大。

Kylin 和 Druid :时间主要花在预计算上,加上 Druid 接入 Parquet 元数据比较麻烦, 所以就没做这块的对比。业界普遍的测试结果时,查询时 Druid 比 Kylin 快,因为 HBase 的扫描赶不上倒排索引,但是 Druid 摄取数据没有 Kylin 方便。

环境安装和各个组件的样例测试的个人感受:

Presto很简单,能连接的数据源也很多,就是响应速度和查询并发上不是很好,相对于 Druid 和 Kylin来说。

Kylin 真正应该说是一个 OLAP引擎框架,因为它的Cube构建引擎、预计算引擎、结果存储后端都可以切换。目前构建引擎支持 Hive,SparkSQL。预计算引擎支持 MR、Spark。存储后端支持 HBase、Druid等。

Druid,内部组件有点多,六七个好像有。每个小组件都有自己不同的职责,分工明确,能提升不少效率,但是也加大了集群管理的难度。加上 SQL 支持在最近的版本在比较好的支持,前面的版本都是用 Rest 来呼叫的…还有摄取数据的方式,如果是Hadoop上的数据,都需要自己写Json脚本,然后提交任务。摄取 hadoop 上的 parquet数据还没搞定。

使用 Kylin 和 Druid 比较难用的就是维度和度量的选择,可能会有一些坑要慢慢填。