億級使用者背後的位元組跳動雲原生計算最佳實踐

語言: CN / TW / HK

位元組跳動的大資料業務和底層運算能力近年來發展迅速,本文介紹了位元組跳動在流式計算和批式計算方面的重大演進以及最佳實踐。

網際網路時代資料出現爆發式增長,數字化、實時化的趨勢也明顯加快。基於資料驅動的業務場景不斷湧現,無一不在加速著大資料的繁榮發展。而隨著雲原生概念的興起,大資料技術產品逐步迭代升級,雲原生大資料技術產品開始引領產業變革的浪潮。

位元組跳動大資料業務背景

從 2017 年起,位元組跳動陸續推出多款廣為人知的熱門應用,如抖音、今日頭條、西瓜視訊、剪映、番茄小說、懂車帝等。應用形態從圖文、點播,逐步走向更具實時化的直播、實時音視訊。海量的資料規模、愈加複雜的實時場景使得各大業務對位元組跳動底層運算能力的要求不斷提高。

image.png

位元組跳動業務的資料儲存和日誌規模每日已達到 EB 級別

實時推薦峰值每秒達到百萬次

以抖音的實時推薦為例。系統需要從億萬級別的內容庫中選出使用者可能感興趣的內容,運用複雜的模型對內容進行打分排序,再通過廣告系統的處理,最後呈現給使用者,整個過程需要在 300 毫秒內完成。這就對背後的計算能力提出了很高的要求,只有龐大的計算資源和極致的效能優化,才能達到這一業務需求。

雲原生技術在位元組跳動的敏捷迭代和創新的背後發揮了重要的作用,也正是這項關鍵的技術讓位元組跳動可以在 27 天內完成央視春晚紅包專案的備戰。位元組跳動的大資料生態和雲原生技術從早期的獨立發展,到後來的大規模在離線混部, 再到今天的融合排程,大資料已經完全融入到雲原生的生態中。

位元組跳動雲原生計算髮展歷程

流式計算引擎

位元組跳動的流式計算引擎經歷了由 Storm/JStorm 完全替換為 Flink 的演進。

在 2017 年以前,位元組跳動一直在使用 Storm/JStorm 框架作為流式計算引擎。但隨著業務的不斷髮展,Storm 不支援 Exactly Once、缺少 SQL 以及狀態的支援、運維比較複雜、穩定性不高等缺點愈加凸顯。

經過一系列調研,2017 年中,位元組跳動基礎架構團隊正式開始嘗試使用 Flink 作為流式計算引擎。

流式計算 Flink 引擎的高速發展

由於推薦系統和線上服務的大規模應用,位元組跳動早期的技術體系主要是以 Python 為主。為了更好地實現生態對接,基礎架構的工程師們在底層計算引擎上封裝了一套 Python 的介面,各業務作業通過 Python 框架使用流式計算引擎。

得益於 Python 框架的存在,底層引擎從 JStorm 變更為 Flink 的工作得以在業務使用者無感知的情況下完成,即使用者仍然可以使用同樣的 API 來實現自己的業務邏輯。在這個過程中還主要解決了兩個問題:

  • 通過 SmartResources,防止資源空置和浪費。早期的流式計算引擎使用 YARN 作為排程系統,而從 JStorm 遷移而來的業務使用者對設定 CPU 和 Memory 沒有概念。為了保障作業的穩定執行,業務使用者往往傾向於設定很大的資源量,這也就導致非常大的資源浪費。SmartResources 可以通過作業歷史和當前的執行狀況,自動調整 Container CPU 和記憶體的實際資源使用量,這在防止資源浪費上能夠提供很大的收益。
  • 通過單點故障重啟,解決大規模模型訓練場景下的作業重啟問題。Flink Exactly Once 的特性決定了任何一個 Worker 失敗都會導致整個作業的重啟。但在大規模模型訓練場景下,重啟時間對線上效果的影響將會被無限放大。在此背景下,基礎架構的工程師們修改了 Flink DAG 的 Failover 實現,使得在特定的 Topology 下,單 Task 失敗可以只重啟單個 Task,從而實現了非常短的時間內的故障恢復。

到 2019 年,流式計算引擎已經完成了 JStorm 作業的 100%遷移。基於開源社群對 SQL 能力的增強,基礎架構流式計算團隊開始在公司內部大力推廣 Flink SQL,Flink 的應用場景在位元組內部得到不斷拓展,特別是與直播、廣告等業務團隊一起共同探索流批一體應用場景。此外,流式計算團隊開始在公司內部推動 Flink Batch 的落地,資料 Binlog 同步等業務場景的支援,目前每天大概有 10w+ Flink Batch 作業執行。

訊息處理峰值 90 億 QPS

圖片

截至目前,位元組跳動業務流式作業數量已經達到 4 萬個,其中 SQL 作業佔 30%,隨著 Flink SQL 在位元組內部的推行,這一佔比還將會繼續擴大。而在這 4 萬個作業中,已有 1.8 萬個作業開啟了 Checkpoint,高峰流量吞吐達到 600GB/s。在資源層面,目前業務平均使用的 Flink 資源已經超過 400 萬核。

可以想象一下,每當今日頭條、抖音等軟體在夜晚迎來使用高峰時,位元組跳動內部的實時計算引擎也隨之進入高速運轉。據統計,每晚 Flink 作業處理訊息的 QPS 可達到 90 億。

批式計算引擎

長期以來,位元組跳動批式計算引擎 Spark 支援構建了公司內絕大部分的資料倉庫。發展至今,Spark 作業數已達 90W,涵蓋 SQL/Java/Scala/Python 多種語言。資源核數達 500 萬 Core,在這其中包括了大量的大規模在離線混部資源。

在 Spark 引擎不斷髮展的過程中,位元組批式計算團隊的工程師們同樣遇到了諸多挑戰。

  • 如何提升 Shuffle 穩定性以保障 SLA

在大規模作業下,開源 ExternalShuffleService 的實現機制容易出現大量隨機讀導致的磁碟 IOPS 瓶頸, Shuffle Fetch 的請求積壓等問題,從而致使運算過程中經常出現 Stage 重算甚至作業失敗,繼而引起資源使用的惡性迴圈,嚴重影響 SLA。對此,團隊提出了 Cloud Shuffle Service 解決方案,解決了 ESS 機制上的一些缺陷,同時獨立部署服務,更好地對接更多混部資源。

  • 如何降低運維和資源成本

伴隨著業務需求的不斷髮展,公司內部批式計算作業數量也在不斷增加,同時存在資源利用率低,工單數量大等問題。由此,團隊開始考慮通過自動化方案 BatchBrain 來解決。BatchBrain 可提供異常作業(慢作業、失敗作業)的自動診斷,以及推薦引數,從而達到降低成本的目的。

位元組跳動業務驗證下的行業標準解決方案

經過位元組跳動的大規模業務驗證,當前火山引擎正式推出流式計算 Flink 版批式計算 Spark 版兩款雲上產品。

流式計算 Flink 版

依託於位元組跳動在業內最大規模實時計算叢集實踐。火山引擎流式計算 Flink 版基於火山引擎容器服務(VKE/VCI),提供 Serverless 極致彈性,是開箱即用的全託管流式計算引擎。在 100%相容開源 Flink 的前提下,對產品功能也進行了企業級增強。

  • 開發效率提升。流式計算 Flink 版支援運算元級別 Debug 輸出、Queryable State、Temporal Table Function DDL,在開發效率上對開源版本 Flink 有顯著提升。
  • 可靠性提升。流式計算 Flink 版針對單個 Task 進行 Checkpoint,提高了大併發下的 Checkpoint 成功率。單點任務恢復和節點黑名單機制功能,保障了對故障節點的快速響應,避免業務整體重啟。

圖片

流式計算 Flink 版 - 產品功能架構

典型的多維實時場景支援

