Paimon小文件問(wèn)題深度解析與優(yōu)化實(shí)踐
今天我們要分享的是關(guān)于Paimon的小文件治理。
在Paimon的流式數(shù)據(jù)湖倉(cāng)架構(gòu)中,小文件問(wèn)題是影響系統(tǒng)穩(wěn)定性和查詢(xún)性能的關(guān)鍵挑戰(zhàn)。
小文件的產(chǎn)生不僅會(huì)加重底層分布式文件系統(tǒng)(如HDFS)的元數(shù)據(jù)管理負(fù)擔(dān),導(dǎo)致NameNode壓力過(guò)大,還會(huì)顯著降低數(shù)據(jù)查詢(xún)效率。
那么有哪些有效手段可以解決Paimon小文件問(wèn)題?我們逐一分析。
一、參數(shù)調(diào)優(yōu)
參數(shù)調(diào)優(yōu)主要包含F(xiàn)link、Paimon,平衡寫(xiě)入性能、數(shù)據(jù)延遲和文件管理開(kāi)銷(xiāo)。
1.1 Flink作業(yè)參數(shù)優(yōu)化
1.1.1 調(diào)整Checkpoint間隔
Checkpoint間隔是影響Paimon小文件數(shù)量的最關(guān)鍵參數(shù)之一。每次觸發(fā)Checkpoint時(shí),Paimon的Writer會(huì)強(qiáng)制將其內(nèi)存中的WriteBuffer數(shù)據(jù)刷寫(xiě)到分布式文件系統(tǒng)上,從而生成新的數(shù)據(jù)文件。
圖片
但是增大Checkpoint間隔會(huì)增加數(shù)據(jù)可見(jiàn)性的延遲時(shí)間,需要根據(jù)業(yè)務(wù)對(duì)數(shù)據(jù)實(shí)時(shí)性的要求平衡。
1.1.2 設(shè)置最大并發(fā)檢查點(diǎn)數(shù)
分布式環(huán)境中,F(xiàn)link作業(yè)的Checkpoint過(guò)程可能會(huì)出現(xiàn)"長(zhǎng)尾"現(xiàn)象。通過(guò)設(shè)置execution.checkpointing.max-concurrent-checkpoints參數(shù),可以控制同時(shí)處于進(jìn)行中的Checkpoint最大數(shù)量,來(lái)緩解Checkpoint長(zhǎng)尾問(wèn)題。
1.1.3 調(diào)整Sink并發(fā)度
Paimon的Sink并發(fā)度(sink.parallelism)也是一個(gè)可以直接影響小文件生成和寫(xiě)入性能的關(guān)鍵參數(shù)。
Paimon表的數(shù)據(jù)在物理上是按照分桶(Bucket)進(jìn)行組織的,每個(gè)Bucket對(duì)應(yīng)一個(gè)獨(dú)立的寫(xiě)入通道。因此,Paimon Sink的并發(fā)度建議與表的Bucket數(shù)量保持一致,確保每個(gè)Sink子任務(wù)(Subtask)可以獨(dú)立地處理一個(gè)Bucket的數(shù)據(jù),避免數(shù)據(jù)在Sink節(jié)點(diǎn)之間進(jìn)行重分布(Shuffle),從而提高寫(xiě)入效率。
但是,增加并發(fā)度意味著需要更多的TaskManager資源(CPU、內(nèi)存),同時(shí)也可能導(dǎo)致生成更多的小文件。因?yàn)槊總€(gè)Sink子任務(wù)都會(huì)有自己的WriteBuffer,并發(fā)度越高,總的WriteBuffer數(shù)量就越多,在Checkpoint觸發(fā)時(shí),可能會(huì)同時(shí)刷寫(xiě)更多的小文件。因此需要綜合考慮數(shù)據(jù)量、數(shù)據(jù)分布、集群資源和目標(biāo)文件大小等多個(gè)因素,通過(guò)實(shí)驗(yàn)和監(jiān)控找到一個(gè)最優(yōu)的配置。
1.2 Paimon表參數(shù)優(yōu)化
除了Flink作業(yè)層面的參數(shù)調(diào)優(yōu),Paimon本身也提供了一系列表參數(shù),來(lái)控制數(shù)據(jù)的寫(xiě)入、存儲(chǔ)和合并。
我們重點(diǎn)介紹幾個(gè)關(guān)鍵的Paimon表參數(shù):
- 目標(biāo)文件大?。╰arget-file-size)
 - 寫(xiě)緩沖區(qū)大小、溢出策略(write-buffer-size, write-buffer-spillable)
 - 桶數(shù)量(bucket)
 
