主頁 > 資料庫 > 揭秘位元組跳動云原生Spark History 服務 UIService

揭秘位元組跳動云原生Spark History 服務 UIService

2022-03-15 07:50:31 資料庫

本文是位元組跳動資料平臺資料引擎SparkSQL團隊針對 Spark History Server (SHS) 的優化實踐分享,


文 | 位元組跳動資料平臺—資料引擎—SparkSQL團隊

在位元組跳動內部,我們實作了一套全新的云原生 Spark History 服務—— UIService,相比開源的 SHS,UIService 存盤占用和訪問延遲均降低 90% 以上,目前 UIService 服務已經在位元組跳動內部廣泛使用,并且作為火山引擎湖倉一體分析服務 LAS(LakeHouse Analytics Service)的默認服務,
LAS

業務背景

開源 Spark History Server 架構

為了能夠更好理解本次重構的背景和意義,首先對原生 Spark History Server 原理做個簡單的介紹,

開源 Spark History Server 流程圖

Spark History 建立在 Spark 事件(Spark Event)體系之上,在 Spark 任務運行期間會產生大量包含運行資訊的SparkListenerEvent,例如 ApplicationStart / StageCompleted / MetricsUpdate 等等,都有對應的 SparkListenerEvent 實作,所有的 event 會發送到ListenerBus中,被注冊在ListenerBus中的所有listener監聽,其中EventLoggingListener是專門用于生成 event log 的監聽器,它會將 event 序列化為 Json 格式的 event log 檔案,寫到檔案系統中(如 HDFS),通常一個機房的任務的檔案都存盤在一個路徑下,

在 History Server 側,核心邏輯在 FsHistoryProvider中,FsHistoryProvider 會維持一個執行緒間歇掃描配置好的 event log 存盤路徑,遍歷其中的 event log 檔案,提取其中概要資訊(主要是 appliaction_id, user, status, start_time, end_time, event_log_path),維護一個串列,當用戶訪問 UI,會從串列中查找請求所需的任務,如果存在,就完整讀取對應的 event log 檔案,進行決議,決議的程序就是一個回放程序(replay),Event log 檔案中的每一行是一個序列化的 event,將它們逐行反序列化,并使用 ReplayListener將其中資訊反饋到 KVStore 中,還原任務的狀態,

無論運行時還是 History Server,任務狀態都存盤在有限幾個類的實體中,而它們則存盤在 KVStore中,KVStore是 Spark 中基于記憶體的KV存盤,可以存盤任意的類實體,前端會從KVStore查詢所需的物件,實作頁面的渲染,

痛點

存盤空間開銷大

Spark 的事件體系非常詳細,導致 event log 記錄的事件數量非常大,對于UI顯示來說,大部分 event 是無用的,并且 event log 一般使用 json 明文存盤,空間占用較大,對于比較復雜或時間長的任務,event log 可以達到幾十GB,位元組內部7天的 event log 占用約 3.2 PB 的 HDFS 存盤空間,

回放效率差,延遲高

History Server 采用回放決議 event log 的方式還原 Spark UI,有大量的計算開銷,當任務較大就會有明顯的回應延遲,回應延遲是指從用戶發起前端訪問到頁面 UI 完全渲染出來的等待時長,作業結束之后,用戶可能要等十幾分鐘甚至半小時才能通過 History Server 看到作業歷史,而大型作業結束后,用戶往往希望盡快看到作業歷史從而根據作業歷史進行問題診斷和作業優化,用戶等待 UI 完成渲染時間過長,非常影響用戶體驗,

擴展性差

如上所述,History Server 的FsHistoryProvider在回放決議檔案之前,需要先掃描配置的 event log 路徑,遍歷其中的 event log,將所有檔案的元資訊加載到記憶體中,這使得原生服務成為了有狀態的服務,因此每次服務重啟,都需要重新加載整個路徑,才能對外服務,每個任務在完成后,也需要等待下一輪掃描才能被訪問到,

當集群任務數量增多,每一輪掃描檔案的耗時以及元資訊記憶體占用都會增加,這也要求服務有越來越高的資源配置,如果通過拆分 event log 路徑來縮小單實體的壓力,需要對路由規則進行改造,運維難度增大,目前,位元組跳動內部通過增加 UIService 實體就可以方便的進行水平擴展,

非云原生

Spark History Server 并非是云原生的服務,在公有云場景下改造和維護成本高,首先公有云場景需要進行租戶資源隔離,其次公有云場景下不同用戶的 workload 差異很大,不同用戶任務量有數量級的差別,會出現大量長尾作業,為每個用戶單獨部署 History Server 計算和存盤成本過大且不均衡,而部署統一的 History Server 無法做到資源隔離,一旦出現問題影響較多用戶,兩種方式運維成本都會很高,火山引擎湖倉一體分析引擎 LAS(Lakehouse Analytics Service),提供了云原生的 UIService,可以有效解決上述問題,

UIService

方案

為了解決前面的三個問題,我們嘗試對 History Server 進行改造,
如上所述,無論運行中的 Spark Driver 還是 History Server,都是通過監聽 event,將其中包含的任務變化資訊反映到幾種 UI 相關的類的實體中,然后存入KVStore供 UI 渲染,也就是說,KVStore中存盤著 UI 顯示所需的完備資訊,對于 History Server 的用戶來說,絕大多數情況下我們只關心任務的最終狀態,而無需關心引起狀態變化的具體 event,
因此,我們可以只將 KVStore 持久化下來,而不需要存盤大量冗余的 event 資訊,此外,KVStore原生支持了 Kryo 序列化,性能明顯于 Json 序列化,我們基于此思想重寫了一套新的 History Server 系統,命名為 UIService,

UIService框架圖

實作

UIMetaStore
KVStore中和 UI 相關的所有類實體,我們將這些類統稱為 UIMeta 類,具體包括 AppStatusStore和SQLAppStatusStore中的資訊(如下所列),我們定義一個類 UIMetaStore來抽象,一個UIMetaStore即一個任務所有 UI 資訊的集合,
UIMetaStore所包含資訊:

#AppStatusStore
org.apache.spark.status.JobDataWrapper
org.apache.spark.status.ExecutorStageSummaryWrapper
org.apache.spark.status.ApplicationInfoWrapper
org.apache.spark.status.PoolData
org.apache.spark.status.ExecutorSummaryWrapper
org.apache.spark.status.StageDataWrapper
org.apache.spark.status.AppSummary
org.apache.spark.status.RDDOperationGraphWrapper
org.apache.spark.status.TaskDataWrapper
org.apache.spark.status.ApplicationEnvironmentInfoWrapper
#SQLAppStatusStore
org.apache.spark.sql.execution.ui.SQLExecutionUIData
org.apache.spark.sql.execution.ui.SparkPlanGraphWrapper

UIMetaStore 還定義了持久化檔案的資料結構,結構如下:

4-Byte Magic Number: "UI_S"
----------- Body ---------------
4_byte_length_of_class_name | class_name_str1 | 4_byte_length | serialized_of_class1_instance1
4_byte_length_of_class_name | class_name_str1 | 4_byte_length | serialized_of_class1_instance2
4_byte_length_of_class_name | class_name_str2 | 4_byte_length | serialized_of_class2_instance1
4_byte_length_of_class_name | class_name_str2 | 4_byte_length | serialized_of_class2_instance2
  • Magic Number用于檔案型別標識校驗,
  • Body 是 UIMetaStore 的主體資料,使用連續存盤,每一個 UI 相關的類實體,會序列化成四個片段:類名長度(4 byte long 型別)+ 類名(string 型別)+ 資料長度(4 byte long 型別)+ 序列化的資料(二進制型別),在讀取時順序讀取,每個元素先讀取長度資訊,再根據長度讀取后續相應資料進行反序列化,
  • 使用 Spark 原生的KVStoreSerializer序列化,可以保證前后兼容性,

UIMetaLoggingListener

類似于EventLoggingListener,為 UIMeta 開發了專用的 Listener —— UIMetaLoggingListener,用于監聽事件,寫 UIMeta 檔案,
和EventLoggingListener進行對比:EventLoggingListener每接受一個 event 都會觸發寫,寫的是序列化的 event;而UIMetaLoggingListener只會被特定的 event 觸發,目前是只會被stageEnd,JobEnd 事件觸發,但每次寫操作是批量的寫,將上一階段的UIMetaStore的資訊完整地持久化,
做一個類比,EventLoggingListener好比流式,不斷地追加寫,而 UIMetaLoggingListener類似于批式,定期將任務狀態快照下來,

UIMetaProvider

替換原先的FsHistoryProvider,主要區別在于:

將讀取 event log 檔案和回放生成KVStore的流程改為讀取UIMetaFile,反序列化出UIMetaStore,

去掉了FsHistoryProvider的路徑掃描邏輯;每次 UI 訪問,根據 appid 和路徑規則,直接去讀取 UIMetaFile 決議,這使得 UIService 無需預加載所有檔案元資訊,不需要隨著任務數量增加提高服務器配置,方便了水平擴展,

優化

避免重復寫

由于每個 stage 完成都會觸發寫 UIMeta 檔案,這樣對于 UIMeta 的很多元素,可能會出現重復持久化的情況,增加寫入耗時和檔案的大小,因此我們在UIMetaLoggingListener內部維護了一個 map,記錄已經被序列化的實體,在寫 UIMeta 檔案時進行過濾,只寫沒有寫過或者資料發生改變的元素,這樣可以杜絕大部分的寫冗余,

此外,開發期間發現,占用空間最大的是task級別資訊TaskDataWrapper,在一個 stage 完成觸發寫時,可能會將仍處于 RUNNING 狀態的 stage 的 task 序列化下來,這樣當 RUNNING 的 stage 完成時,task 資訊會再被寫一次,也會造成資料冗余,因此我們對序列化TaskDataWrapper資訊進行過濾,在 stage 結束時只持久化狀態是 Completed 的 task 資訊,

支持回退到 event log

鑒于 UIService 在初期有存在問題的風險,我們還支持了回退機制,即訪問一個任務的 UI,優先嘗試走 UIService 的路徑:決議 UIMeta 檔案,如果 UIMeta 檔案不存在或者決議報錯,會回退到讀 event log 檔案的路徑,避免 UI 訪問失敗,同時還支持將 event log 檔案轉換成 UIMeta 檔案,這樣下一次呼叫時就可以使用 UIService,這個功能保證我們遷移程序的平滑,

收益

存盤收益

線上測驗顯示存盤平均減少85%,總量減少92.4%,
下圖顯示了某機房 event log 和 UIMeta 存盤占用監控,可以看到 UIMeta 較 event log 在存盤量上有數量級的減少,目前位元組內部7天的 event log 占用存盤空間 3.2 PB,改用 UIMeta 后,空間占用只有350TB,
憑借 UIService 的存盤優勢,我們可以保留更長時間的日志資訊,有助于歷史分析,問題復盤,目前我們已從保留7天日志提高到了保留30天,并可以根據需求增大保留時間,

某機房 event log/UIMeta HDFS存盤監控對比

訪問延遲收益

訪問延遲:平均縮短 35%,PCT90/95/99 分別減少 84.6%/90.8%/93.7%

訪問延遲百分位分布
如下圖所示,UIService 的 UI 訪問延遲整體較比 event log 向左移,長尾任務明顯減少,

訪問延遲分布圖

架構收益

去掉了原生 History Server 遍歷路徑,預加載的耗時環節,消除從任務完成到 History Server 可訪問的時間間隔,從原本的平均 10min 左右降低到秒級,任務完成即可立即對外提供服務,同時使 History Server 可以水平擴展,能更好應對未來任務量增長帶來的挑戰,

目前,位元組跳動內部我們通過增加 UIService 實體就可以方便的進行橫向擴展,在火山引擎湖倉一體分析服務 LAS 中,我們也基于 UIService 實作了支持租戶訪問隔離,云原生的,可按需伸縮的 Spark History Server,

點擊了解火山引擎湖倉一體分析服務LAS

歡迎關注位元組跳動資料平臺同名公眾號

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/443496.html

標籤:其他

上一篇:Impala的使用

下一篇:JavaWeb 07_創建web專案連接MySQL實作注冊登錄功能

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more