《Trino引擎在小米的应用实践.pdf》由会员分享,可在线阅读,更多相关《Trino引擎在小米的应用实践.pdf(34页珍藏版)》请在三个皮匠报告上搜索。
1、DataFunSummitDataFunSummit#20232023TrinoTrino引擎在小米的应用实践引擎在小米的应用实践周渝豪-小米-大数据软件工程师架构定位架构定位介绍小米的OLAP整体架构,以及Trino的定位和发展主要工作主要工作包括小米对Trino的内部适配,功能完善和核心能力建设应用场景应用场景简单说明Trino在小米的维护使用方式和几个实际的应用场景未来规划未来规划目前Trino正在进行的工作和进展,以及未来的方向目录目录 CONTENTCONTENTDataFunSummitDataFunSummit#202320230101架构定位架构定位Trino历史Trino架构
2、TrinoTrinoCLICLITrinoTrinoJDBCJDBCTrinoTrinoHTTPHTTPMetadataMetadataTrinoTrinoCoordinatorCoordinatorTrinoTrinoWorkerWorkerTrinoTrinoWorkerWorkerTrinoTrinoWorkerWorkerHDFSHDFSOSSOSSMySQLMySQLHiveHiveIcebergIcebergKuduKuduMySQLMySQLTrino优缺点架构清晰Master-Slave架构 存算分离 无依赖系统独立速度快全内存运算 Pipeline模式 动态代码生成扩展性强可
3、拔插Connector 跨源联邦查询 方便自定义函数内存要求高单个节点一般32G以上失败容忍低基于内存模式设计并发能力不足单主节点加上内存限制小米的OLAP架构Authorization ServiceEngine ManagerMetastore Service统一认证、授权统一认证、授权和元数据服务和元数据服务HTTPJDBC/ThriftWeb UIOLAPOLAP接入方式接入方式SQL ParserKyuubi ServerSQLSQL代理层代理层Kyuubi EngineTrinoDorisKylinSQLSQL引擎层引擎层权限验证引擎发现元信息获取小米的Trino定位 统一使用Sp
4、ark SQL语法 Trino只用于查询操作 Kyuubi负责接入和权限控制 Metacat统一元数据管理用户用户擅长Hive、Spark和MySQLKyuubi ProxyKyuubi Proxy对接Spark语法解析Kyuubi EngineKyuubi Engine执行执行Spark SQLSpark SQL任务任务,读写,读写TrinoTrino兼容兼容Spark SQLSpark SQL语法,只读语法,只读MetacatMetacat对统一管理元数据小米Trino目标让大数据更快到达用户眼前。让大数据更快到达用户眼前。更快更快的接入新数据源,更快的分析处理速度。内部场景测试相比Spa
5、rk SQL,Trino能够提供5-10倍的性能提升。大数据不仅是数据量大,还有种类来源丰富:Hive数仓Kudu存储引擎Iceberg数据湖关系型数据库眼前在小米Trino主要被用来提升用户可见部分的性能提升,比如数据预览,即席查询,统计报表等等。小米Trino发展基于352版本内部特性适配升级386版本应用场景优化升级421版本核心能力提升紧跟社区的步伐,每年进行一次大版本升级DataFunSummitDataFunSummit#202320230202主要工作主要工作主要工作核心能力核心能力 兼容Spark SQL 优化Iceberg使用0101扩展能力扩展能力 动态Catalog加载
6、动态UDF加载0202运维能力运维能力 审计日志和历史服务 集成测试和自动发布0303核心能力兼容Spark SQL 字面量和标识符的引用方式不同 Spark:单双引号字面量,反引号标识符 Trino:单引号字面量,双引号标识符 语法不同,比如Array Spark:Array()Trino:Array 语义不同,比如Array Spark:下标从0开始 Trino:下标从1开始SELECT 1 id,“Bobs Son”name FROM test WHERE array(1,2,3)0=1;Spark SQLSELECT 1“id”,Bobs Son“name”FROM test WHER
7、E array1,2,31=1;Trino SQLTips:小米统一使用Spark SQL作为标准OLAP查询语言Spark和Trino的SQL语法和语义都存在不同Spark SQL RewriterSpark SQL Rewriter解决了80%以上的语法兼容问题Spark SQLSpark SQL ParserSpark SQL RewriterAntlr TreeTrino SQLTrino SQL ParserSuccess?YesNoSpark SQLAntlr TreeQuery ExecuteTrino核心能力兼容Spark SQLSparkSqlRewriter核心能力兼容Sp
8、ark SQL隐式转换INT转成BIGINT:加宽类型(Type widening)STRING转INT:翻译类型(Type translation)类型转换显示转换:用CAST进行类型转换,比如CAST(1 AS DOUBLE)隐式转换:计算引擎自动根据需要的类型对数据进行转换,比如1/2(String转换成Int)显/隐式转换Trino只支持加宽类型的隐式转换Trino隐式转换支持 session参数use_spark_syntax 配置级别参数use-spark-syntax 能够控制开启SparkSqlRewriter和隐式转换等核心能力兼容Spark SQL99.6%兼容率尚未支持:
9、ANTI/SEMI JOINHints语法Table-valued Functions部分Spark函数核心能力优化Iceberg使用适用于大型分析数据集的开放表格式支持事务性,模式演进,隐式分区和行级更新等适用于各种云存储和HDFS等Iceberg降低读取Iceberg元数据内存需求优化Trino计算过程内存统计支持按照session时区读取timestamp支持高效读取Iceberg行级更新表修复Iceberg表读取列错误问题读取内存占用高,容易导致集群OOM对Timestamp处理和Spark不一致(非错误)表的读取存在正确性和性能问题Trino on Iceberg问题核心能力优化Ic
10、eberg使用timestamp时区Timestamp1970-01-01 00:00:00Timestamp类型一般与Unix时间戳对应Unix timestamp0IcebergTableTable SchemaSchemaParquet(Int64)Parquet(Int64)TimestampInt641970-01-01 00:00:000Iceberg定义使用Unix timestamp存储timestamp类型数据SparkSpark会将Timestamp转换成本地时间Timestamp1970-01-01 08:00:00TrinoTimestamp1970-01-01 00:
11、00:00Trino会直接使用Timestamp时间为保持用户查询结果一致,Trino也修改为转换成本地时间核心能力优化Iceberg使用行级更新优化id(key)id(key)namenameageage1Alice183Bob20Iceberg Data FileINSERT INTO users/*+OPTIONS(upsert-enabled=true)*/SELECT 1,Alice,20;Iceberg Table userspart000.parquetIceberg Data Filepart001.parquetid(key)id(key)namenameageage1Ali
12、ce20Iceberg Delete Filepart000-delete.parquetPosition Delete:part000.parquet,1Equality Delete:part000.parquet,id=1part000-delete.parquetpart000.parquetpart001-delete.parquetTrino Merge on Read优化前part000-delete.parquetpart000.parquetpart001-delete.parquet优化后 将相同Schema的equality-delete文件先合并再进行merge,加快读
13、取速度。部分场景能将查询耗时由数十分钟降低到几十秒。扩展能力动态Catalog加载静态Catalog动态获取Catalog社区实现Worker从Coordinator动态获取CatalogCoordinator暂不支持动态注册CatalogWorker负载高时获取Catalog失败小米实现所有节点从Metacat获取动态Catalog零失败并发加载数千Catalog启动预加载时间随Catalog数线性增加Lazy?扩展能力动态UDF加载GitlabFDSPUSHTrinoPULL插件模式发布订阅实时生效版本管理使用Trino可拔插的Plugin模式开发的UDF项目可扩展Gitlab-CI打包发
14、布到对象存储,运行中引擎自动检测更新后加载降低耦合流程全自动化,触发上线后整体在5min之内全集群生效自动化基于代码Tag进行版本管理,回退只需要重新触发Tag的流水线可回退运维能力审计日志和历史服务Trino消息中间件TalosPushFlinkReadIcebergWriteReadAudit Log/History Log运维能力集成测试和自动发布语义测试:采用Spark Hash算法对每行数据进行运算并求和Trino-Examine项目 测试SQL的语法语义正确性 直连Trino和Kyuubi运行查询 从SQL文件、审计日志表中获取语句进行查询SELECT SUM(result)FRO
15、M(SELECT HASH(*)result FROM();TrinoConfigGitlabMatrixCluster1Cluster2MiFlowPipeline其他工作 Hive Metastore使用连接池提升元数据访问稳定性 Hive Metastore元数据缓存提升查询效率 增加管理接口和Metrics指标管理集群实时状态 支持使用Nacos管理集群资源组配置 支持集群的快速重启和worker优雅滚动重启 DataFunSummitDataFunSummit#202320230303应用场景应用场景应用模式多集群模式CoordinatorWorkerWorker单点故障?Coord
16、inatorWorkerWorkerSecond CoordinatorWorker多Coordinator大集群模式CoordinatorWorkerWorkerCoordinatorWorkerWorker代理多集群模式代理多集群模式SQL Proxy优点:解决了单点故障,容错提升 集群少,便于维护 大集群,支持更多更复杂的查询缺点:实现复杂,容易出现不一致问题 大集群对Coordinator配置要求更高 资源隔离效果更难把握优点:Trino社区推荐方式,实现简单 多集群可以利用集群进行资源隔离 根据不同的需求定制集群缺点:只能通过失败重试保证容错 多集群的运维管理更为复杂 对长时间复杂查
17、询不能保证成功率应用模式多集群管理安装包存储镜像存储Trino CodeConfig CodeCI平台容器平台系统管理平台对象存储CI平台Trino容器集群Trino物理集群 开发管理开发管理 服务配置解耦 统一集群管理 自动发布流程应用模式多集群管理路由和资源管理路由和资源管理 按业务区分集群,保证资源的隔离 动态路由规则配置,支持黑白名单,保证负载均衡 资源组配置,单集群限制资源占用,保证稳定性集群类别A业务B业务公共集群组A集群组B公共集群用户空间角色来源集群类别:根据不同的业务需求来决定使用的一组集群路由规则:根据不同的条件决定查询使用集群组中具体的集群资源组配置:限制单集群的资源的占
18、用,保证良性竞争和集群稳定性应用场景即席查询数据预览场景说明:追求的极致的速度,秒级 限制查询运行时间5min 独立的集群,保证资源隔离 集群内严格限制大查询 快速失败即席查询应用场景BI分析微软Power BI小米BI数鲸场景说明:较快的产出看板,分钟级 限制查询运行时间10min 随表报数增长的集群规模 存在明显的周期性,定时扩缩容保证效率 并发较高,需要负载均衡 开启容错,尽可能保证成功率应用场景分析业务加速场景说明:根据业务不同,需要的集群规模和配置不同 一般查询较为固定,需要资源也因此固定 查询复杂度高耗时较长,小时级别,一般1h 并发度可控,成功率要求高,保证产出时间 对集群的内存和CPU要求高,一般用物理机小米业务示例:数据质量检查 用户画像分析 数据推送任务 销售统计任务 DataFunSummitDataFunSummit#202320230404未来规划未来规划未来规划存储上云缓存加速感谢观看感谢观看