即席查询(Ad Hoc)是用户根据自己的需求,灵活的选择查询条件,系统能够根据用户的选择生成相应的统计报表。
即席查询与通常查询从SQL语句上来说,并没有本质的差别。它们之间的差别在于:
举个栗子:
下面的数据中,有 下单地区、下单品类、下单时间 3个维度,订单金额1个度量;可以从7个角度去分析结果 。
MOLAP
MOLAP的核心是多维数据库。在多维数据存贮方式中,OLAP的服务设施包含OLAP软件和多维数据库,数据在逻辑上按数组存贮,一般可选用超立方体或多立方体。
多维数据库和关系型数据库的主要不同是存储数据的方式,关系型数据库在一系列表格和列中存储数据。相反,多维数据库则在大量的多维数组中存储数据。多维数据库为终端用户提供一种可对数据进行灵活访问的信息结构,利用多维数据库可以对数据进行切片、切块、动态地观察汇总数据与细节数据的关系多维数据库中的数据是按应用中处理数据的方式来组织的,作为一种规则,应按概括或聚集形式存贮数据。这样多维数据库中信息粒度较大,因而索引较小,可以常驻内存,使查询效率大为提高。由于多维数据库以数据方式存贮,数组中值的修改可以不影响索引,这样能很好地适应读写应用。
用户可以通过客户端的应用软件界面向服务器提交分析请求,由OLAP服务器检索多维数据库,最后将结果返回给用户。由于得益于独特的多维数据库结构及很高程度的数据预处理能力,因此基于MOLAP技术可以迅速地响应决策分析人员的分析请求,并快速地将分析结果返回给用户。但对一些新需求还需要重建多维数据库,因此限制了MOLAP 结构的灵活性。由于对数据预处理程度高,因此需要极大的数据容量,而且数据的维护量也很大。另外由于数据需下载到特定的多维数据库中,因此安全性相对较差。
ROLAP
ROLAP是基于关系型数据库技术的OLAP技术。在使用这种技术时,关系型数据库将多维数据库中的多维结构划分为两类,一类是事先用存储事实的度量值及各个维的码值;另一类是维表,对每个维来说,至少有以个表用来保存该维的元数据,即维的描述信息,包括维的层次及成员类别等。事实表是通过每一个维的值和维表联系在一起的,这种结构有时被称为“星型模式”。如果用多个表来描述一个复杂维。这样在“星”的角上又出现了分支,这种变形的“星型模式”被称为“雪花模式”。基于关系型数据库的OLAP的优势是技术成熟,有现成的产品可以借鉴开发过程快,风险小。其缺点是速度不如基于多维数据库的OLAP快。
而其相对与MOLAP一个比较明显的优点是适应性较好,主要表现在:由于MOLAP的预综合程度很高,对多维模型的扩充会使数据立方体的规模迅速增长,而且还关系到采用何种数据聚集方式的问题。而ROLAP的预综合程度比较灵活,可以根据用户需要进行,增加一维意味着增加一些维表与用户相关的综合表,还有事实表中的相应内容;同时由于MOLAP的预综合度高,当数据频繁变化时,需要重新进行很多计算,而ROLAP的预综合度比较灵活可以较好的适应数据变化;再一点,ROLAP的基础关系型数据库已经发展了20多年,技术上比较成熟,在适应大数据量和不同运行环境的能力都比较好。
下面介绍一些和MOLAP相关的概念
将最原始的明细数据集进行聚合(不用考虑后续的需求),聚合结果放入多维数据集,这里每一个正方体都表示一个聚合结果;而这整个过程就是预计算,预计算引擎有MR、Spark(最新版Flink也支持)。
得益于预计算。需求查询时可以直接从多维数据集拿结果,大大减少计算量,提高效率;也有很明显的缺点,预计算计算量比较大、需要额外的存储空间。有点以空间换时间的感觉。
每一个角度所对应的数据集称为一个 Cuboid;所有的 Cuboid 一起组成一个 Cube(即多维数据集)。
Kylin定义
Apache Kylin是一个开源的分布式分析引擎,提供Hadoop/Spark之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由eBay Inc开发并贡献至开源社区。它能在亚秒内查询巨大的Hive表。服务于数仓。【基于多维数据集,需要预计算】
Kylin架构
Kylin特点
Kylin的主要特点包括支持SQL接口、支持超大规模数据集、亚秒级响应、可伸缩性、高吞吐率、BI工具集成等。
Kylin的依赖环境:部署好Hadoop、Hive、Zookeeper、HBase,并且需要在/etc/profile(或/etc/profile.d/xxx.sh)中配置以下环境变量HADOOP_HOME,HIVE_HOME,HBASE_HOME,记得source使其生效。
启动:hdfs、yarn、historyserver、hive、zookeep、hbse。
hadoop-3.1.3
hive-3.1.2
zookeeper-3.5.7
hbase-2.0.5
kylin-3.0.2
[ spark-3.0.0 这里采用spark作为hive的引擎,当然也可以使用其他引擎]
解压kylin
tar -zxvf /opt/software/kylin/apache-kylin-3.0.2-bin.tar.gz -C /opt/module/
改名
mv /opt/module/apache-kylin-3.0.2-bin /opt/module/kylin
可能存在的kylin兼容问题
spqrk3.0.0的jars中含有hive-metastore-2.3.7.jar,hive-3.1.2的lib中含hive-metastore-3.1.2.jar,二者的版本不同,有兼容性问题。而这里使用spark做计算引擎时,kylin就会加载到两个hive-metastore,出现问题。
若不使用spark,不会出现这个问题。
最根本方法:使用spark的源码,将里面有关hive的jar版本改为与hive一致,但这比较的麻烦。
简便方法:加载时将这个jar过滤即可。
进入kylin的bin目录下,修改文件 find-spark-dependency.sh,排除冲突的jar包。
需要增加的内容:! -name ‘jackson’ ! -name ‘metastore’
启动kylin
bin/kylin.sh start
1)点击下图中的"+"
2)填写项目名称和描述信息,并点击Submit按钮提交
1)选择项目(只有一个会自动选择),点击DataSource
为了指明事实表、维度表之间的关系
1)点击Models,点击"+New"按钮,点击"★New Model"按钮
2)填写Model信息,点击Next
3)指定事实表
4)选择维度表,并指定事实表和维度表的关联条件,点击Ok
5)指定维度字段,并点击Next
6)指定度量字段,并点击Next
7)指定事实表分区字段(仅支持时间分区),点击Save按钮,model创建完毕
1)点击new, 并点击new cube
2)填写cube信息,选择cube所依赖的model,并点击next
3)选择所需的维度,如下图所示
4)选择所需度量值,如下图所示
4)cube自动合并设置,cube需按照日期分区字段每天进行构建,每次构建的结果会保存在Hbase中的一张表内,为提高查询效率,需将每日的cube进行合并,此处可设置合并周期。
5)Kylin高级配置(优化相关,暂时跳过),直接下一步
7)Cube信息总览,点击Save,Cube创建完成
8)构建Cube(计算),点击对应Cube的action按钮,选择build
9)选择要构建的时间区间,点击Submit,任务就开始了
10)点击Monitor查看构建进度
注意:
若出现下列的报错,说明存在相同key的数据。
Caused by: java.lang.IllegalStateException:
The table: DWD_DIM_USER_INFO_HIS Dup key found
从前面的一路配置也可以发现,kylin支持事实表分区字段(仅支持时间分区),却不支持维度表分区;这导致一些 如 分区表会被join全表而不是一天的分区,从而出现相同key;拉链表join时无法进行条件过滤,也会出现相同的key。
解决: