導讀:隨著快成物流的大宗商品產業鏈的不斷發展,貨運軌跡規劃和實時數據分析的需求日益迫切,為了保障數據報表更新、用戶畫像圈選與物流軌跡實時更新等大數據核心系統性能,快成物流引入 Apache Doris 實時數倉升級了大數據算法平臺,目前已經部署在 2 套生產集群,存儲數據總量達百億規模,覆蓋實時數倉、BI 多維分析、用戶畫像、貨運軌跡信息系統等業務場景。
山西快成物流科技有限公司(簡稱“快成物流”)是一家以新一代信息技術為核心的“互聯網 + 大宗物流產業鏈生態”的平臺型科技企業,網絡貨運排名躋身全國前三。快成物流深耕“讓大宗商品流通更美好”的企業使命,依托數字技術連接大宗物流全產業鏈,向產業參與主體提供全鏈路一體化物流解決方案,為行業降本、增效、提質持續助力。
目前快成物流服務卡車司機累計已破百萬,貨主數萬家,在業務高峰期,單日新增數據量達到千萬級別,大數據系統的數據處理能力面臨巨大的挑戰。快成物流已擁有多個數據業務線,其中核心業務包括:
- 網絡貨運平臺: 服務數萬貨主與百萬卡車司機的大宗商品物流運輸平臺,業務流程復雜,實體貨物種類多、服務周期長,對數據實時性要求高、數據分析維度復雜。
- 快樂駕: 智慧物流車載終端系統,包括軌跡監控、安全駕駛等。
- 快樂購: 后市場消費服務平臺,包括加油加氣、卡車零件銷售等電商服務。

隨著業務規模的不斷擴大,快成大數據算法平臺在支撐上述業務產生海量數據存儲的同時,也需應對多種多樣的數據應用需求,包括基礎業務支撐、BI 報表分析、可視化大屏、用戶畫像、智能風控、精準營銷、AB 實驗以及合規性監測等,這也對大數據平臺提出了更高的技術要求:
- 極速數據處理:平臺需要支持高吞吐量的復雜數據分析,在海量數據中快速準確地提取有價值的信息。
- 點查性能強:大數據平臺需實現高 QPS 點查能力,確保在海量數據中快速定位并查詢特定信息,以滿足用戶對數據實時性的高要求。
- 運維管理成本低:在保障數據處理效率和質量的同時,大數據平臺期望通過自動化、智能化的運維手段降低運營成本。
- 運行穩定:系統需要高可靠、高可用,為業務持續發展提供有力保障。
業務訴求與技術選型
隨著用戶對數據分析的實時性與時效性需求的日益提升,快成物流在早期進行 OLAP 數據庫技術選型時,核心訴求是尋找一款基于 MPP 架構、高性能、實時的分析型數據庫。當時考察選型的數據庫包括 Kylin、Druid、Doris、ClickHouse 等。經過評估后,我們先選擇了已經擁有一定用戶基礎的 ClickHouse,其在千萬級別的單表處理耗時往往在數秒內,基本滿足業務需求。而此時的 Doris 仍在孵化階段,功能與穩定性尚需時間驗證,我們也在持續關注 Doris 的發版與功能升級,并定期進行性能測試。
隨著業務深度使用,ClickHouse 在查詢性能方面表現較好,幫助我們解決了不少業務問題,但痛點也開始顯露出來:
-
多表 Join 性能有限:ClickHouse 只有 Global Join 和 Local Join,在大表 Join 大表時的場景下,跨節點間數據 Shuffle 時容易導致 Join 性能大打折扣,甚至造成 OOM 。
-
運維成本高:ClickHouse 的擴容縮容操作復雜,目前做不到自動在線操作;配置管理也相對繁瑣,學習成本很高。
與此同時,Apache Doris 的功能正在不斷升級完善, 我們發現 Doris 的多表 Join 能力與運維成本更加符合我們對 OLAP 數據庫的預期,并且能夠很好的解決 ClickHouse 出現的上述痛點,測試環境下的性能表現也十分出色。
經過一段時間的試用后,我們開始逐步替代 ClickHouse,目前快成物流大數據算法平臺的主要 MPP 場景都基于 Doris 提供服務。
基于 Apache Doris 的大數據算法平臺
為支撐快成多種多樣的數據應用場景, 我們團隊自建了相對完善的大數據算法平臺,引入 Doris 后的架構如下:

