Apache Kylin4 在有赞的应用
如果无法正常显示,请先停止浏览器的去广告插件。
1. 数智 · 同行
第三届大数据技术沙龙
2. Apache Kylin4 在有赞的应用
郑生俊
有赞 | 数据开发工程师
3.
4. Contents
01 有赞 OLAP 介绍
02 Kylin4 的大幅度性能提升
03 有赞 Kylin4 性能优化
04 参与开源社区
5. 01
有赞 OLAP 介绍
有赞 OLAP 的发展历程、遇到的挑战
6. • 技术栈简单
• 学习成本低
• 实时
• 查询灵活
预计算
+MySQL
缺点
• 灵活性差
• 开发效率低下
• 性能不足
早期
• 聚合度高
• RT 最低
• 支持精确去重
Druid
缺点
• 不支持精确去重
• 聚合度不够高
• 不支持明细 OLAP
• 故障 T+1 恢复
2018
Kylin
ClickHouse
• 实时 / 离线
• 查询非常灵活
now
7. 600w 存量商家
100 亿 + 构建数据
年 GMV 1073 亿
300+Cube
8. B 端场景 ( 稳定
性、 RT 要求严
格):
故障快速恢复
单店千万会会、数
十万商品
复杂查询性能
9. 部门 A
组织架构灵活变动
部门 B
客户、部门、员工
变动明细
好友、粉丝关系变动
部门 D
部门 C
部门 - 员工 - 客
户
拉链表
拉链表明细
员工 2
员工 1
微信、粉丝建联、失联
客户
客户
部门 A 员工 1
部门 C 员工 1
千万级别粉丝、会员支
持上卷、下钻
部门 B
员工 1
数仓宽表
KYLIN
树状结构打平
趋势、比例分析
10. 能不能支持精确去重?
能不能放宽查询时间范围到三年?
RT 控制在两秒以内, QPS 不低与 XXX !
1. 通过全局字典编码减小 BitMap
2. 改写查询,利用多个时间聚合维度进行预计算
天聚合数据
季度聚合表
月聚合表
天聚合表
11. 02
Kylin4 大幅度性能提升
Kylin4 在有赞 OLAP 场景下的性能提升
12. 1. 平均构建时间从 48min 降低到 10.5min
2. 构建时间降低 78%
优化点:
1. 去掉了维度字典的编码
2. 去掉了 HBase File 生成步骤
3. 全部转换为 Spark 进行构建
4. 基于 Cuboid 的构建划分提升构建并行
度
13. 单店数十万商品, 10X 精确去重指标的排序分析
27s -> 2s
Kylin2
Kylin4
并发取决于
Region 和 Shard 并发可以与数据无
关
无法针对单个查询
设置(不同数据量
的商家、并发相
同) 灵活设置单个查询
并发
充分利用 Spark 分
布式优势
14. 从 Calcite 的单点执行到基于 Spark 的完全分布式执
行
充分利用并行化、向量化、 code gen 等技术
自动调整 Spark 参数优化查询效率
基于 Parquet 的列存替换 HBase 的行存
Sort SortDF
Agg AggDF
Project ProjectDF
Filter
Cube
分布式
HBase & Coprocessor
FilterDF
CuboidDF
基于 Spark DF
完全分布式
15. 03
我们做的优化
Kylin4 在有赞 OLAP 场景下的性能提升
16. 动态消除 Cuboid 分区维度
Cube 有三个 Segment ,分区字段为 p: [20200101-2020201), [20200201-2020301), [20200301-2020307)
SQL: Select count(a) from test where p >= 20200101 and p <= 20200306 group by a
Aggregate
Aggregate
Scan 65rows 优化后 Scan 8rows
Filter
TableScan
Cuboid: (a, p)
Segments:
20200101~20200201
20200201~20200301
20200301~20200307
Union
Filter1
Filter2
TableScan TableScan
Cuboid: (a)
Segments:
20200101~20200201
20200201~20200301 Cuboid: (a, p)
Segments:
20200301~20200307
• 自动消除分区维度选择不同 cuboid ,
减少了数十倍的数据读取和计算量。
• 更加高效地支持跨月、跨年的查询
17. 在 Kylin4 中, SQL 首先经过了 Calcite 的解析、优
化、代码生成,然后再根据 Calcite 转换为 Spark
DataFrame 。在部分场景中, Calcite 的 SQL 解析
会消耗 150ms 左右。
解决方案:在 Kylin4 中支持
PreparedStatementCache 缓存 Calcite 执行计
划,降低该步骤的时间消耗。
SQL
Calcite
Spark DF
Spark Logical Plan
Spark Physical Plan
18. P0
Input RDD
背景:在一些流量分析的场景 或者 大宽表 的场景中,部分精确去
重的度量列存在大量空值,导致构建任务运行数小时无法完成
repartition
by
dictionary
column
Hive
P1 B2
P2 B3
RDD
通过优化后:构建时间从 5h 无法完成,缩短到 38min
P0
Input RDD
Hive
repartition
by
dictionary
column
B1
P1
编码
全局字典
编码
+ 倾斜字典
+ 倾斜字典
+ 倾斜字典
P2
RDD
分桶后
的字典
B1
B2
B3
编码 全局字典
分桶后
的字典
19. 04
参与开源社区
Kylin4 在有赞 OLAP 场景下的性能提升
20. 查询:
• 基于动态规划的实现的复杂条件下的分区裁剪和分区。避免查询进行全表扫
描;
• 基于动态规划的实现分区条件消除。在月跨度的查询下减少数十倍数据量
• 支持缓存 calcite 执行计划
构建:
•
在字典编码阶段检测并避免数据倾斜导致的构建问题使用 Spark 构建时缓存上
一层的数据,同时支持控制缓存的 Parent Dataset 数量
语法扩展 :
•
支持分页查询
……
21. 团
队
角
度
提高项目的开
发效率,降低
研发成本
提升线上服务
的稳定性
提升团队技术
影响力
避免重复的研发资
源投入
高效沟通、远程协
作、文档记录
更多的用通过线上
真实场景打磨产品
个
人
角
度
从业界大咖学习
方案讨论、 Code Review
规范编码、提高工程质量
文档规范
提升技术影响力
程序员缺少行业认证
更多的最佳实践和
技术方案 Apache Committer/PMC 业
界认可
开源项目更加强大
的生命力,更多的
从业经历者 JetBrains 全家桶
其他
apache 邮箱、个人网站
22. 1.
对项目有基本的了解
2. 对于复杂的项目,从某个模块出发
3. 订阅项目的开发者邮件组
4. 充分了解 Git 的各种功能
5. 从 Typo 做起,作为熟悉社区工作方式、
PR 流程、建联的途径
23. 解决问
题
了解当前
业务痛点
扩大应用
场景
业务的正
向反馈
深入原理
与代码
解决问题
获得更
多帮助
获得重
视
贡献社
区
加强融
入
24. 后续计划
1.
关注,适当参与 Native Engine :社区在计划 Rust/C++ 的引擎改写,
提升查询性能
2. OLAP 是一个千亿的市场,营销分析是一个万亿的市场:继续提升有赞
OLAP 性能
25. Any advice ?
1.
在真实的业务场景中才能解决问题
2. 技术只有解决实际问题才有价值
3. 在某个技术方向上持续投入
26.