順豐科技:從 Presto 到 Doris 湖倉構架升級,提速 3 倍,降本 48%

導讀:順豐科技引入 Doris 替換 Presto,在內部可視化數據自助分析工具豐景臺場景廣泛應用。目前,順豐臨時查詢業務、豐景臺報表業務的 Presto 場景已經 100% 切換到 Doris 集群中,日均查詢量 100W+。并實現 P95 性能提升近 3 倍,硬件資源節省達 48% 顯著收益。

豐景臺是順豐科技自主研發的一款可視化數據自助分析工具,旨在提升數據分析師的工作效率,助力自助分析和業務決策。該產品支持多種豐富的圖表類型,用戶只需通過拖拽操作即可快速進行自助分析,實現數據可視化。目前,豐景臺已廣泛支撐順豐的物流收、轉、運、派等各個環節,該平臺處理的數據規模龐大,用戶數量眾多,對實時響應速度和穩定性有著較高要求。

最初,豐景臺使用 Presto 作為查詢引擎,面臨查詢速度慢、服務穩定性不足以及資源消耗成本高等問題。為解決這些問題,引入 Doris 替換 Presto,構建統一的數據分析平臺。目前,順豐臨時查詢業務、豐景臺報表業務的 Presto 場景已經 100% 切換到 Doris 集群中,日均查詢量 100W+。并實現 P95 性能提升近 3 倍,硬件資源節省達 48%。

使用 Presto 面臨挑戰

起初,豐景臺使用 Presto 作為查詢引擎來支撐業務。基于自研的 Presto On Yarn 模式,可以在租戶級別根據業務負載情況自動調整 Presto 集群的規模,或根據負載模式選擇不同的 Presto 子集群對查詢請求進行路由。

使用 Presto 面臨挑戰.png

因豐景臺支撐的業務線眾多,查詢模式多樣化,且高峰期的 QPS 較高,涉及到的數據量龐大。同時,系統對查詢延遲有嚴格的保證需求。在使用 Presto 時遇到了以下問題:

  • 查詢速度慢: 因 Presto 查詢優化器能力有限,無法提供很好的規則優化,尤其在處理復雜查詢時,查詢速度慢,無法滿足性能要求。
  • 服務穩定性差: Presto 缺乏內置的緩存機制,容易受到 HDFS IO 抖動的影響,影響服務的穩定性。引入外部緩存組件雖然可以緩解這一問題,但同時也會增加系統的復雜性。
  • 資源成本高:Presto 以萬核規模運行,需要大量的計算資源和硬件支持,整體資源成本高昂。
  • 適用場景有限:Presto 作為查詢引擎,但它不具備數據存儲的能力,當前只能分析存儲在 Hive 中的數據。更加實時的場景、半結構化分析的場景不好滿足。

為什么選擇 Apache Doris

為解決上述痛點,順豐在 2024 年初開始調研下一代數據分析產品,旨在尋求一款高性能、功能豐富且適用場景廣泛的工具,以支持豐景臺及內部業務的各種數據分析需求。Apache Doris 在性能表現和資源成本等方面具有顯著優勢:

  • 查詢速度更快: Doris 的查詢優化器(CBO)可有效支持復雜查詢,尤其是多表關聯查詢的優化,同時通過豐富的統計信息提升優化規則的準確性。此外,Doris 物化視圖能力能靈活應對數據加工和湖倉透明加速等場景。
  • 服務穩定性高: Doris 提供內置的元數據和數據緩存能力,可有效降低遠端存儲(如 HDFS)抖動對查詢延遲的不穩定影響,同時降低系統維護的復雜度。
  • 湖倉統一及查詢加速: Doris 作為湖倉加速引擎,可直接對 Hive、Iceberg 和 Paimon 在內的主流湖倉格式進行查詢加速,并能管理高性能的自有格式數據。憑借 Doris 單一引擎即可支撐日志分析、實時報表分析等多樣化場景的統一分析。
  • 彈性資源隔離: Doris 提供節點級別的物理隔離和進程內的線程級別隔離,利用計算節點和計算組等功能,滿足順豐對多業務、多租戶及彈性擴縮容的需求。

Presto 到 Doris :湖倉建設實踐

順豐科技自 2024 年中開始,逐步使用 Apache Doris 替換 Presto 所支持場景,構建統一的數據分析平臺。Doris 具備查詢和存儲的能力,既可以作為查詢引擎查詢數據湖 Hive 中數據,也作為數據倉庫存儲數據。這一升級,同時滿足數據倉庫和數據湖的需求,實現了查詢與存儲引擎的統一。

Presto 到 Doris :湖倉建設實踐.png

在平臺升級過程中,順豐重點關注以下兩點:

  • 無感升級: 由于是線上業務的升級,需保證整個過程業務側無明顯感知。因此,需完善對 Presto 的語法支持、SQL 行為的兼容、集群切換方案和監控報警方面的能力。
  • 性能提升和穩定性保障: 基于 Doris 以更少的計算資源獲得更好的分析性能,同時保證整體服務的穩定性。

接下來核心圍繞以上兩點,詳細介紹架構迭代升級過程中的實踐、優化經驗和收獲。

01 無感升級

Presto 和 Doris 兩套系統雖然都支持標準 SQL,但是在部分語法、函數語義和執行行為上存在細微差別。因此我們在前期涉及了周密的遷移驗證流程,在平臺側通過以下方案來確保架構的平滑升級:

  • 開發線上查詢模擬工具,自動收集線上查詢語句,并在測試環境進行回放和結果比對,驗證結果正確性。
  • 開發壓力測試工具模擬真實線上流量負載,檢查高峰、低谷期 Doris 集群的資源開銷、查詢延遲等,用于驗證穩定性和性能預期。
  • 搭建 Doris -> Presto 的雙跑和降級切換鏈路。可以按照比例將流量緩慢灰度到 Doris 集群。并且通過自定義路由規則,當遇到 Doris 不支持的函數、語法、SQL 行為時,系統自動將切換到 Presto 集群上,確保上游業務的平穩運行。

Presto 和 Doris 兩套系統無感升級.png

這些方案是整個升級和遷移項目的重要基石,為后續的性能表現、版本迭代提供了有力保障。

02 Presto SQL 方言兼容

Doris 社區提供了 SQL Convertor 組件,靈活支持將 Hive、Trino/Presto、Spark、Clickhouse 等多種 SQL 方言轉換為 Doris SQL,幫助業務無感遷移到 Doris 。在驗證階段,飛輪科技與順豐合作,完成了大量方言適配工作,顯著提升了 Presto SQL 方言的兼容性。

  • 語法改寫: 將 Presto SQL 語法等價改寫為 Doris SQL 語法。例如,在 Presto SQL 中,列名用雙引號包裹需轉換為反引號;或者為 Presto SQL 中的子查詢添加別名,以滿足 Doris SQL 對別名的強制要求等。
  • 函數簽名改寫: 將 Presto 中與 Doris 行為相同但簽名不同的函數進行改寫。比如將 date_parse函數改寫為 str_to_da``te函數;或者調換data_trunc函數中的參數順序等。
  • 函數行為改寫: Doris 的大部分函數行為兼容 MySQL,如對非法參數的處理和返回值的精度等。如果直接修改這些函數的行為,會對其他用戶造成影響。因此額外補充了一些符合 Presto 行為的新函數,并通過 SQL Convertor 改寫,或使用cast轉換類型,以不影響原函數行為的情況下提升對 Presto 函數行為的兼容度。
  • 輸出格式改寫: 針對 Array、Map、JSON 等復雜類型的字符串輸出,Doris 提供了相應的改寫規則。比如將 Doris 對 Map 類型的字符串表示由{"k1":null, "k2":"v3"}改寫為{k1=NULL, k2=v3},確保用戶在進一步處理時獲得正確的語義。
  • 新增函數: 新增大量 Doris 原本不支持的 Presto/Trino 函數,進一步提升 SQL 兼容性。

目前在順豐業務場景下,Presto SQL 兼容度可以達到 97%,僅有少部分 SQL 需要業務方配合調整,后續將進一步加強兼容性,目標達到 99%以上。

03 Parquet/ORC 性能優化

豐景臺場景存儲格式包括 Parquet、ORC 以及少量 Json 和 Text 數據格式。數據多樣性對優化工作帶來了挑戰。順豐與飛輪科技在以下方面合作,顯著提升了 Doris 對不同文件格式的訪問性能:

  • **復雜類型的延遲物化:**針對包含 Map、Array、Struct 等復雜類型的查詢,在 Parquet/ORC 讀取過程中提供延遲物化能力,顯著降低 IO 數量。
    Parquet:ORC 性能優化.png

  • 小 IO 優化:通過調整 Merge IO 的閾值,緩解在不同查詢模式下 Merge IO 引發的讀放大問題,并顯著降低 IO 次數。

  • ORC Tiny Stripe 優化:針對包含大量小 Stripe(小于 8MB)的 ORC 文件,提供跨 Stripe 合并讀取能力,降低 IO 次數并提升文件讀取吞吐。

  • 數據格式兼容度提升:全面支持 Parquet/ORC/Text 在 snappy、lz4、zstd、gzip、lzo、bzip2、brotli 等多種壓縮格式下的讀取能力。并且提供enable_text_validate_utf8等可調選項,確保在非法值場景下(如非 UTF8 編碼的 Text 格式)行為和 Presto 一致。

這些優化顯著改善了 Doris 在文件格式讀取性能、穩定性和兼容性方面的表現。

04 HDFS IO 優化

豐景臺場景數據由科技提供的 HDFS 統一存儲。由于 HDFS 在多個業務共享,業務高峰期可能出現 IO 抖動、延遲增大甚至超時等問題。針對 HDFS 特性,制定了多種改善 IO 的措施:

  • 文件對齊 Block 切分: Doris 將大文件切分為多個文件分片,通過并行讀取提升效率。針對 HDFS 文件,Doris 根據 HDFS Block Size 對齊切分,避免分片任務跨 Block 讀取,降低對 Namenode 的訪問頻率,從而減少 HDFS 不穩定的影響。
  • HDFS Hedged Read 和 Read Timeout: HDFS 客戶端提供 Hedged Read 功能,當數據塊的讀取請求在預設時間內未響應時,會向其他數據節點發送額外請求,使用最快返回的數據塊,減少讀取延遲。此外,通過dfs.client.socket-timeout降低讀取超時閾值,快速觸發重試,從而提升 IO 穩定性。這些功能在部分順豐業務場景下顯著改善了訪問 HDFS 的 IO 響應性能。

05 執行調度優化

Hive 等湖倉外表數據的查詢執行環境與內表數據存在顯著差異,如元數據訪問延遲和網絡 IO 開銷。因此,針對外表查詢特點優化了執行調度:

  • 動態優先級調度: 豐景臺場景查詢模式多樣,無法通過預定義 Workload Group 進行資源分組和隔離。動態優先級調度策略通過任務分片執行時間統計,實時識別大查詢和小查詢,動態調整優先級,顯著降低中小查詢在資源搶占場景下的延遲。

    執行調度優化.png

  • 分片異步調度: Hive 集群中有大量分區數量在十萬級別的表。Doris 通過分片異步調度,讓文件列表的 List 操作與 BE 節點的文件讀取并行執行,顯著改善了海量分區訪問時的查詢調度耗時。

    分片異步調度.png

  • Limit 下推優化: 實際場景中存在大量由謂詞條件和 Limit 子句組成的查詢,通常用于快速探查符合條件的數據,但無需返回查詢結果,但要求探查完成后快速結束查詢。Doris 在查詢規劃時將 Limit 下推到數據掃描節點,并在掃描任務調度、跨節點數據傳輸、查詢快速熔斷方面進行了優化,顯著減少了 IO 開銷。

這些優化降低了 Doris 對 CPU 和 IO 資源的開銷,在混合負載的 Hive 查詢場景中大幅提升了查詢的穩定性和可預期性,尤其在長尾查詢和 95 分位以上的延遲上效果顯著。

06 緩存優化

緩存功能降低了通過網絡訪問外部數據源的不可預測性,并提升了熱點數據的讀取性能。在豐景臺場景下,單集群磁盤緩存容量達到 10 TB。在使用 Doris 替換 Presto 的過程中,針對緩存的時效性和一致性進行了優化,這不僅提高了查詢性能和穩定性,還有效降低了對 Hive Metastore 和 HDFS 的訪問壓力。

  • 提升數據緩存命中率: Doris 數據緩存屬于本地緩存,采用一致性哈希算法確保對相同數據文件的請求被發送到同一個節點,從而提升緩存命中率。在豐景臺場景中,緩存命中率高達 96%
  • 單查詢文件列表共享: 在需要實時感知 Hive 分區文件變化的場景中,關閉了 Doris 的全局分區文件列表緩存,這意味著每次查詢需通過 List 操作從 HDFS 獲取文件列表。為此,Doris 進行了優化。例如在同一查詢中對同一張表的子查詢時,進行 Union 或自關聯操作,子查詢間可以共享文件列表。這使得查詢規劃性能數倍提升,并降低了對 HDFS 的請求壓力。

基于 Doris 的云產品改造

Doris 除了在豐景臺場景廣泛應用之外,順豐科技正在基于 Doris 進行內部云產品改造,面向順豐內部提供按需的 Doris 集群服務。當前正進行 Doris 容器化部署的實踐,通過容器化的方式, 提供更小規格的資源供業務選擇,實現按需使用。

以下為內部云上 Doris 產品圖以及部分管理頁面展示:

基于 Doris 的云產品改造.png

基于 Doris 的云產品改造-2.png

基于 Doris 的云產品改造-3.png

應用層主要分為兩部分:

  • 面向用戶: 用戶能夠在頁面上進行集群申請操作,該申請流程會自動接入內部計費體系。在完成集群申請后,用戶可在頁面上進行查詢以及查看監控、日志,實施庫表授權等相關自助操作,還可通過頁面針對所在的慢查詢進行分析等。
  • 面向運維: 運維人員可以對所有資源進行管理,諸如存儲空間、集群等。同時,還能夠對集群進行版本升級以及通用模版配置修改等多種操作,從而便于運維人員在線上對故障進行快速處理,以保障云上集群的服務質量。

順豐科技期望在 2025 年全面完成 Doris 的平臺化建設,推動 Doris 產品更廣泛在內部應用。

結束語

01 業務收益

目前,順豐的臨時查詢業務、豐景臺報表業務場景已從 Presto 100% 切換到 Doris 集群中,日均查詢量超過 100W。

  • 查詢性能提升 3 倍: P95 性能降低到 20 秒以內,提升近 3 倍。大于 50s 的查詢由 8% 降低至 1.5%,小于 10s 的查詢比例由 72% 提升至 88%
  • 硬件資源節省 48%: 將 Presto 的上萬核規模降低至 Doris 的數千核規模,實現了約 48% 的資源節省

02 未來規劃