當前業界通常把 Flink 引擎定義為實時場景下的行業標準解決方案。同樣,經過企業級功能增強後的火山引擎流式計算 Flink 版可以支援典型的多維實時場景。

  1. 實時 ETL 場景。提供豐富的內建 Connector,全面支援各種資料來源及儲存,企業級 SQL 能力高效構建實時資料處理平臺;
  2. 實時監控場景。可提供狀態管理等支援,內建 CEP 複雜事件處理模組,協助企業簡化規則告警配置、降低監測平臺維護成本;
  3. 實時數倉場景。支援海量資料實時處理和高併發實時入倉,協助企業建立數字化運營體系,為經營決策提供實時資料支援;
  4. 實時推薦場景。具備實時樣本拼接能力,通過實時模型訓練,建立實時增量模型,為客戶提供更加精準和實時的推薦能力。

業內最大規模實時計算叢集最佳實踐

在位元組跳動內部,抖音/頭條/穿山甲等業務的廣告推薦以及模型訓練都深度使用了流式計算 Flink 版提供的流式計算引擎能力。

在流式訓練方面,流式計算 Flink 版支援資料預處理、樣本拼接、特徵和穩定性指標的更新,為推薦效果的實時性和穩定性提供了有力保障。

在模型訓練方面,流式計算 Flink 版支撐了推薦演算法模型的核心訓練任務,幫助模型及資料流快速迭代,提升模型穩定性,從而更好地協助業務團隊助力廣告主投放與媒體變現能力的增長。

值得一提的是,火山引擎流式計算 Flink 版支援雲中立模式,支援公共雲、混合雲及多雲部署,全面貼合企業上雲策略。目前產品正在公測中,歡迎申請試用:

圖片

批式計算 Spark 版

火山引擎批式計算 Spark 版支援了今日頭條、抖音的超大規模批計算,提供面向深度學習場景的深度優化。在 100%相容 Apache Spark 的同時,實現企業級功能增強,配備火山引擎獨有的 Cloud Shuffle Service 以保障 Spark 的作業效能和穩定性。批式計算 Spark 版提供租戶級端到端安全隔離,具備基於火山引擎 VKE/VCI 的 Serverless 極致彈性擴充套件能力。

圖片

批式計算 Spark 版 - 產品功能架構

覆蓋流批一體和深度學習場景

  • 流批一體資料處理場景。火山引擎批式處理 Spark 可提供 Streaming/Batch 流批一體的資料處理能力,同時提供結構化、半結構化資料支援,支援豐富的上下游資料來源與資料儲存。
  • 雲原生資料湖場景。通過位元組增強版 Iceberg 提供服務化的雲原生資料湖平臺:支援 Schema 校驗、資料 Time-Travel、小檔案自動優化、 ACID 事務性、Merge on Read 等功能。
  • 深度學習場景。提供火山引擎自研通用深度學習框架和 Feature Store 服務,高效支援大規模分散式深度學習訓練。端到端大資料 AI 一體化服務,提供一站式大資料+AI 解決方案。

位元組跳動批式計算應用的最佳實踐

目前位元組跳動內部資料倉庫都是基於 Spark 來構建,包括今日頭條、抖音等業務的超大規模批計算作業。火山引擎批式計算 Spark 承載了位元組跳動內部大部分離線 ETL 的海量資料處理任務,幫助內部使用者高效構建離線數倉;同時也給 BI 分析師等業務方提供基於 Spark 的 Ad-Hoc 查詢服務。

在穿山甲等相關業務的機器學習場景下,特徵工程是機器學習領域中重要一環。火山引擎 Spark 承擔了特徵提取、離線調研、訓練預處理等相關工作。

火山引擎批式計算 Spark 版同樣支援公共雲、混合雲及多雲部署。公測申請請點選:

圖片

瞭解更多火山引擎雲原生計算混合雲相關資訊,可傳送郵件至 [email protected]

瞭解更多雲原生計算資訊,歡迎掃碼加入飛書【雲原生計算技術交流群】~

👇 雲原生計算技術交流群 👇

圖片