1.2.1 設(shè)置目標(biāo)文件大小
target-file-size定義了Compaction過(guò)程期望生成的最終數(shù)據(jù)文件的大小。Paimon的Compaction機(jī)制會(huì)不斷地把多個(gè)小文件合并成一個(gè)更大的文件,減少文件數(shù)量,提升查詢(xún)性能。
這個(gè)參數(shù)直接決定了Paimon表中穩(wěn)定數(shù)據(jù)文件的大小,是控制小文件數(shù)量的關(guān)鍵。
圖片
1.2.2 調(diào)整寫(xiě)緩沖區(qū)大小與溢出策略
Paimon Writer在將數(shù)據(jù)寫(xiě)入磁盤(pán)之前,會(huì)先把數(shù)據(jù)緩存在內(nèi)存中的一個(gè)排序緩沖區(qū)(WriteBuffer)里。緩沖區(qū)的大小由參數(shù)write-buffer-size控制,默認(rèn)值為128MB。當(dāng)WriteBuffer被數(shù)據(jù)填滿(mǎn)時(shí),它會(huì)被排序并刷寫(xiě)到磁盤(pán),形成一個(gè)L0層的小文件。
write-buffer-size直接決定了單個(gè)L0文件的最小期望大小。增大write-buffer-size,可以把更多的數(shù)據(jù)在內(nèi)存中進(jìn)行累積和排序,從而在每次刷寫(xiě)時(shí)生成體積更大的L0文件,從源頭上減少小文件的數(shù)量。
Paimon還提供了一個(gè)重要的參數(shù):write-buffer-spillable。當(dāng)將此參數(shù)設(shè)置為true時(shí),如果WriteBuffer被填滿(mǎn),Paimon會(huì)先將數(shù)據(jù)溢出(spill)到本地磁盤(pán)上的一個(gè)臨時(shí)文件中,因此強(qiáng)烈建議生產(chǎn)環(huán)境開(kāi)啟。
1.2.3 優(yōu)化桶(Bucket)數(shù)量
Paimon表的數(shù)據(jù)在物理上是按照分區(qū)(Partition)和分桶(Bucket)進(jìn)行組織的。
每個(gè)分區(qū)下的數(shù)據(jù)會(huì)被進(jìn)一步劃分為多個(gè)Bucket,每個(gè)Bucket對(duì)應(yīng)一個(gè)單獨(dú)的LSM-Tree結(jié)構(gòu)和寫(xiě)入通道。
Bucket的數(shù)量直接決定了表的并發(fā)寫(xiě)入能力和文件的組織方式。合理設(shè)置Bucket數(shù)量是治理小文件問(wèn)題的關(guān)鍵一環(huán)。
我們有一個(gè)經(jīng)驗(yàn)性的結(jié)論,單個(gè)Bucket的數(shù)據(jù)量維持在1GB左右。
1.3 異步化小文件合并
推薦生產(chǎn)環(huán)境開(kāi)啟異步Compaction。

二、運(yùn)維監(jiān)控
此外,寫(xiě)入Paimon的監(jiān)控項(xiàng)可以參考:
圖片















 
 
 















 
 
 
 