除了湖倉分析場景,Doris 在日志分析和實時報表分析中表現同樣出色。順豐科技正與 Doris 社區、飛輪科技團隊合作,持續推進 Doris 在內部的業務拓展。

  • 完善穩定性及兼容性: 今年將全面下線 Presto 服務,繼續完善 Doris 集群穩定性,并增強對 Presto SQL 的兼容性。同時引入 Delta Lake 替換 Hive 格式,驗證 Doris 3.0 對 Delta Lake 的支持(Doris 計劃在 3.1 版本中增強對 Delta Lake 的讀取能力)。
  • 日志及半結構化場景應用: Doris 當前已在多個企業的日志及半結構化數據分析場景成功落地,順豐也在嘗試用 Doris 替換 Elasticsearch,簡化更多數據平臺的組件,構建統一數據分析技術棧。
  • 嘗試存算分離架構: 計劃引入 Doris 3.0 所支持的存算分離架構,不僅提升多租戶彈性能力,還能支持冷數據動態備份,降低用戶存儲成本。
  • Doris 集群運維: 隨著 Doris 在順豐內部的逐漸鋪開,需要更完善的工具來運維 Doris 集群或診斷線上問題。順豐正在推動 Doris 社區提供更加完善的 SQL 診斷工具,如可視化的 Query Profile 分析能力、慢 SQL 診斷優化工具等。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/80162.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80162.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/80162.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何在Jmeter中調用C程序?

在JMeter中調用C語言程序可以通過以下幾種方式實現: 方法一:使用OS Process Sampler JMeter的“OS Process Sampler”可以用來調用外部程序,包括C語言編寫的可執行文件。 步驟: 準備C語言程序: 編寫C語言代碼并編譯…

python 中的單例

在 Python 里,單例模式指的是一個類僅有一個實例,并且提供一個全局訪問點來獲取該實例。下面為你介紹幾種實現單例模式的常見方法。 1. 使用模塊 在 Python 里,模塊天然就是單例模式。當模塊被導入時,Python 會對其進行一次加載…

Linux58 ssh服務配置 jumpserver 測試雙網卡 為何不能ping通ip地址

判斷為NAT模式網卡 能ping 通外網 ens34為僅主機模式網卡 [rootlocalhost network-scripts]# ip route show default default via 10.1.1.254 dev ens33 proto static metric 100 10.0.0.0/8 dev ens33 proto kernel scope link src 10.1.1.37 metric 100 11.0.0.0/8 dev…

web 自動化之 selenium+webdriver 環境搭建及原理講解

文章目錄 一、web 自動化測試學習說明二、什么 web 自動化測試三、selenium 簡介四、web自動化測試環境搭建五、web 自動化測試第一個腳本六、selenium 原理及源碼講解 一、web 自動化測試學習說明 進階 web 自動化測試學習:掌握 python 編程基礎 二、什么 web 自…

Linux 網絡命名空間:從內核資源管理到容器網絡隔離

1. 網絡命名空間是什么? 網絡命名空間(Network Namespace) 是 Linux 內核提供的一種網絡資源隔離機制,用于為進程或容器創建完全獨立的網絡環境。它并非物理或虛擬的網絡接口(如網卡、veth pair 等),而是一個虛擬容器,包含以下資源的獨立實例: 網絡接口(物理或虛擬)…

SQL知識點總結

總結的知識點主要來源于前段時間在牛客刷SQL題目中遇到的錯誤 目錄 1.WHERE字句不能與高級函數連用 2.去重——distinct 3.不等于某個值 4.查多個范圍內的值 5. 升/降序排序 6.占位符 7.統計某類別總數計算平均值 8.合并查詢——UNION (ALL) 9…

【軟考-高級】【信息系統項目管理師】【論文基礎】采購管理過程輸入輸出及工具技術的使用方法

采購管理概念 項目采購管理包括從項目團隊外部采購或獲取所需產品、服務或成果的各個過程。項目采購管理包括編制和管理協議所需的管理和控制過程,例如合同、訂購單、協議備忘錄(MOA)和服務水平協議(SLA)。 采購管理…

C++ 手寫一個內存池

內存池是一種內存管理技術,它預先分配一大塊內存,之后將其按需分割成多個小塊供程序使用。下面將詳細闡述它的好處以及適用場景。 內存池的好處 減少內存碎片:在動態內存分配時,頻繁地分配和釋放不同大小的內存塊,會…

LeetCode 3341.到達最后一個房間的最少時間 I:Dijkstra算法(類似深搜)-簡短清晰的話描述

