1、什么是即席查询
即席查询(Ad Hoc)是用户根据自己的需求,灵活的选择查询条件,系统能够根据用户的选择生成相应的统计报表。
即席查询与通常查询从SQL语句上来说,并没有本质的差别。它们之间的差别在于:
- 通常的查询在系统设计和实施时是已知的,是定制开发的;所以我们可以在系统实施时通过建立索引、分区等技术来优化这些查询,使这些查询的效率很高。
- 而即席查询是用户在使用时临时生产的,是用户自定义查询条件的;系统无法预先优化这些查询,所以即席查询也是评估数据仓库的一个重要指标。即席查询的位置通常是在关系型的数据仓库中,即在EDW(enterprisedatawarehouse,企业级数据仓库)或者ROLAP中。
2、前置概念
  举个栗子: 下面的数据中,有 下单地区、下单品类、下单时间 3个维度,订单金额1个度量;可以从7个角度去分析结果 。 
3、OLAP分类

-
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(即多维数据集)。

4、Kylin
4.1 Kylin简介
Kylin定义 Apache Kylin是一个开源的分布式分析引擎,提供Hadoop/Spark之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由eBay Inc开发并贡献至开源社区。它能在亚秒内查询巨大的Hive表。服务于数仓。【基于多维数据集,需要预计算】
Kylin架构

- REST Server
REST Server是一套面向应用程序开发的入口点,旨在实现针对Kylin平台的应用开发工作。 此类应用程序可以提供查询、获取结果、触发cube构建任务、获取元数据以及获取用户权限等等。另外可以通过Restful接口实现SQL查询。【接受请求,返回数据相应】 - 查询引擎(Query Engine)
当cube准备就绪后,查询引擎就能够获取并解析用户查询。它随后会与系统中的其它组件进行交互,从而向用户返回对应的结果。 - 路由器(Routing)
在最初设计时曾考虑过将Kylin不能执行的查询引导去Hive中继续执行,但在实践后发现Hive与Kylin的速度差异过大,导致用户无法对查询的速度有一致的期望,很可能大多数查询几秒内就返回结果了,而有些查询则要等几分钟到几十分钟,因此体验非常糟糕。最后这个路由功能在发行版中默认关闭。 - 元数据管理工具(Metadata)
Kylin是一款元数据驱动型应用程序。元数据管理工具是一大关键性组件,用于对保存在Kylin当中的所有元数据进行管理,其中包括最为重要的cube元数据。其它全部组件的正常运作都需以元数据管理工具为基础。 Kylin的元数据存储在hbase中。 - 任务引擎(Cube Build Engine)
这套引擎的设计目的在于处理所有离线任务,其中包括shell脚本、Java API以及Map Reduce任务等等。任务引擎对Kylin当中的全部任务加以管理与协调,从而确保每一项任务都能得到切实执行并解决其间出现的故障。
Kylin特点
Kylin的主要特点包括支持SQL接口、支持超大规模数据集、亚秒级响应、可伸缩性、高吞吐率、BI工具集成等。
4.2 Kylin安装
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
登入web页面:http://hadoop102:7070/kylin 
4.3 Kylin的使用
1. 创建项目
1)点击下图中的"+"  2)填写项目名称和描述信息,并点击Submit按钮提交 
2. 获取数据源
1)选择项目(只有一个会自动选择),点击DataSource 
2)点击下图按钮导入Hive表 
3)选择所需数据表,并点击Sync按钮 
3. 创建model
为了指明事实表、维度表之间的关系
1)点击Models,点击"+New"按钮,点击"★New Model"按钮  2)填写Model信息,点击Next  3)指定事实表  4)选择维度表,并指定事实表和维度表的关联条件,点击Ok   5)指定维度字段,并点击Next

6)指定度量字段,并点击Next  7)指定事实表分区字段(仅支持时间分区),点击Save按钮,model创建完毕 
4. 构建cube
1)点击new, 并点击new cube  2)填写cube信息,选择cube所依赖的model,并点击next  3)选择所需的维度,如下图所示  4)选择所需度量值,如下图所示  4)cube自动合并设置,cube需按照日期分区字段每天进行构建,每次构建的结果会保存在Hbase中的一张表内,为提高查询效率,需将每日的cube进行合并,此处可设置合并周期。  5)Kylin高级配置(优化相关,暂时跳过),直接下一步 
6)Kylin相关属性配置覆盖 直接下一步【Cube级别】 
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。
解决:
- 创建一张物理表,将每天的数据OVERWRITE到表中,使用这张物理表创建Cube。
- 创建视图,获取每天的数据。这个方法优于方法一
11)点击insight,写入sql进行查询 注意:查询的内容必须是之前所统计的度量 
|