FlinkRocksDB狀態后端參數調優的示例分析

這篇文章將為大家詳細講解有關Flink RocksDB 狀態后端參數調優的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:域名與空間、網絡空間、營銷軟件、網站建設、富縣網站維護、網站推廣。

截至當前,Flink 作業的狀態后端仍然只有 Memory、FileSystem 和 RocksDB 三種可選,且 RocksDB 是狀態數據量較大(GB 到 TB 級別)時的唯一選擇。RocksDB 的性能發揮非常仰賴調優,如果全部采用默認配置,讀寫性能有可能會很差。

但是,RocksDB 的配置也是極為復雜的,可調整的參數多達百個,沒有放之四海而皆準的優化方案。如果僅考慮 Flink 狀態存儲這一方面,我們仍然可以總結出一些相對普適的優化思路。本文先介紹一些基礎知識,再列舉方法。

**Note:**本文的內容是基于我們在線上運行的 Flink 1.9 版本實踐得出的。在1.10版本及以后,由于 TaskManager 內存模型重構,RocksDB 內存默認成為了堆外托管內存的一部分,可以免去一些手動調整的麻煩。如果性能仍然不佳,需要干預,則必須將 state.backend.rocksdb.memory.managed 參數設為 false 來禁用 RocksDB 內存托管。

State R/W on RocksDB

RocksDB 作為 Flink 狀態后端時的讀寫邏輯與一般情況略有不同,如下圖所示。

Flink 作業中的每一個注冊的狀態都對應一個列族(column family),即包含自己獨立的 memtable 和 sstable 集合。寫操作會先將數據寫入活動 memtable,寫滿之后則會轉換為不可變 memtable,并 flush 到磁盤中形成 sstable。讀操作則會依次在活動 memtable、不可變 memtable、block cache 和 sstable 中尋找目標數據。另外,sstable 也需要通過 compaction 策略進行合并,最終形成分層的 LSM Tree 存儲結構,老生常談了。

特別地,由于 Flink 在每個檢查點周期都會將 RocksDB 的數據快照持久化到文件系統,所以自然也就不需要再寫預寫日志(WAL)了,可以安全地關閉WAL與fsync。

之前筆者已經詳細講解過 RocksDB 的 compaction 策略,并且提到了讀放大、寫放大和空間放大的概念,對 RocksDB 的調優本質上就是在這三個因子之間取得平衡。而在 Flink 作業這種注重實時性的場合,則要重點考慮讀放大和寫放大。

Tuning MemTable

memtable 作為 LSM Tree 體系里的讀寫緩存,對寫性能有較大的影響。以下是一些值得注意的參數。為方便對比,下文都會將 RocksDB 的原始參數名與 Flink 配置中的參數名一并列出,用豎線分割。

  • write_buffer_size | state.backend.rocksdb.writebuffer.size 單個 memtable 的大小,默認是64MB。當 memtable 大小達到此閾值時,就會被標記為不可變。一般來講,適當增大這個參數可以減小寫放大帶來的影響,但同時會增大 flush 后 L0、L1 層的壓力,所以還需要配合修改 compaction 參數,后面再提。

  • max_write_buffer_number | state.backend.rocksdb.writebuffer.count memtable 的最大數量(包含活躍的和不可變的),默認是2。當全部 memtable 都寫滿但是 flush 速度較慢時,就會造成寫停頓,所以如果內存充足或者使用的是機械硬盤,建議適當調大這個參數,如4。

  • min_write_buffer_number_to_merge | state.backend.rocksdb.writebuffer.number-to-merge 在 flush 發生之前被合并的 memtable 最小數量,默認是1。舉個例子,如果此參數設為2,那么當有至少兩個不可變 memtable 時,才有可能觸發 flush(亦即如果只有一個不可變 memtable,就會等待)。調大這個值的好處是可以使更多的更改在 flush 前就被合并,降低寫放大,但同時又可能增加讀放大,因為讀取數據時要檢查的 memtable 變多了。經測試,該參數設為2或3相對較好。

Tuning Block/Block Cache

block 是 sstable 的基本存儲單位。block cache 則扮演讀緩存的角色,采用 LRU 算法存儲最近使用的 block,對讀性能有較大的影響。

  • block_size | state.backend.rocksdb.block.blocksize block 的大小,默認值為4KB。在生產環境中總是會適當調大一些,一般32KB比較合適,對于機械硬盤可以再增大到128~256KB,充分利用其順序讀取能力。但是需要注意,如果 block 大小增大而 block cache 大小不變,那么緩存的 block 數量會減少,無形中會增加讀放大。

  • block_cache_size | state.backend.rocksdb.block.cache-size block cache 的大小,默認為8MB。由上文所述的讀寫流程可知,較大的 block cache 可以有效避免熱數據的讀請求落到 sstable 上,所以若內存余量充足,建議設置到128MB甚至256MB,讀性能會有非常明顯的提升。

