成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spark 3.0 終于支持 event logs 滾動了

大數據 Spark
相信經常使用 Spark 的同學肯定知道 Spark 支持將作業的 event log 保存到持久化設備。默認這個功能是關閉的,不過我們可以通過 spark.eventLog.enabled 參數來啟用這個功能,并且通過 spark.eventLog.dir 參數來指定 event log 保存的地方,可以是本地目錄或者 HDFS 上的目錄,不過一般我們都會將它設置成 HDFS 上的一個目錄。

背景

相信經常使用 Spark 的同學肯定知道 Spark 支持將作業的 event log 保存到持久化設備。默認這個功能是關閉的,不過我們可以通過 spark.eventLog.enabled 參數來啟用這個功能,并且通過 spark.eventLog.dir 參數來指定 event log 保存的地方,可以是本地目錄或者 HDFS 上的目錄,不過一般我們都會將它設置成 HDFS 上的一個目錄。

[[319143]]

但是這個功能有個問題,就是這個 Spark Job 運行的過程中產生的所有 event log 都是寫到單個文件中,這就導致了 event log 文件的大小和這個 Spark Job 的并行度、復雜度以及運行的時間有很大關系。如果我們是運行 Spark Streaming 作業,這個問題特別明顯,我們經常看到某個 Spark Streaming 作業的 event log 達到幾十 GB 大小!我們沒辦法清理或者刪除一些不需要的事件日志,當我們使用 Spark 歷史服務器打開這個幾十 GB 大小的 event log,打開速度可想而知。

如果大家經常使用 Log4j 的話,Log4j 提供了一個 RollingFileAppender,可以使長時間運行應用的日志按照時間或者日志文件大小進行切割,從而達到限制單個日志文件的大小。Spark 的 event log 為什么不可以提供類似功能呢?值得高興的是,即將發布的 Spark 3.0 為我們帶來了這個功能(具體參見 SPARK-28594)。當然,對待 Spark 的 event log 不能像其他普通應用程序的日志那樣,簡單切割,然后刪除很早之前的日志,而需要保證 Spark 的歷史服務器能夠解析已經 Roll 出來的日志,并且在 Spark UI 中展示出來,以便我們進行一些查錯、調優等。

如何使用

事件日志滾動

首先必須使用 Spark 3.0,同時將 spark.eventLog.rolling.enabled 設置為 true(默認是 false)。那么 Spark 在 writeEvent 的時候會判斷當前在寫的 event log 文件大小加上現在新來的事件日志大小總和是否大于 spark.eventLog.rolling.maxFileSize 參數配置的值,如果滿足將啟動 event log roll 操作。

事件日志壓縮

所謂事件日志壓縮就是將多個滾動出來的事件日志文件合并到一個壓縮的文件中。日志壓縮涉及到的參數有 spark.history.fs.eventLog.rolling.maxFilesToRetain 和 spark.history.fs.eventLog.rolling.compaction.score.threshold。第一個參數的意思是進行 Compaction 之后需要保存多少個 event logs 為不壓縮的狀態,這個參數的默認值是 Int.MaxValue。也就是默認其實不啟用事件日志 Compaction,所有 event logs 都將不會被 Compaction 到一個文件里面。

需要注意的:

  • event logs 的 Compaction 操作是在 Spark 歷史服務器端進行的,而且是在 Spark 歷史服務器檢查到有新的事件日志寫到 spark.eventLog.dir 參數配置的目錄中,這時候對應 Spark 作業的 event logs 將可能進行 compact 操作。
  • event logs 的 Compaction 操作可能會刪除一些沒用的事件日志,關于刪除的邏輯請看下一小結。這樣經過 Compaction 操作之后,新生成的壓縮文件大小將會變小。
  • 一個 Spark 作業最多只會有一個 Compact 文件,文件的后綴是 .compact。已經有 compact 之后的合并文件在下一次進行 compact 的時候會被讀出來和需要被 compact 的文件再一次合并,然后寫到新的 compact 文件里。
  • 已經被選中進行 compact 的 event logs 在執行完 compact 之后會被刪除。

