Trino引擎在小米的应用实践
如果无法正常显示,请先停止浏览器的去广告插件。
1. Trino引擎在小米的应用实践
周渝豪-小米-大数据软件工程师
DataFunSummit # 2023
2. 目录
CONTENT
架构定位 应用场景
介绍小米的OLAP整体架构,以及
Trino的定位和发展 简单说明Trino在小米的维护使用方式
和几个实际的应用场景
主要工作 未来规划
包括小米对Trino的内部适配,功能完
善和核心能力建设 目前Trino正在进行的工作和进展,以
及未来的方向
3. 01
架构定位
DataFunSummit # 2023
4. Trino历史
5. Trino架构
Hive
Iceberg
Kudu
MySQL
…
HDFS
Trino
CLI
Metadata
Trino
Worker
OSS
Trino
JDBC
Trino
HTTP
Trino
Coordinator
Trino
Worker
Trino
Worker
MySQL
…
6. Trino优缺点
架构清晰
内存要求高
Master-Slave架构
存算分离
无依赖系统独立
速度快
全内存运算
失败容忍低
Pipeline模式
动态代码生成
扩展性强
可拔插Connector
数
单个节点一般32G以上
基于内存模式设计
并发能力不足
跨源联邦查询
方便自定义函
单主节点加上内存限制
7. 小米的OLAP架构
HTTP
JDBC/Thrift
Web UI
OLAP接入方式
统一认证、授权
和元数据服务
Authorization
Service
权限验证
SQL Parser
Kyuubi Server
SQL代理层
引擎发现
Engine
Manager
Metastore
Service
元信息获取
Kyuubi
Engine
Trino
Doris
Kylin
SQL引擎层
8. 小米的Trino定位
用户
擅长Hive、Spark
和MySQL
Kyuubi Proxy
对接Spark语法
解析
Metacat
对统一管理元数据
Kyuubi Engine
执行Spark SQL
任务,读写
Trino
兼容Spark SQL
语法,只读
统一使用Spark SQL语法
Trino只用于查询操作
Kyuubi负责接入和权限控制
Metacat统一元数据管理
9. 小米Trino目标
让大数据更快到达用户眼前。
大数据
不仅是数据量大,还有
种类来源丰富:
• Hive数仓
• Kudu存储引擎
• Iceberg数据湖
• 关系型数据库
更快
眼前
更快的接入新数据源,更快
的分析处理速度。 在小米Trino主要被用来
内部场景测试相比Spark 提升用户可见部分的性
SQL,Trino能够提供5-10 能提升,比如数据预览,
倍的性能提升。 即席查询,统计报表等
等。
10. 小米Trino发展
基于352版本
内部特性适配
升级386版本
应用场景优化
升级421版本
核心能力提升
紧跟社区的步伐,每年进行一次大版本升级
11. 02
主要工作
DataFunSummit # 2023
12. 主要工作
01 02 03
核心能力 扩展能力 运维能力
兼容Spark SQL 动态Catalog加载 审计日志和历史服务
优化Iceberg使用 动态UDF加载 集成测试和自动发布
13. 核心能力
兼容Spark SQL
Tips: 小米统一使用Spark SQL作为标准OLAP查询语言
Spark SQL
SELECT ‘1’ `id`, “Bob’s Son” `name`
FROM test
WHERE array(1,2,3)[0] = 1;
字面量和标识符的引用方式不同
Spark: 单双引号字面量,反引号标识符
Trino: 单引号字面量,双引号标识符
语法不同,比如Array
Trino SQL Spark: Array()
SELECT ‘1’ “id”, ‘Bob’’s Son’ “name”
FROM test
WHERE array[1,2,3][1] = 1; Trino: Array[]
语义不同,比如Array
Spark: 下标从0开始
Spark和Trino的SQL语法和语义都存在不同
Trino: 下标从1开始
14. 核心能力
兼容Spark SQL
SparkSqlRewriter
Spark
SQL
Parser
Spark
SQL
Spark
SQL
Trino
SQL
Parser
Antlr Tree
Trino
SQL
Antlr Tree
No
Yes
Success?
Spark
SQL
Rewriter
Query Execute
Spark SQL Rewriter解决了80%
以上的语法兼容问题
Trino
15. 核心能力
兼容Spark SQL
隐式转换
类型转换
Trino隐式转换支持
• INT转成BIGINT: 加宽类型(Type widening)
• STRING转INT: 翻译类型(Type translation)
显/隐式转换
• 显示转换: 用CAST进行类型转换,比如
CAST(1 AS DOUBLE)
• 隐式转换: 计算引擎自动根据需要的类型对数
据进行转换,比如1/‘2’(String转换成Int)
Trino只支持加宽类型的隐式转换
session参数use_spark_syntax
配置级别参数use-spark-syntax
能够控制开启SparkSqlRewriter和隐式转换等
16. 核心能力
兼容Spark SQL
尚未支持:
99.6%
兼容率
ANTI/SEMI JOIN
Hints语法
Table-valued Functions
部分Spark函数
17. 核心能力
优化Iceberg使用
Iceberg
• 适用于大型分析数据集的开放表格式
• 支持事务性,模式演进,隐式分区和行级更新等
• 适用于各种云存储和HDFS等
Trino on Iceberg问题
• 读取内存占用高,容易导致集群OOM
• 对Timestamp处理和Spark不一致(非错误)
• 表的读取存在正确性和性能问题
降低读取Iceberg元数据内存需求
优化Trino计算过程内存统计
支持按照session时区读取timestamp
支持高效读取Iceberg行级更新表
修复Iceberg表读取列错误问题
18. 核心能力
优化Iceberg使用
Timestamp
1970-01-01
00:00:00
timestamp时区
Unix timestamp
0
Timestamp类型一般与Unix时间戳对应
Iceberg
Table Schema Parquet(Int64)
Timestamp Int64
1970-01-01 00:00:00 0
Spark
Spark会将Timestamp转换成本地时间
Trino
Iceberg定义使用Unix timestamp存储timestamp类型数据
Timestamp
1970-01-01
08:00:00
Timestamp
1970-01-01
00:00:00
Trino会直接使用Timestamp时间
为保持用户查询结果一致,Trino也修改为转换成本地时间
19. 核心能力
优化Iceberg使用
Iceberg Data File
Iceberg Table `users`
id(key) name age
1 Alice 18
3 Bob 20
行级更新优化
part000.parqu
et
优化后
Iceberg Data File
id(key) name age
1 20
Alice
Iceberg Delete File
part000-
delete
.parquet
part000.parqu
et
part000-
delete
.parquet
part001-
delete
.parquet
INSERT INTO users /*+ OPTIONS('upsert-
enabled'='true') */
SELECT 1, Alice, 20;
part001.parqu
et
Trino Merge on Read
优化前
Position Delete: part000.parquet,1
Equality Delete: part000.parquet,id=1
part000.parqu
et
part000-
part001-
delete
delete
.parquet
.parquet
将相同Schema的equality-delete文件先
合并再进行merge,加快读取速度。
部分场景能将查询耗时由数十分钟降低到
几十秒。
20. 扩展能力
动态Catalog加载
社区实现
静态Catalog
Worker从Coordinator动态获取Catalog
Coordinator暂不支持动态注册Catalog
Worker负载高时获取Catalog失败
动态获取Catalog
小米实现
所有节点从Metacat获取动态Catalog
…
零失败并发加载数千Catalog
启动预加载时间随Catalog数线性增加
Lazy?
21. 扩展能力
动态UDF加载
PUSH
Trino
FDS
Gitlab
插件模式
PULL
发布订阅
实时生效
版本管理
使用Trino可拔插的 Gitlab-CI打包发布到对 流程全自动化,触发上 基于代码Tag进行版本
Plugin模式开发的UDF 象存储,运行中引擎自 线后整体在5min之内全 管理,回退只需要重新
项目 动检测更新后加载 集群生效 触发Tag的流水线
可扩展
降低耦合
自动化
可回退
22. 运维能力
Trino
Read
审计日志和历史服务
Push
消息中间件Talos
Audit Log/History Log
Read
Write
Iceberg
Flink
23. 运维能力
集成测试和自动发布
Trino-Examine项目
测试SQL的语法语义正确性
直连Trino和Kyuubi运行查询
Gitlab
Config
Trino
从SQL文件、审计日志表中获取语句进行查询
语义测试:
MiFlow
Pipeline
采用Spark Hash算法对每行数据进行运算并求和
SELECT SUM(result) FROM (
SELECT HASH(*) result FROM (
……
)
);
Matrix
Cluster1
Cluster2
24. 其他工作
Hive Metastore使用连接池提升元数据访问稳定性
Hive Metastore元数据缓存提升查询效率
增加管理接口和Metrics指标管理集群实时状态
支持使用Nacos管理集群资源组配置
支持集群的快速重启和worker优雅滚动重启
…
25. 03
应用场景
DataFunSummit # 2023
26. 应用模式
多集群模式
优点:
解决了单点故障,容错提升
集群少,便于维护
大集群,支持更多更复杂的查询
优点:
Trino社区推荐方式,实现简单
多集群可以利用集群进行资源隔离
根据不同的需求定制集群
Coordinator
缺点:
实现复杂,容易出现不一致问题
大集群对Coordinator配置要求更高
资源隔离效果更难把握
Worker
缺点:
只能通过失败重试保证容错
多集群的运维管理更为复杂
对长时间复杂查询不能保证成功率
Worker
单点故障?
代理多集群模式
多Coordinator大集群模式
Coordinator
SQL Proxy
Second
Coordinator
Coordinator
Worker
Worker
Worker
Worker
Worker
Coordinator
Worker
Worker
27. 应用模式
多集群管理
Trino
Code
Config
Code
镜像
存储 容器平台 Trino容器
集群
安装包
存储 系统管理
平台 Trino物理
集群
CI平台
对象
存储
CI平台
开发管理
服务配置解耦
统一集群管理
自动发布流程
28. 应用模式
多集群管理
集群类别:根据不同的业务需求来决定使用的一
组集群
集群类别
A业务
路由规则:根据不同的条件决定查询使用集群组
中具体的集群
公共
B业务
集群组B
集群组A
公共集群
资源组配置:限制单集群的资源的占用,保证良
性竞争和集群稳定性
路由和资源管理
按业务区分集群,保证资源的隔离
用户
空间
角色
来源
动态路由规则配置,支持黑白名单,保证负载均衡
资源组配置,单集群限制资源占用,保证稳定性
29. 应用场景
即席查询
数据预览
场景说明:
追求的极致的速度,秒级
限制查询运行时间<5min
即席查询
独立的集群,保证资源隔离
集群内严格限制大查询
快速失败
30. 应用场景
BI分析
小米BI数鲸
场景说明:
较快的产出看板,分钟级
限制查询运行时间<10min
微软Power BI
随表报数增长的集群规模
存在明显的周期性,定时扩缩容保证效率
并发较高,需要负载均衡
开启容错,尽可能保证成功率
31. 应用场景
分析业务加速
小米业务示例: 场景说明:
数据质量检查 根据业务不同,需要的集群规模和配置不同
用户画像分析 一般查询较为固定,需要资源也因此固定
数据推送任务 查询复杂度高耗时较长,小时级别,一般<1h
销售统计任务 并发度可控,成功率要求高,保证产出时间
…… 对集群的内存和CPU要求高,一般用物理机
32. 04
未来规划
DataFunSummit # 2023
33. 未来规划
缓存加速
存储上云
34. 感谢观看