什么是 OLAP
OLAP(OnLine Analytical Processing),即联机分析处理。OLAP 对业务数据执行多维分析,并提供复杂计算,趋势分析和复杂数据建模的能力。它主要用于支持企业决策管理分析,是许多商务智能(BI)应用程序背后的技术。 OLAP 使最终用户可以对多个维度的数据进行即席分析,从而获取他们所需知识,以便更好地制定决策。OLAP 技术已被定义为实现“快速访问共享的多维信息”的能力。
传统的关系型数据库采用的是 OLTP,主要数据操作是随机读写,主要采用 3NF 的实体关系模型存储数据,从而在事务处理中解决数据的冗余和一致性问题。用 E-R 模型的一个原则就是,尽量把一个表拆分,拆分的越细越好,拆分后尽量满足 3NF 范式的原则,减少冗余。
相反,OLAP 系统的主要数据操作是批量读写,事务处理中的一致性不是 OLAP 所关注的,其主要关注数据的整合,以及在一次性的复杂大数据查询和处理的性能,因此它需要采用不同的建模方法,例如维度建模。OLAP 是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。
所以,OLAP 的核心概念有:
- 维度(Dimension):维度是描述与业务主题相关的一组属性,单个属性或属性集合可以构成一个维。如时间、地理位置、年龄和性别等都是维度。
- 维的层次(Level of Dimension):一个维往往可以具有多个层次,例如时间维度分为年、季度、月和日等层次,地区维可以是国家、地区、省、市等层次。这里的层次表示数据细化程度,对应概念分层。
- 维的成员(Member of Dimension):若维是多层次的,则不同的层次的取值构成一个维成员。部分维层次同样可以构成维成员,例如“某年某季度”、“某季某月”等都可以是时间维的成员。
- 度量(Measure):表示事实在某一个维成员上的取值。例如开发部门汉族男性有 39 人,就表示在部门、民族、性别三个维度上,企业人数的事实度量。
OLAP 的分类
MOLAP
MOLAP 是 OLAP的经典形式。MOLAP 将数据存储在优化的多维数组中,而不是关系数据库中。维的属性值被映射成多维数组的下标值或下标的范围,而度量数据作为多维数组的值存储在数组的单元中。由于 MOLAP 采用了新的存储结构,从物理层实现,因此又称为物理 OLAP(PhysicalOLAP);而 ROLAP 主要通过一些软件工具或中间软件实现,物理层仍采用关系数据库的存储结构,因此称为 虚拟OLAP(VirtualOLAP)。
ROLAP
ROLAP 将分析用的多维数据存储在关系数据库中。这种方式依赖 SQL 语言实现传统 OLAP 的切片和切块功能,本质上,切片和切块等动作都等同于在 SQL 语句中添加
WHERE
子句。ROLAP 工具不使用预先计算的多维数据集,而是对标准关系数据库及其表进行查询,以获取回答问题所需的数据。ROLAP 工具具有询问任何问题的能力,因为该方法(SQL)不仅限于多维数据集的内容。
开源组件
开源大数据 OLAP 组件,可以分为 MOLAP 和 ROLAP 两类。ROLAP 中又可细分为 MPP 数据库和 SQL 引擎两类。对于 SQL 引擎又可以再细分为基于 MPP 架构的 SQL 引擎和基于通用计算框架的 SQL 引擎:
开源 MOLAP 系统分析
Kylin
Apache Kylin 是一个开源的分布式分析引擎,提供 Hadoop/Spark 之上的 SQL 查询接口及多维分析(OLAP)能力以支持超大规模数据,它能在亚秒内查询巨大的 Hive 表。不管是 Hive 还是 Spark SQL,经过计算生成报表的时间都在分钟级以上。
Kylin 的核心思想是预计算,理论基础是:以空间换时间。即将多维分析可能用到的度量进行预计算,将计算好的结果保存成 Cube 并存储到 HBase 中,而后用户能够经过 JDBC Driver 以 SQL 的方式对数据进行直接访问、快速查询。把高复杂度的聚合运算,多表连接等操作转换成对预计算结果的查询。
优点:
- 亚秒级查询响应交互,在同样的数据集上提供比 Hive 更好的性能
- 支持百亿、千亿甚至万亿级别交互式分析
- 提供与多种数据可视化 BI 工具的整合能力,如 Tableau,PowerBI、Excel 等
- 可以在数据产生时进行实时处理
- 提供标准 SQL 支持大部分查询功能
缺点:
- 由于 Kylin 是一个分析引擎,只读,不支持
insert
,update
,delete
等 SQL 操作,用户修改数据的话需要重新批量导入(构建) - 需要预先建立模型后加载数据到 Cube 后才可进行查询
- 使用 Kylin 的建模人员需要了解一定的数据仓库知识
Druid
Apache Druid 是高性能的实时分析数据库,实时 OLAP 系统。主要提供对大量的基于时序的数据进行 OLAP 查询能力。支持毫秒级的快速的交互式查询。
Druid 通过位图索引,预计算最细粒度的聚合 + 实时聚合这种方式来牺牲一点点 RT,来改善维度爆炸的问题。
优点:
- 为分析而设计:为 OLAP 工作流的探索性分析而构建。它支持各种 filter、aggregator 和查询类型。
- 交互式查询:低延迟数据摄取架构允许事件在它们创建后毫秒内查询。
- 高可用:你的数据在系统更新时依然可用、可查询。规模的扩大和缩小不会造成数据丢失。
- 可伸缩:每天处理数十亿事件和 TB 级数据。
缺点:
- 不支持
join
,导致用户需要导入大宽表 - 不支持更新操作,数据不可更改
- 无法查询明细,无法做到精确查询
- 不支持事实表之间的关联
开源 MPP 数据库分析
Greenplum
时间回到 2002 年,那时整个互联网数据量正处于快速增长期,一方面传统数据库难以满足当前的计算需求,另一方面传统数据库大多基于 SMP 架构,这种架构最大的一个特点是共享所有资源,扩展性能差,因此面对日益增长的数据量,难以继续支撑,需要一种具有分布式并行数据计算能力的数据库,Greenplum 正是在此背景下诞生了。 和传统数据库的 SMP 架构不同,Greenplum 主要基于 MPP 架构,这是由多个服务器通过节点互联网络连接而成的系统,每个节点只访问自己的本地资源(包括内存、存储等),是一种完全无共享(Share Nothing)结构,扩展能力较之前有明显提升。
ClickHouse
ClickHouse 是一款由俄罗斯 Yandex 公司开发的 C++ 开源高性能 OLAP 组件。在 Yandex 内部, ClickHouse 主要用于在线流量分析产品 Yandex Metrica,类似于 Google Analytics 或者百度统计。
特点:
- SQL 支持: 支持大部分 SQL 功能。 列式存储,数据压缩: 列式存储能够更加有利于 OLAP 聚合查询,同时也能大大提高数据压缩率。
- 多核(垂直扩展),分布式处理(水平扩展): 使用多线程和多分片并行处理。
- 实时数据摄入: 数据可以实时批量摄入立即被查询。
- 向量化引擎 / 代码编译生成: 传统火山模型的虚函数,分支预测等开销大大降低了整个算子流水线的执行,尤其对于 OLAP 这种聚合计算,CPU 密集的场景下。向量化引擎通过将算子处理从当个 tuple 变成向量的方式分摊了这部分的开销,也更容易使用 SMID 去加速 CPU 计算,尽可能地将计算保持在 CPU Cache 内。而代码编译生成通过改成以数据为中心的方式消除这部分的开销,尽可能地将计算保持在 CPU 寄存器中。当然这两项技术也不是万能的,由于有些情况,比如 Aggregation 或者 Join 时过多的数据,不可避免地只能通过物化到内存中,导致瓶颈产生,无法有效地提高性能。两者在有些场景甚至是可以混合使用的,一些前沿论文中还有使用软件预取的方式去尽可能地优化。
- 主键索引,二级索引: ClickHouse 主要采用了稀疏索引的方式做主键索引,minmax,set,ngrambf/tokenbf 等 Bloom Filter 去做二级索引。
缺点:
- 没有高速,低延迟的更新和删除方法。
- 稀疏索引使得点查性能不佳。
- 不支持事务。
ClickHouse 要比类似的产品 Presto、Impala 快很多。其应用场景有:
- 用户行为分析,精细化运营分析: 日活,留存率分析,路径分析,有序漏斗转化率分 析,Session 分析等。
- 实时日志分析,监控分析。
- 实时数仓。
基于 MPP 架构的 SQL 引擎分析
Presto
Presto 是由 Facebook 开发的开源大数据分布式高性能 SQL 查询引擎。起初,Facebook 使用 Hive 来进行交互式查询分析,但 Hive 是基于 MapReduce 为批处理而设计的,延时很高,满足不了用户对于交互式查询想要快速出结果的场景。为了解决 Hive 并不擅长的交互式查询领域,Facebook 开发了 Presto,专门为交互式查询所设计,提供分钟级乃至亚秒级低延时的查询性能。
Impala
Impala 是 Cloudera 在受到 Google 的 Dremel 启发下开发的实时交互 SQL 大数据查询工具,Impala 没有再使用缓慢的 Hive + MapReduce 批处理,而是通过使用与商用并行关系数据库中类似的分布式查询引擎(由 Query Planner、Query Coordinator 和 Query Exec Engine 三部分组成),可以直接从 HDFS 或 HBase 中用 SELECT、JOIN 和统计函数查询数据,从而大大降低了延迟。
Impala 架构类似分布式数据库 Greenplum 数据库,一个大的查询通过分析为一个个子查询,分布到底层的执行,最后再合并结果,通过多线程并发来暴力 SCAN 来实现高速。
架构是完美的,现实是骨感的,实际使用过程中,Impala 性能和稳定性还差得远。尤其是 Impala 虽然号称支持 HDFS 和 HBase,但实际使用中发现,运行在 HDFS 上,性能还差强人意,运行在 HBase 上性能很差,另外还经常有内存溢出之类的问题尚待解决。
基于通用计算框架的 SQL 引擎分析
SparkSQL
Spark SQL 是在 Spark 的基础之上构建的,于 2014 年 5 月发布。从名称上可以看出,该模块是 Spark 提供的关系型操作 API,实现了SQL-on-Spark的功能。对于一些熟悉 SQL 的用户,可以直接使用 SQL 在 Spark 上进行复杂的数据处理。
Spark SQL 是 Spark 的其中一个模块,用于结构化数据处理。与基本的 Spark RDD API 不同,Spark SQL 提供的接口为 Spark 提供了有关数据结构和正在执行的计算的更多信息,Spark SQL 会使用这些额外的信息来执行额外的优化。使用 SparkSQL 的方式有很多种,包括 SQL、DataFrame API 以及 Dataset API。值得注意的是,无论使用何种方式何种语言,其执行引擎都是相同的。实现这种统一,意味着开发人员可以轻松地在不同的 API 之间来回切换,从而使数据处理更加地灵活。
Hive
Hive 由 Facebook 实现并开源,是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据映射为一张数据库表,并提供 HQL(Hive SQL) 查询功能,底层数据是存储在 HDFS 上。Hive 的本质是将 SQL 语句转换为 MapReduce 任务运行,使不熟悉 MapReduce 的用户很方便地利用 HQL 处理和计算 HDFS 上的结构化的数据,适用于离线的批量数据计算。Hive 依赖于 HDFS 存储数据,将 HQL 转换成 MapReduce 执行,所以说 Hive 是基于 Hadoop 的一个数据仓库工具,实质就是一款基于 HDFS 的 MapReduce计算框架,对存储在 HDFS 中的数据进行分析和管理。
优点:
- 可扩展性,横向扩展
- 支持自定义函数,可以根据自己的需求来实现自定义函数
- 良好的容错性,即使节点出现问题,SQL 语句仍可执行
缺点:
- 不支持记录级别的增删改操作,但是用户可以通过查询生成新表或者将查询的结果导入到文件中
- 查询延时非常严重,因为 MapReduce Job 的启动过程消耗时间很长,所以不能用于交互查询系统中
- 不支持事务,所以主要用于 OLAP 而不能用于 OLTP