核心思想

整個 event logs 滾動項目應該可以大致分為兩個階段:

  • 第一個階段就是支持 event logs 滾動以及 event logs Compaction,這個在 SPARK-28594 里面,已經合并到 Spark 3.0 代碼中。
  • 第二個階段是采用 AppStatusListener 使用的方法,即把 event logs 持久化到底層的 KVStore 中,并支持從 KVStore 把 event logs restore 出來,這個可以參見 SPARK-28870,這個還在開發中。

階段一

支持 event log 滾動的隱層含義是支持刪除舊的事件日志,要不然光支持滾動不支持刪除,只是解決了單個 event log 文件的大小,解決不了整個作業 event log 總和大小。

為了保證刪除舊的事件日志之后 event logs 仍然可以被 Spark 歷史服務器重放,我們需要定義出哪些事件日志是可以刪除的。

拿 Streaming 作業來說,每個批次都是運行不同的作業。如果我們想刪除一些事件日志,在大多數情況下,我們都會保存最近一些批次作業的事件日志,因為這些事件日志有助于我們分析剛剛遇到的問題。換句話說,刪除那些比較舊的作業對應的事件日志是比較安全的,而且是比較可行的。這個在 SQL 查詢的作業來說一樣是適用的。

目前 Spark 在內存中會維護一些 liveExecutors、liveRDDs、liveJobs、liveStages 以及 liveTasks 等信息,當 Spark 歷史服務器觸發 compact 操作的時候,會讀取需要 compact 的事件日志文件, 然后根據前面的 liveExecutors、liveRDDs、liveJobs、liveStages 以及 liveTasks 等信息判斷哪些事件需要刪除,哪些事件需要保留。滿足 EventFilter 定義的 Event 會被保留,不滿足的就刪除,具體可以參見 EventFilter 的 applyFilterToFile 方法實現。

階段二

AppStatusListener 會利用外部 KVStore 來存儲事件日志,所以社區建議利用現有特性在底層 KVStore 中保留最多數量的 Jobs、Stages 以及 SQL 執行。為了存儲對象到 KVStore 以及從 KVStore 恢復對象,社區采用的方法是將 KVStore 中存儲的對象 dump 到一個文件中,這個稱為 snapshot。

從空間使用的角度來看,這個想法非常有效,因為在 POC 中,只需 5MB 內存就可以將 KVStore 中的數據 dump 到文件中,其中回放了8.4GB 的事件日志。結果看起來很令人驚訝,但是很有意義,根據這個機制,在大多數情況下,dump 數據到文件需要的內存大小不太可能發生顯著變化。

需要注意的是,快照里面的內容與當前事件日志文件的內容是不同的。因為這個快照文件是從 KVStore dump 出來的,這些對象不會按創建的順序寫入。我們可以壓縮這些對象以節省空間和 IO 成本。在分析某個問題時,新產生的事件日志可能沒什么用,這就需要讀取和操作之前的事件日志文件。為了支持這種情況,需要將基本的 listener events 編寫為原始格式,然后滾動事件日志文件,然后再將舊的事件日志保存到快照中,兩種格式的文件共存。這樣就滿足我們之前的需求。由于快照的存在,事件日志的總體大小不會無限增長。

新的方案中 event log 是如何存儲的呢

之前每個 Spark 作業的 event log 都是保存在單個文件里面,如果事件日志沒有完成,會使用 .inprogress 后綴表示。新的 event log 方案會為每個 Spark 作業創建一個目錄來保存,因為每個 Spark 作業可能會生成多個事件日志文件。事件日志的文件夾名稱格式為:eventlog_v2_appId(_)。在事件日志文件夾里面存儲的是對應作業的事件日志,日志文件名稱格式為:events__(_)(.)。

