腾讯 PB 级大数据计算如何做到秒级?
天穹 SuperSQL 是騰訊自研,基于統一的 SQL 語言模型,面向機器學習智能調優,提供虛擬化數據和開放式計算引擎的大數據智能融合平臺。在開放融合的 Data Cloud 上,業務方可以消費完整的數據生命周期,從采集-存儲-計算-分析-洞察。還能夠滿足位于不同數據中心、不同類型數據源的數據聯合分析/即時查詢的需求。
Presto 在騰訊天穹 SuperSQL 大數據生態中,定位為實現秒級大數據計算的核心服務。主要面向即席查詢、交互式分析等用戶場景。Presto 服務了騰訊內部的不同業務場景,包括微信支付、QQ、游戲等關鍵業務。日均處理數據量 PB 級,P90 查詢耗時為 50s,全面提升各業務數據實時分析性能,有效助力業務增長。本篇文章將揭秘騰訊大數據在 Presto 上的核心工作,包括易用性、穩定性、性能,以及未來的主要方向等方面。
1 天穹 Presto 整體架構
天穹 Presto 作為天穹 SuperSQL 的主要執行引擎之一,主要承擔著加速用戶 SQL 執行速度的角色。SuperSQL 通過智能路由(RBO/CBO/HBO)的方式,智能篩選出合適的 SQL 并分發給 Presto 執行,以加速 SQL 計算。另外,如果 Presto 執行失敗,SuperSQL 也能自動 Failover 到 Hive 或 Spark 重新執行,以確保用戶 SQL 能順利執行完成,而整個過程對用戶透明、無感知。
關于天穹 SuperSQL 的介紹,可以查看歷史文章:「解耦」方能「專注」——騰訊天穹 SuperSQL 跨引擎計算揭秘
天穹 Presto 采用了 on K8s 容器化部署的方式,具備自動化運維、彈性伸縮等云原生能力。同時支持為不同的業務獨立部署專屬的 Presto 集群,以避免造成不同集群負載的相互影響。
得益于 Presto 的多數據源訪問能力,天穹 Presto 支持對接了 Hive、Iceberg、MySQL 等數據源,且為了更好地支持內部的業務,我們也擴展開發了內部的 TDW Connnector,支持訪問騰訊內部的數據倉庫數據(TDW,Tencent distributed Data Warehouse)。同時天穹 Presto 使用了 Alluxio 作為數據源(Hive 表、Iceberg 表)的緩存層,用于加速熱點數據的訪問,可有效提升 Presto 查詢的效率。
2 易用性增強
2.1 Hive 語法兼容
由于部分用戶習慣于使用 Hive 的語法,而 Presto 自身的語法語義與 Hive 相比又有些不同,因此天穹 Presto 在引擎側做了兼容部分 Hive 語法語義的工作,主要包括:數值除法、數組下標取值、Hive UDF 支持、Mapjoin Hint、隱式轉換等。
對于 Mapjoin Hint,其實是對應于 Presto 中的 Broadcast Join,用戶通過 Mapjoin Hint 來指定多表 Join 中的需要 Broadcast(廣播)的表,以此提升查詢的性能,適用于大小表 Join 的場景。目前已支持在 Inner Join 和 Left Join 中使用 Mapjoin Hint。
--?Presto采用Broadcast?Join,Broadcast的表為test2 select?t1.b,?/*+mapjoin(t2)*/?t2.b2?from?test1?t1?join?test2?t2?on?t1.a?=?t2.a2;--?Presto采用Broadcast?Join,Broadcast的表為test1、test3 select?t1.b,?/*+mapjoin(t1,t3)*/?t2.b2,?t3,b3?from?test1?t1?join?test2?t2?on?t1.a?=?t2.a2?join?test3?t3?on?t1.a=t3.a3;由于原生 Presto 不支持數值類型與字符串之間的隱式轉換,為了兼容部分習慣于使用隱式轉換的用戶,天穹 Presto 在引擎側做了增強,以支持類似于 Hive 語法中隱式轉換的功能。
天穹 Presto 隱式轉換規則表如下所示:(綠色表示支持從 Source Type 到 Target Type 的隱式轉換,其余空白格表示不支持類型之間的隱式轉換)。
2.2 Query 運行信息持久化
Presto 的 Event Listener 提供了相關的接口,可以在查詢執行完成后獲取不同緯度的 Metrics 信息,比如查詢執行期間各階段的耗時、處理的數據量、內存/CPU 消耗、Stage/Task/Operator 統計信息等,天穹 Presto 擴展實現了 Event Listener 接口,將這些 Query Metrics 信息持久化到本地磁盤以及消息組件中,用于后續的問題定位、運維審計、資源統計、HBO 等。
2.3 Iceberg Connector 功能增強
騰訊天穹實時數倉-數據湖分析系統 DLA 使用了 Iceberg 作為表的數據組織格式,用戶數據入湖后,可以通過 Presto Iceberg Connector 獲得秒級的查詢體驗。天穹 Presto 也對 Iceberg Connector 做了一系列的功能增強,包括 ORC 存儲格式支持(PR-16391)、Timestamp With Time Zone 類型支持、Alluxio Local Cache 支持(PR-16942)、并發寫入(PR-16983)、Bugfix(PR-16959、PR-16968 )等,大部分的特性或問題修復也已貢獻到了 PrestoDB 社區。
3 穩定性提升
3.1 JVM 調優
Presto 在天穹上線運行的過程中,遇到過 Worker Full GC 停頓時間過長的問題,為此天穹 Presto 將 JDK 版本升級到了 11(參考社區 issue 14873),并對 JVM 參數做了持續的調優,比如適當增大-XX:GCLockerRetryAllocationCount 參數的值(默認為 2),以增加 Full GC 的概率盡量避免 OOM 的情況發生。目前在堆內存為 180GB、CPU 96 核的硬件條件下,天穹 Presto Worker Full GC 的平均耗時從數十秒降低到了十秒以內,停頓時間大幅下降。
3.2 Full GC Query Killer
Presto 的查詢內存使用統計是相對比較粗粒度的,這可能會導致原生的 LowMemoryKillerPolicy 在某些情況下不能正確地 Kill 查詢,天穹 Presto 在線上運行的過程中就遇到過類似的情況:Worker 堆內存已經接近用滿了,但是 Presto 自身的 Memory Pools 顯示還有較多的空閑內存,導致無法及時觸發 LowMemoryKillerPolicy。為了盡量避免這種情況,天穹 Presto 開發了 Full GC Query Killer,該策略可以在 Worker Full GC 之后,如果 Worker 堆內存使用還是處于高值,則 Kill 掉在該 Worker 上使用最多內存的查詢。需要注意的是,該策略是在應用程序層面執行的,如果 Worker 不斷地 Full GC 乃至最后 OOM,那么 Full GC Query Killer 可能也得不到響應,這時候還是需要通過其他手段分析定位出 Full GC 或 OOM 的原因,以徹底解決問題。
Full GC Query Killer 相關的代碼也將在近期貢獻至 PrestoDB 社區,歡迎大家關注。
3.3 大文件 ORC 統計信息讀取優化
Presto 在讀取 ORC 文件時,會先讀取文件的 Stripe 統計信息,用于優化 ORC 的數據讀取,但是如果 ORC 文件比較大,同時文件數量又比較多的情況下,StripeStatistics 對象會占用較多的 Worker 堆內存,這些內存對象不斷累積最終極易造成 OOM。天穹 Presto 采用了以下的方案來盡量避免這個問題:對于來自同一個 ORC 大文件的 Splits,避免重復讀取文件的 Stripe 統計信息。
SplitFilerOperator 會先讀取一次 ORC 文件的 Stripe 統計信息,生成新的 ORC Splits,新的 Splits 包含了利用 Stripe 統計信息過濾優化后的數據讀取地址,后續 ORC Splits 分發至 Worker 中執行時,無需再讀取 Stripe 統計信息,直接讀取數據即可。
天穹內部環境測試結果顯示該方案能減少50%左右的 StripeStatistics 對象內存占用,原先造成 OOM 的 ORC 查詢,采用新方案的實現后也可以正常執行完成,目前正在上線生產環境中。
4 性能優化
4.1 Presto on Alluxio
天穹 Presto on Alluxio 主要有兩種部署模式:Presto on Alluxio Cluster 以及 Presto Alluxio Local Cache,前者是比較通用的一種部署方式,但是需要額外維護一套 Alluxio 集群,Presto 可以與 Alluxio 集群共部署或者分離部署,共部署的方式能有效提高本地讀緩存的命中率,提升查詢效率。Presto Alluxio Local Cache 則是更輕量的部署模式,無需單獨的 Alluxio 集群,數據緩存在 Presto Worker 側,運維方便,缺點是 Presto Worker 動態擴縮容的場景下緩存會失效,目前 PrestoDB 和 Alluxio 社區也在持續推進 Local Cache 的方案,相信后續會越來越完善。
天穹 Presto 根據各業務的場景需求,對 on Alluxio 的方案做了以下增強,提高了易用性和可擴展性:
支持針對不同的 Connector 配置不同的 Alluxio 路由策略,比如 Hive Connector 和 Iceberg Connector;
在 Presto 側,新增 Alluxio 白名單機制,支持配置訪問緩存在不同 Alluxio 集群下的庫表數據;
在路由前檢測 Alluxio 服務的狀態可用性,當 Alluxio 服務不可用時自動 Failover 至 HDFS;
白名單配置參數說明如下:
"clusterUrl":Alluxio 集群的 url 地址,不同的集群可以配置不同的 url。
"tables":Presto 查詢中涉及到的庫表,如果已經在"tables"配置項中存在,則 Presto 會從對應的 Alluxio 集群中讀取該庫表的數據(首次從 Alluxio 中讀取時,如果未有緩存,則 Alluxio 會將數據緩存下來,后續的讀取會直接訪問緩存),如果沒有在"tables"中配置,則 Presto 會直接訪問底層的 HDFS、不經過 Alluxio。"tables"支持庫/表/分區級別的配置,支持通配符。
天穹 Presto on Alluxio 方案上線后,部分現網查詢業務得到了20%~ 30%的性能提升,數據讀取的耗時波動幅度變小、查詢性能也更加穩定。
4.2 Presto on K8s
Presto on K8s 是業界通用的一種部署模式,可以參考社區的presto-kubernetes-operator,天穹 Presto 根據自身的業務情況做了相應的適配改造, 整體的部署架構圖如下所示:
每個 Presto 集群前端會部署一個 CLB 騰訊云負載均衡服務,對外提供統一的訪問域名地址。CLB 后端掛載 Coordinator Pod,Worker 通過 CLB 地址向 Coordinator 注冊,客戶端也通過 CLB 訪問 Presto。
天穹 Presto 集群有單獨的租戶資源,能保證集群的資源下限(Dedicated Resource),通過 K8s HPA Controller 感知 Presto Worker 的 CPU 和內存資源使用情況,實現 Worker Pod 的動態擴縮容。當白天 Presto 任務量較多需要更多資源時,可以動態擴容 Worker 至租戶的資源上限,如果其他業務租戶有空閑的資源,也可以繼續"借用"。當晚上 Presto 集群空閑時,可以動態縮容 Worker,將資源釋放給其他業務租戶使用,使資源池的利用率最大化。
4.3 Count Distinct Rewrite
Presto 的 Count Distinct 實現在某些場景下會造成數據傾斜的問題,影響查詢的性能,比如在 Left Join 之后再做 Count Distinct,由于 Presto use_mark_distinct 規則的作用,會在 Left Join 之后做一次 Repartitioning,然后在下一個 Stage 做 MarkDistinct,如果 Repartitioning 階段的 Partition Key 有較多重復值,那么就會造成下一個 Stage 出現數據傾斜的問題,影響 MarkDistinct 算子的執行速度。如果能將 Count Distinct 改寫成 Grouping Sets,由于 Group By 會在 Repartitioning 前做預聚合,所以能有效消除上述的數據傾斜問題。社區也有類似的 issue 12024,但是從該 issue 的討論內容來看,還并未有較完善的解決方案。
目前我們通過天穹 SuperSQL 來實現 Count Distinct 單列/多列到 Grouping Sets 的改寫,無需改動 Presto 的代碼,經過改寫優化后,在某些用戶場景下,能獲得2 ~ 3 倍的查詢性能提升。
4.4 Optimized Repartitioning
天穹 Presto 每天的業務查詢 Exchange 的數據量達到了上百 PB 級別,為了提升 Repartitioning 階段的性能,我們在生產環境中啟用了社區的 Optimized Repartitioning 特性:
set session optimized_repartitioning=true; 參考 PR-13183
開啟后,PartitionedOutputOperator 算子整體的CPU 消耗減少了 50%,P90 查詢耗時降低了 19%,某些用戶場景下的查詢性能提升接近 2 倍,節省了資源的同時性能也得到了較大的提升。
5 總結 & 未來工作
天穹 SuperSQL的 vision 是通過構建大數據智能融合平臺,將異構的計算引擎/異構的存儲服務、計算的自動智能優化、流批一體的統一以及自治的系統運維納入內部,給使用者提供簡單統一的邏輯入口和虛擬化的視圖方案,使得用戶能夠從繁雜的技術細節中解脫出來,專注于業務邏輯的實現。未來在 Presto 的工作主要有:語法擴展(臨時表/視圖的支持等)、運維增強(History Server、高可用)、自適應執行(運行在不同硬件規格的機器上)、內核性能提升、數據源 Connector 擴展增強等,在支撐好騰訊內部各業務需求的同時,也會積極擁抱和回饋開源社區,本篇文章的大部分內容,我們也在 2021 年 12 月舉行的 PrestoCon 大會上做了分享PrestoCon-2021,歡迎大家持續關注。
聯系我們
如果你對 SuperSQL 感興趣,歡迎聯系我們探討技術。同時我們長期歡迎志同道合的大數據人才加入,歡迎咨詢。聯系方式:yikonchen@tencent.com
#有料程序員 直播#
對談中年鵝廠工程師
工作20年依然保持少年般的熱情
點擊預約,觀看直播
總結
以上是生活随笔為你收集整理的腾讯 PB 级大数据计算如何做到秒级?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新一代消息队列 Pulsar
- 下一篇: 速抢免费红包封面!