分布式OLAP
1.简介¶
OLAP指的是对大规模数据进行分析的一种过程,其主要的workload为读。
通常OLAP和OLTP的数据库是相互独立的,因为对大批量数据读取的过程会影响数据库的性能。通常将数据从OLTP数据库提取到OLAP数据库的中间过程称为ETL(Extract,Transform,Load)。
通常存放用于OLAP的数据库称之为数据仓库,OLTP的数据库称之为数据孤岛。
2.Decision Support System¶
DSS指的是通过对现有的数据进行分析即OLAP,然后利用分析结果对现有的服务或者架构层面作出指导性的修改。类似于作负反馈调节。
3.分析模型¶
OLTP的数据库常常以树或者以哈希表的形式组织数据,虽然能让CURD的效率更高,但并不适用于数据分析。
数据分析模型常以star或者snowflake模型建模。
3.1.star¶
star模型维护两种类型的表,分别是fact table和dimension table。
思想是,利用fact table记录时间的基本信息,这些基本信息可以看成是各种分析中数据交集最高的部分;额外的信息用dimension table存储,并与fact table关联。
为了避免额外的JOIN开销,dimension table只能有一层,即一个dimension table不能和另一个dimension table关联,只能和fact table关联。
3.2.snowflake¶
snowflake与star模型类似,区别在于snowflake的dimension table允许有多层。
star和snowflake的区别首先在于额外的JOIN开销;其次是开发人员需要在处理数据时,保证多层dimension table数据的一致性。如利用一个外键找到一张表,该表的数据和自己的数据需要保证一致;最后是snowflake的多层dimension table增加了查询的复杂度。
4.执行计划¶
最常见方式是中心节点生成一个大的SQL语句,对于每个负责不同数据的节点,根据其负责的数据拆分成查询片段,从而进行执行。
另一种方式是对于每个节点不同的状况,将SQL语句重写成对应该节点状况的最优SQL语句。
5.分布式JOIN¶
最简单的情况是两个表都是根据JOIN的字段进行分片的,那么每一个节点都会包含所需的数据,无需从其他节点获取,那么直接在单节点内进行单机JOIN即可。
若有一个表不是根据JOIN的字段进行分片的,那么就需要从其他节点处获取数据。此时,每个节点会进行广播,收集对应的tuple,即通过网络从其他节点获取需要的tuple副本,从而进行JOIN。如果拥有数据倾斜,则可能会做的优化是含有较多数据的节点会将一部分数据给出到含有较少数据的节点。
最差的情况是两个表都不是基于JOIN的属性分片的,每个节点都拥有着离散的数据,那么就需要进行shuffle join。即DBMS会在上层对数据进行逻辑分片,然后告知每一个节点应该得到哪些数据,然后这些节点会根据逻辑分片的结果传输或获取数据,最后进行本地JOIN。
6.云数据库¶
一个重要概念是DBaaS,即database-as-a-service,将数据库作为一个服务出售。
云服务提供商会提供一个数据库实例,以及ip和端口,通过远程连接使用数据库。此时数据库的使用就像在本地使用一样,但提供服务的厂商应该额外提供如快照或者数据恢复等服务。
DBaaS又有两种形式:
- Managed DBMS:即基于已有的数据库,提供类似容器的产品,只是额外提供如快照或恢复等服务。
-
Cloud-Native DBMS:对已有数据库进行重新研发,使其与云产品进行配合。如Shared-Disk架构中,利用抽象层进行转接,采用HDFS作为传统意义的磁盘。
-
Serverless Databases:表示只收取计算或运行时的费用,以及存储费用,而不收取空闲时的实例费用。做法是如果系统检测到该数据库已经处于一段时间的闲置,就将其Buffer Pool进行快照,方便下一次使用时的预热。好处是多个客户可以共用数据库实例,减少了成本开销。