一、kylin介绍

 

目录

离线OLAP需求

多维立方体(Cube)概念

Kylin中的数据模型

Kylin构建步骤

数据在Hbase存储格式

查询

优化

常见问题


离线OLAP需求

1. 即席查询:指用户在BI系统上通过拖拽现有的查询维度和度量的方式来完成一些临时的数据分析需求。这类需求属于交互式查询,对响应时间有较高的要求(20s)

 2. 固化查询:对一些固化下来的取数、看数的需求,通过数据产品的形式提供给用户,从而提高数据分析和运营的效率。级响这类需求的SQL有固定的模式,对响应时间有比较高的要求,需要毫秒级,亚秒响应

多维立方体(Cube)概念

结论:

1、每个cube的数据量会小于等于父cube的数据量。

2、每个cube的数据都可以从父cube上通过上卷操作获得。

3、OLAP引擎的数据预聚合过程:把一个包含多个维度的父Cube数据转化成一个

或多个常用的子Cube

4、 OLAP引擎的数据查询:分析查询sql选择合适的cube查询数据。

Kylin中的数据模型

Project:一个Project包含了多个Cube,相当于关系型数据库的数据库实例。

DataSource:数据源表的schema信息,包括事实表和维表,需要从hive中导入,

每个Project的DataSource的表都是相互独立的。

Model:代表一个星型模型,每个Model了包含了一张事实表多张维表

定义了各个维表与事实表的关联关系,并指定了维度和度量的列,

它是对构建时的源数据的格式的一个定义。

Cube:定义了聚合数据的维度组合,每个Cube包含一个Model,一个Model可以被多

个Cube使用,Cube的维度和度量只能从Model中选择。Cube还定义了rowkey的编码、

分片和顺序。这些信息与Cube的构建和查询性能有着密切关系。

Kylin构建步骤

数据在Hbase存储格式

查询

优化

数据膨胀原因:构建了不必要的子Cube

优化:

(1)根据业务需求减少子Cube数目

(2)避免高基维度参与太多组合

(3)优化Hbase-RowKey,提高查询效率

具体优化细节:https://blog.csdn.net/zxf126126/article/details/89711752

常见问题

1、如果cube构建不满足需求,需要重新建一个cube,之后要不要重跑cube?

修改了cube就必须,重新全量跑,可以clone一个cube,修改之后跑全量数据,等跑完了之后,把原来的cube disable掉,就可以使用新的查询了

2、怎么实现更新,增量构建?

restful api 增量构建cebe时,使用的是GMT时区,比我们的时区GMT+8 晚8小时,需要使用GMT时间戳提交,python脚本如下:

from datetime import timedelta, datetime
import time

dt = datetime.now()
endDate = datetime(dt.year, dt.month, dt.day)
startDate = endDate + timedelta(-1)
startSecond = str(int(time.mktime(startDate.timetuple()))*1000 + 8*60*60*1000)
endSecond = str(int(time.mktime(endDate.timetuple()))*1000 + 8*60*60*1000)


test_data = "{\"startTime\":"+startSecond+", \"endTime\":"+endSecond+", \"buildType\":\"BUILD\"}"
cubeName = None
if(2 == len(sys.argv)):
    cubeName = sys.argv[1]
if cubeName is None:
    cubeName = "FACT_T_NAME_C"
requrl = "/kylin/api/cubes/"+cubeName+"/build"
#XXX 为用户名:密码(ADMIN:KYLIN)的base64  
headerdata = {"Content-Type":"application/json","Authorization": "Basic XXXX"}


conn = httplib.HTTPConnection("10.168.192.35:7070")
print(str(test_data))
conn.request(method="PUT", url=requrl, body=test_data, headers=headerdata)

response = conn.getresponse()

res= response.read()

print(res)
exit(0)

3、怎查看cube的组合情况?

  • build 一个sgment,不需要全部跑完
  • 使用命令查看:./kylin.sh org.apache.kylin.engine.mr.common.CubeStatsReader cubeName
  • 特别注意shrink 值为90%以上的cubeId,有优化空间,每个cube节点的行数,不是指占事实表多少记录,而是存入hbase里的行数。

4、某一个查询选的cubeid是那个?

如果精确命中速度会很快,如果没有精确命中,就冲父cube查询,只不过比较慢

最重要的事情:检验是否有人看我的博客,检验是否有人看我的博客、检验是否有人看我的博客

猜你喜欢

转载自blog.csdn.net/zxf126126/article/details/89711475