為了說明,我這里進行了一些測試,/data/iteblog/eventlogs 這個目錄就是 spark.eventLog.dir 參數設置的值,下面是這個目錄下的內容:

 

  1. iteblog@www.iteblog.com:/data/iteblog/eventlogs| 
  2. ⇒  ll 
  3. total 0 
  4. drwxrwx---  15 iteblog  wheel   480B  3  9 14:26 eventlog_v2_local-1583735123583 
  5. drwxrwx---   7 iteblog  wheel   224B  3  9 14:50 eventlog_v2_local-1583735259373 
  6. ​ 
  7. iteblog@www.iteblog.com:/data/iteblog/eventlogs/eventlog_v2_local-1583735259373| 
  8. ⇒  ll 
  9. total 416 
  10. -rw-r--r--  1 iteblog  wheel     0B  3  9 14:27 appstatus_local-1583735259373.inprogress 
  11. -rwxrwx---  1 iteblog  wheel    64K  3  9 14:50 events_2_local-1583735259373.compact 
  12. -rwxrwx---  1 iteblog  wheel   102K  3  9 14:50 events_3_local-1583735259373 
  13. -rwxrwx---  1 iteblog  wheel   374B  3  9 14:50 events_4_local-1583735259373 

可以看到,當 Spark 作業還沒有完成的時候,會存在一個 appstatus_local-1583735259373.inprogress 的空文件,真正的事件日志是寫到 events_x_local-1583735259373 文件里面。

責任編輯:未麗燕 來源: 今日頭條
相關推薦

2023-07-24 09:11:43

CSS滾動驅動動畫

2013-09-30 09:19:33

開源NVIDIA

2009-08-08 22:43:06

Chrome3.0皮膚

2011-11-28 11:11:17

2021-11-03 06:41:57

加班字節跳動

2025-07-02 03:00:00

2009-04-06 08:26:14

iphone蘋果移動OS

2011-01-07 13:33:07

Google平板系統蜂巢Android 3.0

2013-09-16 09:57:52

2015-12-15 10:32:44

chromecss開發

2009-06-12 09:07:24

LinuxUSB3.0

2022-05-06 20:18:36

元宇宙Web 3.0網絡

2009-06-17 16:14:22

Spring 3.0全

2020-06-17 12:25:34

Spark函數類型

2023-09-21 10:09:10

JavaScript數組分組

2009-03-22 10:13:28

Iphone蘋果共享網絡連接

2024-08-28 08:33:15

2024-09-23 09:20:02

calc-sizeCSS前端

2023-08-29 09:43:21

Node.js.env

2017-03-10 10:00:08

系統
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产激情偷乱视频一区二区三区 | 三级视频在线观看 | 色综合一区二区 | www.国产精| 亚洲日日操 | 亚洲午夜小视频 | 精品久久电影 | 一区二区中文字幕 | 一区二区久久 | 欧美性a视频| 国产精品美女久久久久久久网站 | 亚洲第一天堂无码专区 | 日韩在线观看一区 | 能免费看的av | 国产成人一区二区三区 | 国产精品国产a | 午夜影院在线观看视频 | 亚洲精品一区二区三区在线 | 高清欧美性猛交 | 日韩电影免费在线观看中文字幕 | 日韩欧美一区二区三区免费观看 | 中文字幕精品一区二区三区精品 | 欧美精品第三页 | 在线观看免费av网 | 久久久久国产一区二区三区 | 99在线资源 | аⅴ资源新版在线天堂 | 国产激情一区二区三区 | 欧美激情综合 | 国产精品久久久久久久久久 | 国产日韩欧美在线观看 | 亚洲精品视频免费看 | 国产一区二区精品自拍 | 日韩久久精品 | 日韩视频精品 | 在线视频日韩 | 97久久精品午夜一区二区 | 天天操人人干 | 亚洲国产高清高潮精品美女 | 国产一区二区影院 | 亚洲欧美另类在线观看 |