按照從左至右數據流向,數據處理架構可概括為以下主要環節:
數據源端主要包括來自 MySQL 等業務數據庫的運單數據、物流車終端上報的物聯網數據、埋點日志數據等,在數據采集環節會分別經由 Flink CDC、SeaTunnel、Sqoop 以及 Filebeat 等工具進行數據抽取。在數據清洗計算階段,實時數據會通過 Kafka 采集和 Flink 進行計算并存儲在實時數據倉庫 Doris 中,而離線數據則通過 Spark 進行 ETL 后進入離線數據倉庫 Hive 中。此外,特征數據還會存儲在特征平臺 Feathr 中,隨后在分析建模環節進行數倉分層、建模,構建指標體系和標簽體系,最終服務于數據應用,支持報表生成、BI 分析、業務支撐、調度匹配、風控以及合規等核心業務。
在以上架構中,Apache Doris 擔任了實時數據倉庫的關鍵定位,對上游承接了離線和實時數據的接入、對下游支持了 BI、報表、用戶畫像、風控、營銷等數據應用的查詢分析服務,在快成的大數據技術算法平臺中發揮了至關重要的作用。下文將重點分享 Apache Doris 在快成物流的大數據應用與升級實踐,希望對讀者產生積極的借鑒意義。
Doris 在快成的應用實踐
快成物流的貨運業務復雜度高,業務節點多且鏈路周期較長,實時數倉建設難度較高,加之對接了大量微服務系統,數據庫表較為分散,這使我們在建設實時數倉的過程中,面臨著諸多挑戰:
-
保證復雜實體關系下的數據準確性;
-
提升實時多流 Join 的處理效率;
-
保障數據一致性;
-
平衡數據數量、時效性與算力資源之間的關系。
01 實時數據接入
針對實時數據,我們又細分為實時與近實時兩種情況:
-
毫秒級實時(Real-time):實時數據處理指數據在產生后立即進行處理和響應,無延遲或延遲極小。實時處理對數據的處理速度要求非常高,通常需要在毫秒級別內完成,常用于需要即時反饋和實時決策的場景,例如實時風控等。
-
秒級近實時(Near Real-time):近實時數據處理指數據產生后,經過一定延遲再處理,通常在秒級別內完成。近實時處理常用于對數據的快速分析和決策,例如實時報表生成、數據儀表盤等場景。
對于不同源數據的寫入,Doris 提供了豐富的數據接入擴展工具,包括 Spark Doris Connector、Flink Doris Connector、Seatunnel Doris Sink 等,方便用戶快速從 Hive、MySQL、Kafka 等源端系統中抽取數據并導入 Doris 中。
我們的整庫同步和實時數據接入主要通過 Flink Doris Connector 進行,其依賴于 Flink CDC、Debezium 等技術底層實現。通過偽裝 MySQL 等關系型數據庫的從庫實例,進而實時捕獲到 Binlog(業務庫表的數據變更日志),最后通過 Stream Load 的方式導入到 Doris 庫中。
Flink Doris Connector 封裝的較為易用,無需提前建表,就可以快速將上游業務庫的表結構及數據接入到 Doris 中,輕松實現一鍵整庫同步。其配置文件腳本如下:
<FLINK_HOME>/bin/flink run \
-Dexecution.checkpointing.interval=5s \
-Dparallelism.default=1 \
-c org.apache.doris.flink.tools.cdc.CdcTools \
lib/flink-doris-connector-1.17-1.6.1.jar \
mysql-sync-database \
--database ods \
--table-prefix ods_ \
--mysql-conf hostname=127.0.0.1 \
--mysql-conf username=root \
--mysql-conf password=123456 \
--mysql-conf database-name=test_mysql_db \
--including-tables "tbl1|test_.*" \
--sink-conf fenodes=127.0.0.1:8030 \
--sink-conf username=root \
--sink-conf password=123456 \
--sink-conf jdbc-url=jdbc:mysql://127.0.0.1:9030 \
--sink-conf sink.label-prefix=label1 \
--table-conf replication_num=3

通過 Flink Doris Connector,5 秒內即可將 MySQL 的 CDC 日志采集到 Doris 的 ODS 層中,接著在 Doris 中構建實時數倉的下游層級。數據倉庫分層架構遵循了常見的的四層架構(ODS 貼源層 - DWD 明細層 - DWS 匯總層 - ADS 應用層),以確保數據的高效管理、快速響應和便捷運維。