【LetMeFly】3341.到達最后一個房間的最少時間 I:Dijkstra算法(類似深搜)-簡短清晰的話描述 力扣題目鏈接:https://leetcode.cn/problems/find-minimum-time-to-reach-last-room-i/ 有一個地窖,地窖中有 n x m 個房間…

學習Linux的第四天

今天我們來學習Linux的網絡配置,以及鏈表的知識開個小頭 三種網絡配置模式 橋接模式(用的最多) 2.Nat模式 3. 僅主機模式(Nat模式的功能外,只能在局域網通信,不能訪問外網) 橋接模式&#xf…

【 window.addEventListener(‘message‘, handleMessage)無效的問題】

在react native加載中可能出現 window.addEventListener(‘message’, handleMessage)無效,無法監聽到在react-native-webview中通過postMessage發送的消息,可以通過下面的方法來處理 window.addEventListener(message, handleMessage);document.addEven…

css識別\n換行

在CSS中,\n 通常不會被識別為換行符。如果你希望在CSS中實現換行效果,可以使用以下幾種方法: 使用 white-space 屬性: 設置 white-space: pre 或 white-space: pre-wrap,這樣文本中的換行符 \n 會被保留并顯示為換行。…

電容知識小結

1.同樣是電容,1uf的陶瓷電容和1uf的鋁電解電容是不一樣的; 2.實際的電容等效為ESR C ESL;ESR等效電阻和ESL等效電感; 3.鋁電解電容,瓷片電容和鉭電容。 4.電容是容納和釋放電荷的電子器件; 5.電容的工作:…

[逆向工程]什么是HOOK(鉤子)技術(二十一)

[逆向工程]什么是HOOK(鉤子)技術(二十一) HOOK(鉤子)是一種系統級或應用級的消息攔截與處理機制,廣泛用于監控、修改或增強程序行為。其核心思想是在特定事件(如鍵盤輸入、函數調用…

java后端知識點復習

# 復習匯總 ### 🧑?💻 User java關于高并發下的銀行轉賬問題,根據具體的例子來講解清楚 --- ### 🤖 Assistant --- ### 🧑?💻 User java關于高并發下的銀行轉賬問題,根據具體的例子來講…

PostgreSQL安裝與升級cron插件

cron插件是PostgreSQL數據庫一個好用的定時任務管理的插件。 注:以下命令均在debian linux bookworm版本系統上驗證通過。 apt安裝cron插件 #獲取軟件包驗證的公鑰 wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - #…

66、微服務保姆教程(九)微服務的高可用性

微服務的高可用性與擴展 服務的高可用性 集群搭建與負載均衡。服務的故障容錯與自愈。分布式事務與一致性 分布式事務的挑戰與解決方案。使用 RocketMQ 實現分布式事務。微服務的監控與可觀測性 metrics 和日志的收集與分析。sentinel 的監控功能。容器化與云原生 將微服務部署…

6. HTML 錨點鏈接與頁面導航

在開發長頁面或文檔類網站時,錨點鏈接(Anchor Links)是一個非常實用的功能。通過學習 HTML 錨點技術,將會掌握如何在同一頁面內實現快速跳轉,以及如何優化長頁面的導航體驗。以下是基于給定素材的學習總結和實踐心得 一、什么是錨點鏈接? 錨點鏈接(也稱為頁面內鏈接)允…

【iOS】源碼閱讀(三)——內存對齊原理

文章目錄 前言獲取內存大小的三種常用方式sizeofclass_getInstanceSizemalloc_size 總結 前言 之前學習alloc相關源碼,涉及到內存對齊的相關內容,今天筆者詳細學習了一下相關內容并寫了此篇博客。 獲取內存大小的三種常用方式 獲取內存大小的方式有很多…

新手學編程前端好還是后端

在當今數字化的時代,編程成為了一項備受追捧的技能。對于那些剛剛踏入編程世界的新手來說,常常會面臨一個重要的抉擇:是選擇前端開發,還是后端開發?這就像是站在一個分岔路口,每一條路都充滿了未知和機遇。…