《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未來規劃未來規劃未來規劃存儲上云緩存加速感謝觀看感謝觀看