Kylin
Kylin
Kylin基础概念
即席查询工具,多为分析工具,OLAP(在线分析处理)
Cube:多个维度组合进行随机数据聚合的其中一个组合。
REST Server:是一套面向应用程序的开发接口,提供了包括查询、触发cube、获取元数据等
查询引擎:获取并解析用户的查询,将结果返回,spark作为查询引擎。
路由层:将SQL转换为cube,在已有的cube上查询步出来,就转换为直接读取源文件
元数据管理:存储cube的元数据,存储在mysql。
构建引擎:从MR作为cube构建,替换为Spark(由原来的逐层构建变成元数据/构建cube),parquet替换hbase。
单节点能支撑70/s查询。
Kylin流程
1.先创建项目。然后进行数据源的同步。
2.构建模型(new model),选择对应的事实表、lookup表(维度表) 链接条件
3.选择对应的维度:(后面再构建cube的时候可以选择这些字段) 选择对应的指标。
4.选择分区字段格式(事实表)、维表里面的脏数据进行过滤
5.构建cube(new cube) ,选择维度字段(结果就包含这些字段了),维表里面的需要改成normal维度
6.选择度量值,(Refresh Setting)底层sgement合并文件
7.最终的结果查询:还是查询以前的表名,只不过会返回很快。
连接方式和字段、指标等 都不能超过设置的model,查询没有的字段会报错。
事实表在前,维度表在后,否则会报错(inner join也是一样的) 只能count(*) 或者建的指标
定时构建
python -c "import base64;print base64.standard_b64encode('ADMIN','KYLIN')" 获取密钥
endTime:过滤分区时间
curl -X PUT -H "Authorization: Basic MMMMMM" -H 'Content-Type: application/json' -d '{"endTime":'$endTime', "buildType":"BUILD"}' http://ip:7070/kylin/api/cubes/my_clone/rebuild
Kylin优化理论
Sparder:后台一直运行的spark进程,负责接收查询任务
kylin.query.spark-conf 开头的参数作为运行参数
衍生维度:使用的时候,加快cube构建的速度,减慢查询得速度。
聚合组:是一种剪枝工具。
强制维度(Mandatory Dimensions):必须包含这个维度,自己不能单独出现。
层级维度(Hierarchy Dimensions):年月日,省市区,低层级不能单独出现。
联合维度(Joint Dimensions):要么一起出现,要么不出现。
#
Cube构建;设置构建参数
spark.executor.memory:
文件>100G and 精确去重 = 20G
文件>100G or (文件>10G and 精确去重)= 16G
文件>10G or (文件>1G and 精确去重)= 10G
文件>1G or 精确去重 = 4G other 1G
spark.executor.cores:
文件>1G or 精确去重 =5 other 1
spark.executor.memoryOverhead:
文件>100G and 精确去重 = 6G
文件>100G or (文件>10G and 精确去重)= 4G
文件>10G or (文件>1G and 精确去重)= 2G
文件>1G or 精确去重 = 1G other 512M
spark.executor.instances:
1.kylin.engine.base.executor.instances=5
2.cubeid个数计算:0-100:1 100-500:2 500-1000:3 1000+:4 结果*1的值
3.yarn资源可获取的 和上面值取最小值
spark.sql.shuffle.partitions = max(2,最大文件大小/32M)
全局字典:精确去重:字段映射 + bitmap 减少下面的值,加快构建速度
kylin.dictionary.globalV2-threshold-bucket-size=500000
使用全局字典指标:(dount distinct) Return Type:(Precisely (More Memory And Storage Needed))
需要yarn资源配置:设置单个yarn资源的最大核数
<property><name>yarn.scheduler.maximum-allocation-vcores</name><value>8</value></property>
查看全局字典:hdfs 上有一个dict/global_dict/EMP/ 目录 每次构建都生成新的
Rowkeys:顺序设置很重要,过滤维度放在前面,基数维度小的放前面
Shard By:表示最终生成文件partationBy 减少扫描文件
减少小文件:
kylin.storage.columnar.shard-size-mb=128M ShardBy文件最大大小
kylin.storage.columnar.shard-rowcount=2500000 ShardBy文件最大行数
kylin.storage.columnar.shard-countdistinct-rowcount=1000000 精确去重cube的bitmap大小
kylin.storage.columnar.repartition-threshold-size-mb=128M 每个parquet文件的最大大小
调整上面大小,合并小文件
spark.sql.files.maxPartitionBytes=128M 合并小文件进行读取
3.X Cube构建算法
逐层构建:构建4个维度->构建3个维度->构建2个维度->构建1个维度 HDFS 效率比较低,速度慢
快速构建:整个任务使用一个MAP/REDUCE 进行聚合 其实就是Combiner
搬砖多年终不得要领,遂载源码看之望得真经。