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. 感谢观看

Accueil - Wiki
Copyright © 2011-2024 iteam. Current version is 2.137.1. UTC+08:00, 2024-11-16 17:49
浙ICP备14020137号-1 $Carte des visiteurs$