其他
小米 OLAP 引擎在 Trino 的应用实践
导读 本文将分享 Trino 在小米的应用实践。
主要包括以下五部分内容:1. 架构定位
2. 主要工作
3. 应用场景
4. 未来规划
5. 问答环节
分享嘉宾|周渝豪 小米 大数据软件开发工程师
编辑整理|李欣卫
内容校对|李瑶
出品社区|DataFun
1. Trino 的历史
2. Trino 架构
3. Trino 性能
4. Trino 优缺点
架构清晰:Trino 使用 Master-Slave 架构,存算分离,没有额外的系统依赖,使得架构清晰简洁; 速度运行快:Trino 查询速度快得益于以下几个原因,一是完全内存运算,二是内部基于流水线的模式,三是其动态代码生成技术比较先进。 扩展性强:Trino 可以连接各种数据源,支持跨源查询。
内存要求高:Trino 对内存的需求较高,通常要求每个节点至少有 32GB 以上的内存,这可能导致在内存资源有限的环境中出现故障。 容错能力较低:由于依赖内存计算,Trino 在遇到节点故障时的容错能力相对较弱。 受限的并发能力:采用 master-slave 架构,Trino 系统中只有一个 Coordinator 负责协调查询,这限制了系统的并发处理能力,使其依赖于单个 Coordinator 的性能。
5. 小米的 OLAP 架构
7. 小米 Trino 目标
大数据:不仅数据量大,数据来源也会很丰富,Trino 能够对接各种不同的数据源,比如 Hive 数仓、Kudu 存储引擎、数据湖、关系型数据库等等。 更快:Trino 拥有更快的速度,它能够更快地接入新的数据源,更快地分析处理。 眼前:小米 Trino 主要还是被用来提升用户的可见性部分的性能,比如数据预览、即席查询、统计报表等等,而数据 ETL 处理还是交由 Spark 来负责完成。
主要工作
核心能力:主要集中于确保与 SparkSQL 的兼容性,以便为使用 Spark 的用户群体提供无缝过渡的体验。此外,团队在数据湖 Iceberg 上进行了一系列的优化实践,以提高查询性能和数据管理效率。 功能扩展:对 Trino 增加了诸如支持动态加载 Catalog 和用户自定义函数(UDF)的功能,从而增强了其灵活性和适应不同业务需求的能力。 运维能力:强化了审计日志和历史服务,这对于跟踪查询性能、确保安全性以及满足合规要求至关重要。实现了集成测试的自动化发布,这有助于提高软件交付的速度和质量,并确保新版本的稳定部署。
SQL 重写
隐式类型转换
日志收集与实时处理 通过消息队列收集系统或应用程序生成的普通日志数据。使用 Apache Flink 实时消费这些日志数据,并将其写入 Iceberg 表。与传统数仓 T+1(次日生效)的处理时间相比,这种方式可以实现至少小时级别的数据生效时间。数据写入 Iceberg 后,可以使用 Spark 或 Trino 进行查询,实现分钟级别的数据时效性,通常在 30 分钟到 5 分钟内。 从关系型数据库实时同步 直接从传统关系型数据库(如 MySQL)实时同步业务数据到数据仓库。利用Flink Change Data Capture (CDC)技术导入数据到 Iceberg 的 V2 表中。V2 表支持行级更新,这使得对 MySQL 表中的数据执行 upsert(更新或插入)操作成为可能。这种同步方式也基本能够达到分钟级别的数据时效性,确保数据变化能够实时反映在 Iceberg 表中。
位置删除(Position Delete): 这种模式下,指定要删除的行的位置,例如删除文件二中的第 0 行。当执行读取操作时,Iceberg 会应用删除文件,过滤掉那些被标记为删除的行,从而实现更新效果。 相等删除(Value Delete): 这种模式下,通过指定列的值来删除行,比如删除所有第一列值为 1 且第二列值为 a 的行。这种删除操作会被应用到所有相关的数据文件上,确保满足条件的行被删除。
降低元数据内存需求:通过优化读取元数据的过程,减少了内存消耗,从而降低了 OOM 的风险。 明确内存统计:在计算过程中对内存使用进行了更细致的监控和管理,以确保内存使用更加合理。 Session-based Timestamp 读取:支持按会话(session)读取 Timestamp 数据类型,并保持时区设置与 Spark 一致,以解决 Trino 和 Spark 在 Timestamp 处理上的不一致性问题。 高效读取行级更新表:支持高效地读取 Iceberg V2 的行级更新表,这对提高大数据场景下的查询性能尤其重要。 修复列读取错误:解决了一系列读取的错误,这些错误可能导致查询结果不正确。
函数打包和推送:当有新的函数需要添加时,相关的函数项目会被打包并推送到对象存储中; 自动拉取和加载:Trino 引擎会定时从对象存储中拉取更新后的函数项目,并自动加载这些函数,无需重启集群,实现实时生效; 插件模式优势:这种插件式的模式使得函数项目与 Trino 代码保持解耦,便于独立开发和维护; 版本管理: 使用 git 进行版本管理,如果需要回退到旧版本,可以直接基于 git 操作来实现。
应用场景
未来规划
问答环节
分享嘉宾
INTRODUCTION
周渝豪
小米
大数据软件开发工程师
毕业于武汉科技大学,先后就职于深圳市同洲电子股份有限公司、武汉安天信息技术有限责任公司和小米科技(武汉)有限公司,此前主要负责基于 Hadoop 的大数据平台的开发和维护,主要是 Hive 和 Spark 相关的工作,目前在小米负责 OLAP 引擎 Trino 的开发和维护。
1
内容整理志愿者招募
2
优质文章推荐
往期推荐
点个在看你最好看