02 報表服務與BI實踐
面對需要同時處理高并發報表查詢和海量數據分析的場景時,傳統的大數據解決方案已經逐漸顯露不足。我們基于 Doris 重新建設的大數據算法平臺,針對離線與實時數據處理效率進行了深度優化,憑借 Doris 強大的寬表查詢性能與并行數據處理能力,有效促進了數據報表與 BI 分析場景的功能升級與分析效率的大幅提升。
2-1 數據報表分析
實時數據報表屬于數據高并發、大規模特征并存的典型場景,此前系統中使用的 Hive 和 Spark 在處理大規模數據集方面表現出色,然而面對高并發查詢時,處理效率與我們的預期存在較大差距。此外,MySQL 對大規模數據進行查詢時,效率顯著下降,數據報表的更新速度也因此受限。
經測試,Doris 的數據實時寫入和更新能力十分強大,能夠實現快速及時的查詢分析響應。在實時數倉建設階段,我們把離線數據架構下 DIM 維度層、ADS 應用層的數據通過 SeaTunel 寫入了 Doris 中,實現了結果表的查詢加速, 從而實現每秒上萬數量級的 QPS 并發查詢,數據報表更新及時度大大提高。
2-2 BI 即席分析
即席查詢(Ad-Hoc Query)是面向數據分析人員的自助分析應用,因其查詢條件多樣化,對系統的吞吐能力提出了較高的要求。Doris 提供了靈活豐富的 SQL 函數公式,并擁有高吞吐量的計算能力,數據分析師、產品經理等業務人員通過 Metabase(數據探索與可視化工具) + Doris 即可基本滿足 BI 的數據探索需求,大部分查詢響應速度都在秒級完成。
03 用戶畫像實踐
用戶畫像在廣告推薦系統、商業分析、用戶增長、產品設計、數據化運營、精準營銷、量化風控等領域得到廣泛應用,依托于 Doris 強大的計算能力, 團隊構建了快成物流的用戶畫像體系。
3-1 人群畫像圈選
首先,大數據開發人員將離線數倉與實時數倉計算生產的標簽,寫入到 Doris 的標簽表。產品運營通過人群圈選服務動態生成人群圈選 SQL,最后,通過 Doris 實時計算產生結果并返回給用戶。
由于充分利用了 Doris 的 Bitmap 精準去重、倒排索引等特性,在數十個標簽篩選組合條件下可以在亞秒級的返回圈選結果,用戶“所圈即所得”,避免了長時間等待,極大地提高了運營與營銷團隊的工作效率。