Tuning Compaction

compaction 在所有基于 LSM Tree 的存儲引擎中都是開銷最大的操作,弄不好的話會非常容易阻塞讀寫。建議看官先讀讀前面那篇關于 RocksDB 的 compaction 策略的文章,獲取一些背景知識,這里不再贅述。

  • compaction_style | state.backend.rocksdb.compaction.style compaction 算法,使用默認的 LEVEL(即 leveled compaction)即可,下面的參數也是基于此。

  • target_file_size_base | state.backend.rocksdb.compaction.level.target-file-size-base L1層單個 sstable 文件的大小閾值,默認值為64MB。每向上提升一級,閾值會乘以因子 target_file_size_multiplier(但默認為1,即每級sstable最大都是相同的)。顯然,增大此值可以降低 compaction 的頻率,減少寫放大,但是也會造成舊數據無法及時清理,從而增加讀放大。此參數不太容易調整,一般不建議設為256MB以上。

  • max_bytes_for_level_base | state.backend.rocksdb.compaction.level.max-size-level-base L1層的數據總大小閾值,默認值為256MB。每向上提升一級,閾值會乘以因子 max_bytes_for_level_multiplier(默認值為10)。由于上層的大小閾值都是以它為基礎推算出來的,所以要小心調整。建議設為 target_file_size_base 的倍數,且不能太小,例如5~10倍。

  • level_compaction_dynamic_level_bytes | state.backend.rocksdb.compaction.level.use-dynamic-size 這個參數之前講過。當開啟之后,上述閾值的乘法因子會變成除法因子,能夠動態調整每層的數據量閾值,使得較多的數據可以落在最高一層,能夠減少空間放大,整個 LSM Tree 的結構也會更穩定。對于機械硬盤的環境,強烈建議開啟。

Generic Parameters

  • max_open_files | state.backend.rocksdb.files.open 顧名思義,是 RocksDB 實例能夠打開的最大文件數,默認為-1,表示不限制。由于sstable的索引和布隆過濾器默認都會駐留內存,并占用文件描述符,所以如果此值太小,索引和布隆過濾器無法正常加載,就會嚴重拖累讀取性能。

  • max_background_compactions/max_background_flushes | state.backend.rocksdb.thread.num 后臺負責 flush 和 compaction 的最大并發線程數,默認為1。注意 Flink 將這兩個參數合二為一處理(對應 DBOptions.setIncreaseParallelism() 方法),鑒于 flush 和 compaction 都是相對重的操作,如果 CPU 余量比較充足,建議調大,在我們的實踐中一般設為4。

關于“Flink RocksDB 狀態后端參數調優的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

新聞名稱:FlinkRocksDB狀態后端參數調優的示例分析
標題網址:http://m.kartarina.com/article24/gesije.html

成都網站建設公司_創新互聯,為您提供小程序開發、App開發、用戶體驗、Google、營銷型網站建設外貿建站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

網站優化排名
主站蜘蛛池模板: 一本大道无码av天堂| 手机在线观看?v无码片| 久久久久无码国产精品不卡| 丝袜无码一区二区三区| 在线精品自偷自拍无码中文| 国产成人无码A区在线观看视频| 国产成人麻豆亚洲综合无码精品 | 精品久久久久久久无码久中文字幕 | 亚洲av麻豆aⅴ无码电影| 亚洲AV人无码综合在线观看| 丰满爆乳无码一区二区三区| 无码精品人妻一区二区三区漫画| 男人av无码天堂| 精品无码国产自产拍在线观看| 亚洲人成影院在线无码观看| 6080YYY午夜理论片中无码| 亚洲成AV人在线播放无码| 国产免费午夜a无码v视频| 人妻精品久久无码专区精东影业| 国产精品va在线观看无码| 人妻丰满熟AV无码区HD| 97久久精品无码一区二区| 久久亚洲精品中文字幕无码| 亚洲人成无码www久久久| 精品亚洲AV无码一区二区三区 | 亚洲爆乳精品无码一区二区| 色情无码WWW视频无码区小黄鸭 | 亚洲av无码国产精品夜色午夜| 国产精品无码不卡一区二区三区| 亚洲AV综合色区无码一二三区| 久久久久亚洲AV片无码下载蜜桃| 熟妇人妻AV无码一区二区三区| 亚洲AV综合色区无码一区| 亚洲真人无码永久在线| 亚洲中文久久精品无码ww16| 亚洲国产精品无码专区影院| 无码一区二区三区| 精品无码成人片一区二区98| 精品深夜AV无码一区二区老年| 欧洲人妻丰满av无码久久不卡| 久久久久av无码免费网|