ApacheKylin(麒麟)是由eBay开源的分布式分析引擎,提供Hadoop之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据。底层存储用的是HBase,数据输入与cube building用的是Hive,中间数据存储用的是HDFS。
1.安装kylin
1.1环境要求:
l Hadoop:2.4+
l Hive:0.13+
l HBase:0.98+, 1.x
l JDK:1.7+
1.2安装方法:
下载并解压
$ wgethttp://mirrors.hust.edu.cn/apache/kylin/apache-kylin-2.2.0/ apache-kylin-2.2.0-bin-hbase1x.tar.gz
$tar –zxvf apache-kylin-2.2.0-bin-hbase1x.tar.gz
配置KYLIN_HOME
检查启动条件:bin/check-env.sh
启动kylin:bin/kylin.sh start
1.3补充配置:
1.配置kylin.properties
1. # Kylin server mode, valid value [all, query,job]
2. kyin.server.mode=all
2.新建/tmp/kylin文件夹,拷贝jar包
2.web端操作
2.1.打开web界面
Hostto access: http://hostname:7070/kylin
Loginwith username/password: ADMIN/KYLIN
2.2样例数据测试
启动kylin后,运行bin/sample.sh
查看sample.sh脚本内容
实际上操作的是sample_cube目录下的数据和脚本
重启kylin服务(或在web端System->ReloadMetadata)
看看hive和hbase,kylin系统创建之初,hive和hbase中是空的,但是随着示例的导入,hbase中创建了元数据表kylin_metadata,hive中创建了kylin_sales等源表;当cube被build过程中,hive中会创建model的临时表,build成功后临时表被drop掉,而hbase中会创建目标表(类似KYLIN_A1WV1SDTB5表)。
默认有一个Cube定义,需要Build。
Monitor中监视整个构建过程
Cube构建成功后状态会变成Ready状态
构建Cube过程根据集群性能的不同而不同
2.3新建Project以及同步hive中的表
2.4创建model和cube
Model:数据模型,根据project中的表依赖一定的管理关系和过滤条件,生成一个代表业务含义的数据模型。
Cube:数据块,将model做切块处理,生成数据块,方便BI查询展示。
新建model时根据提示一步步的设置主表(事实表)和关联表,配置管理条件,维度信息,指标信息,过滤条件等,最后形成一个新的数据模型。
新建的model会在hive中创建一张实体表,后续的cube依据该表创建。
1)新建model
1.Model Info,填写Model Name等信息
2.Data Model,选取事实表,并且配置事实表与维度表的管理关系
3.Dimensions,选取维度列信息
4.Measures,选择指标列信息
5.Settings,相关设置。partition date colume表示分区字段,选择新建的hive表中按时间分区的字段。然后从date format中选择不同的时间格式。最下面的filter可以添加where条件对数据源中的数据做过滤。至此,model创建完成。
2)新建cube
1.Cube Info。设置Cube名、描述信息等,设置Cube依赖的表模型(星状模型,一个事实表和可选的多个维度表)选择之前创建好的model,并填入cube name。notificationemail list是选填项,表示报警接收人邮件地址,多个邮件地址以逗号隔开。
2.Dimensions。设置维度(维度有几种类型这里不再讨论,创建完之后就可以暂时性的忽略这几种不同的类型,都把它当做普通的维度就可以了)选择dimession,有两种方式:一是手动添加dimession,二是使用自动生成,我们这里使用自动生成,然后勾选需要的字段。
3.Measures 。设置度量(每一个度量包括列和聚合函数,列只能是事实表上的列)选择指标,count(1)是系统默认自带的,不要删除。点击+号添加需要的指标,需要填入名称,选择表达式。这里选择的是sum。我们要针对disp加和求pv,在param value里面选择disp列。需要注意的是kylin中hive表中每一列字段的类型要求比较严格。dimession字段需要为String,用来加和的指标字段须为bigint或者decimal
4.Refresh Setting。设置增量更新的信息(设置增量列和起始时间,该列必须是时间格式列)设置merge时间。Kylin每次build会生成一张hbase表,merge操作会把多天数据合并成一张新的hbase表。可加快查询。设置partition Start Date,即数据源开始时间,默认为1970-01-01.点击Next。
5.Advanced Setting。高级设置(设置维度组、RowKey等)
1、设置维度组(Aggregation Groups)
cube是所有的dimensions组合,任一dimensions的组合称为cuboid。维度组的设置主要是为了让不出现在一个查询中的两个维度不计算cuboid(通过划分到两个不同的维度组中),这其实相当于把一个cube的树结构划分成多个不同的树,可以在不降低查询性能的情况下减少cuboid的计算量。
Ø MandatoryDimensions:每次查询均会使用的维度可添加在此。比如某些情况下的partition column.
Ø HierarchyDimensions:维度列中彼此间存在层级关系的列,比如“国家-省份-市-县”
Ø JointDimensions:每次查询会同时使用或不使用的维度组合。
Ø AggregationGroup:在不同的查询中,两组维度组合之间不会产生交叉,可选择此选项,比如所有的cube维度有 [ a,b,c,d,e,f ] 6个,每次查询中只会同时查与 [ a,b,c ] 相关的信息(比如[a],[a,c]等)而不会查询 [ d,e,f ],或者相反,则可选择此选项。
以上选择均可减少build过程中的数据量,是加快build与query速度的优化点之一。
2、设置Rowkey
在进入到设置RowKey的时候会看到每一个维度的设置(Derived维度看到的是外键列而不是Derived的列),每一个维度可以设置ID(通过拖拽可以改变每一个维度的ID)、Mandatory、Dictionary和Length。
首先看一下Mandatory维度,需要设置为Mandatory的维度是哪些在大多数SQL中都会出现的维度,例如time这个维度,如果每次查询都需要带上它进行过滤或者group by,那么就可以把它设置为mandatory。
其次,ID决定了这个维度在数组中执行查找时该维度对应的第一个维度,例如在上例中time的ID就是1,location对应的ID就是2,product对应的ID为3,这个顺序是非常重要的,一般情况我们会将mandatory维度放置在rowkey的最前面,而其它的维度需要将经常出现在过滤条件中的维度放置在靠前的位置,假设在上例的三维数组中,我们经常使用time进行过滤,但是我把time的ID设置为3(location的ID=1,product的ID=2),这时候如果从数组中查找time大于’2016-01-01’并且小于’2016-01-31’,这样的查询就需要从这样的最小的key=<min(location)、min(product)、‘2016-01-01’>扫描到最大的key=<max(location)、max(product)、‘2016-01-31’>,但是如果把time的ID设置为1,扫描的区间就会变成key=<‘2016-01-01’、min(location)、min(product)>到key=<‘2016-01-31’、max(location)、max(product)>,Kylin在实现时需要将Cube的数组存储在Hbase中,然后按照hbase中的rowkey进行扫描,假设min(location)=’BeiJing’、max(location)=’ZhengZhou’,min(product)=’aaaa’,max(product)=’zzzz’,这样在第一种情况下hbase中需要扫描的rowkey范围是[BeiJing-aaaa-2016-01-01,ZhengZhou-zzzz-2016-01-31],而第二种情况需要扫描的rowkey范围是[2016-01-01-BeiJing-aaaa, 2016-01-31-ZhengZhou-zzzz].可以看出第二种情况可以减少扫面的rowkey,查询的性能也就更好了。但是在kylin中并不会存储原始的成员值(例如HangZhou、2016-01-01这样的值),而是需要对它们进行编码,是否需要编码则有后面两个设置项决定。
维度字典
Dictionary可以设置为true和false,设置为true表示需要为这个维度建立字典树,如果设置为false则表示不需要设置,而需要设置Length,而Length则意味着在实际存储到hbase的rowkey时使用该维度的前Length个字符作为它的值(剪切每一个成员值只保留前Length个字符),一般情况下是不建议设置Length的,而是设置Dcitionary为true,只有当cardinality比较大时并且只需要取前N个字节就可以表示这个维度时才建议设置Length=N,因为每一个维度的dictionary都会保存在内存中,如果字典树占用很大的内存会影响kylin的使用甚至导致OOM,对于dictionary的编码使用的是字典树,它的原理实际上是为每一个维度成员赋予一个整数的id,实际存储的时候存储的是这个id的二进制值(使用int最多占用4个字节),并且保证每一个id的顺序和维度成员的顺序相同的,例如aaa的id=1,aab的id=2,aac的id=3,这样在查询的时候就可以直接根据column>aaa转换成id>1,方便hbase coprocessor的处理。
3、设置Cube Size
最后设置CubeSize,该项的设置会对cuboid转换成hfile这一步的计算产生影响,并且影响hbase中表的分区大小,可选值为SMALL、MEDIUM和LARGE,在kylin-1.1版本之后可以在配置文件可以设置这三个配置的分区大小,默认情况下SMALL=10GB,MEDIUM=20GB,LARGE=100GB,在计算完全部的cuboid之后会统计所有cuboid文件中key和value的大小,然后根据这个大小和用户的CubeSize配置决定划分多少region,然后执行一个MR任务计算每一个region的hfile,由于kylin在创建hfile的时候都是通过预分区的方式(通过计算出每一个分区临界值的key),然后批量load到htable的,所以不会导致region的分裂和合并,所以我们还是建议将CubeSize设置为SMALL,并且配置中将small的配置设置为5GB,这样可以提高生成hfile这一步的速度(每一个region负责一个region,减小分区的大小会增加reducer的个数)。
6.Configuration Overwrites,根据需要可以设置一些属性。
7.Overview,信息概览。
3 )cube其他操作
最常用的就是build操作,它会根据我们创建的cube进行数据的预计算。
其他操作说明:
Drop:丢弃现有cube,条件:无Pending, Running, Error 状态的job.
Edit:编辑现有cube,条件:cube需处于disable状态。
Refresh:重建某已有时间段数据,针对于已build时间段的源数据发生了改变的情况。
Merge:手动触发merge操作。
Enable:使拥有至少一个有效segment的cube从disable变为enable状态。
Purge:清空所有该cube的数据。
Clone:克隆一个新的cube,可设置新的名字,其他相关配置与原cube相同。
Disable:使一个处于ready状态的cube变为Disable状态,查询不会从disable的cube中获取数据。
2.5查询SQL
Insight页面支持SQL查询kylin中的数据。目前仅支持select查询,SQL在cube中无法找到的数据将不会重定向到Hive。
Kylin基于MOLAP实现,查询的时候利用Calcite框架,从存储在Hbase的segment表(每一个segment对应着一个htable)获取数据,其实理论上就相当于使用Calcite支持SQL解析,数据从Hbase中读取,中间Kylin主要完成如何确定从Hbase中的哪些表读数据,如何读取数据,以及解析数据的格式。
查询结果可以用多种可视化方式展示