3-2 個體畫像查詢
面向客戶的個體畫像需求同樣屬于高并發查詢場景, 如司機個人畫像、風控預警等。Doris 的前綴索引功能,即在排序基礎上實現的根據給定前綴列,能夠輕松支持上萬 QPS,99 分位的查詢延時在 150 毫秒以內,非常適合用戶畫像點查,很好地替代了之前 HBase + Redis 的點查加速方案。
04 軌跡存儲與分析實踐
GIS 地理信息系統(Geographic Information System) 作為物流運輸平臺的核心功能模塊之一, 在車輛軌跡、司機 APP 軌跡等方面有著重要的應用, 例如車輛在途、軌跡預警、線路預警、司機駕駛安全等。平臺有責任與義務在保證司機行車安全的同時,努力降低車主車輛、貨主貨品財產損失的風險。 然而,技術上也給平臺帶來海量軌跡存儲、高性能查詢與分析的硬性指標要求。
另一方面,監管部門也有“五流合一”合規性的政策要求,根據《網絡平臺道路貨物運輸經營管理暫行辦法》,企業至少保存長達 3 年的軌跡數據。Doris 自 2.0 版本開始支持冷熱分離,我們通過在 Partition 級別上設置 Freeze time,將 3 年前的冷數據存儲在類似于 S3 的對象存儲上,從而節省本地的磁盤空間,進而節省存儲成本。
目前公司使用 Doris 支撐了百億規模的軌跡存儲,提供實時在線軌跡回放、軌跡風控預警等能力, 相比于之前 ES 的技術方案,同等規模數據所依賴的存儲資源得到極大幅度節省。
05 湖倉一體實踐
Doris 通過多源數據目錄(Multi-Catalog)功能,支持了包括 Apache Hive、Apache Iceberg、Apache Hudi、Apache Paimon、Elasticsearch、JDBC(MySQL、Oracle、SQLServer) 等主流數據湖、數據庫的連接訪問。我們通過 Multi-Catalog 拓展了外部數據源的邊界,其使用方法也較為簡單, 創建 Hive 數據源的 SQL 語句可參考:
CREATE CATALOG hive PROPERTIES (
'type'='hms',
'hive.metastore.uris' = 'thrift://172.21.0.1:7004'
);
在前文提到的用戶畫像系統中,標簽元數據存儲在 MySQL, 而明細數據存儲在 Doris 中。進行畫像圈選服務時,需要分別在 MySQL 與 Doris 兩個數據庫進行查詢,不僅增加了畫像系統的復雜度,性能也存在很大的優化空間。我們利用數據湖分析的特性,在 Doris 創建畫像元數據的 MySQL Catalog,并規劃了兩種技術方案:
- 使用 SQL Join 語法,直接通過 JDBC 協議關聯 MySQL 中的元數據 (數據還在 MySQL 中);
- 通過
create table as select * from 源表把畫像標簽元數據同步到 Doris 內部,從而加速查詢,然后再通過調度引擎(如 Apache DolphinScheduler)進行周期性調度,
考慮到方式一在批量加載數據時對 MySQL 業務庫可能造成的潛在影響,針對用戶畫像的場景我們最終選擇了方案二。建表語句參考:
-- 從 MySQL 導入到 Doris DIM 臨時表, 默認 3 副本
create table dim.temp_profile_lable_metadata
PROPERTIES("replication_num" = "3")
as select * from jm_bg_platform.kc_data_profile.profile_lable_metadata;
實踐總結與規劃
截至目前,基于 Apache Doris 的大數據算法平臺已經接入了近 10 個物流大數據業務線,部署生產集群 2 套,存儲數據總量達百億級規模,覆蓋實時數倉、BI 多維分析、用戶畫像、貨運軌跡信息系統等業務場景,查詢效率大幅提升,其簡潔的開發架構與經濟的資源存儲方案,為業務與開發人員帶來極大便利與效益增長。
基于上述應用場景,我們總結了 Doris 的核心優勢,具體如下:
-
查詢性能優越: 無論是即席分析場景的多表復雜關聯,還是用戶畫像、特征、實時報表場景的高 QPS 點查,都可以輕松支持;
-
數據湖分析能力強大:可輕松與 Hive、Hudi、JDBC、ES 構建統一語法的聯邦查詢;
-
功能開放:例如 Java UDF 可以復用 Hive UDF,減少重復造輪子;
-
有效降本:運維方面,可以按需彈性擴縮容節省資源,方便集群數據遷移;開發方面,多表關聯便利,不用再頻繁改寫 Join;
在業務實踐環節,我們也記錄了許多生產環境下基于 Doris 的開發經驗,在此與諸位分享:
-
MPP 數據庫在 OLAP 場景雖然兼容 MySQL 協議,但是不建議當作 MySQL 使用,更適用于大批量的數據寫入,而非高并發的單條數據寫入;
-
構建輕量級數倉時,部分場景可以替代 Hive 數倉,尤其是中小規模的數據量并且相對簡單的場景;
-
GIS 物聯網的場景下使用,可以支持存儲 PB 數據級別;
-
分區表支持原子替換,支持對兩個表進行原子的替換操作,不會中斷表提供服務;
后續我們將持續深入使用 Apache Doris 的新版功能,并重點關注擴展以下方面:
-
引入異步物化視圖:Apache Doris 在 2.1 版本推出了基于多表的異步物化視圖,支持透明改寫加速、自動刷新、外表到內表的物化視圖以及物化視圖直查,此外,還可以用于數據倉庫分層建模、作業調度和數據加工等場景。
-
數據一體能力擴展:此前我們曾向社區提議增強數據集成能力,例如通過 JDBC Catalog 從 MySQL 直接同步數據至 Doris,意見已被社區采納并改進完成,后續也期待更多的新功能。
-
增強 GIS 地理信息系統功能:如經緯度距離實時刷新、區域范圍搜索提速;
-
期待整合 AI算法庫:增加例如 Spark ML 類的機器學習算法庫,整合特征平臺與向量數據庫。


