您好,登錄后才能下訂單哦!
Flink checkpoint失敗的問題和解決辦法是什么,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
接觸Flink一段時(shí)間了,遇到了一些問題,其中有一個(gè)checkpoint失敗導(dǎo)致作業(yè)重啟的問題,遇到了很多次,重啟之后一般也能恢復(fù)正常,沒有太在意,最近2天有同事又頻繁遇到,這里記錄一下解決方案和分析過程。
我們的flink測(cè)試環(huán)境有3個(gè)節(jié)點(diǎn),部署架構(gòu)是每個(gè)flink節(jié)點(diǎn)上部署一個(gè)HDFS的DataNode節(jié)點(diǎn),hdfs用于flink的checkpoint和savepoint
看日志是說有個(gè)3個(gè)datanode活著,文件副本是1,但是寫文件失敗
There are 3 datanode(s) running and no node(s) are excluded
復(fù)制代碼
網(wǎng)上搜了一下這種報(bào)錯(cuò),沒有直接的答案,我看了下namenode的日志,沒有更多直接的信息
50070 web ui上看一切正常,datanode的剩余空間都還有很多,使用率不到10%
我試了一下往hdfs上put一個(gè)文件再get下來,都o(jì)k,說明hdfs服務(wù)沒有問題,datanode也是通的
繼續(xù)前后翻了一下namenode的日志,注意到有一些warning信息,
這時(shí)候懷疑塊放置策略有問題
按照日志提示打開相應(yīng)的的debug開關(guān)
修改
etc/hadoop/log4j.properties
復(fù)制代碼
找到
log4j.logger.org.apache.hadoop.fs.s3a.S3AFileSystem=WARN
復(fù)制代碼
照抄這個(gè)格式,在下面添加
log4j.logger.org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicy=DEBUG
log4j.logger.org.apache.hadoop.hdfs.server.blockmanagement.DatanodeDescriptor=DEBUG
log4j.logger.org.apache.hadoop.net.NetworkTopology=DEBUG
復(fù)制代碼
重啟namenode,然后重跑flink作業(yè)
這時(shí)候看到的問題是機(jī)架感知策略無法滿足,因?yàn)槲覀儧]有提供機(jī)架映射腳本,默認(rèn)同一個(gè)機(jī)架,但是仔細(xì)想想跟這個(gè)應(yīng)該也沒有關(guān)系
因?yàn)楹芏嗌a(chǎn)環(huán)境的hdfs其實(shí)都不配置機(jī)架映射腳本,并且導(dǎo)致checkpoint失敗的問題并不是一直存在,最起碼put/get文件都是正常的。
這時(shí)候開始考慮看一下hdfs的源碼了,根據(jù)上面的日志調(diào)用棧,先看到BlockPlacementPolicyDefault以及相關(guān)的DatanodeDescriptor
這些源碼大致的意思是當(dāng)給一個(gè)塊選擇一個(gè)datanode的時(shí)候,要對(duì)這個(gè)datanode進(jìn)行一些檢查,比如看下剩余空間,看下繁忙程度
當(dāng)我們的問題復(fù)現(xiàn)的時(shí)候,觀察日志會(huì)發(fā)現(xiàn)一些與此相關(guān)的關(guān)鍵信息
這個(gè)日志的意思是,存儲(chǔ)空間有43G,分配塊實(shí)際需要100多M,但是scheduled大小就超過43G,因此我們認(rèn)為正常的datanode,namenode認(rèn)為它空間不足了
scheduled大小含義是什么呢?根據(jù)代碼可以看到scheduled大小是塊大小跟一個(gè)計(jì)數(shù)器做乘法,計(jì)數(shù)器代表的其實(shí)是新建文件塊數(shù)量計(jì)數(shù)器,hdfs根據(jù)這兩個(gè)參數(shù)評(píng)估可能需要的存儲(chǔ)空間,相當(dāng)于給每個(gè)datanode預(yù)定了一定的空間,預(yù)定的空間在文件寫入后,計(jì)算完真實(shí)的占用空間后,還會(huì)調(diào)整回來。
了解這個(gè)原理之后,可以判斷的是datanode在一段時(shí)間內(nèi)被預(yù)定了太多的空間。
flink的checkpoint機(jī)制可以參考這一篇www.jianshu.com/p/9c587bd49…
大致的意思是taskmanager上的很多任務(wù)線程都會(huì)寫hdfs
看了下hdfs的目錄結(jié)構(gòu),有大量的類似uuid命名checkpoint文件,同時(shí)每個(gè)文件都很小
當(dāng)我們的作業(yè)并發(fā)較大時(shí),相應(yīng)的在hdfs上就會(huì)創(chuàng)建更多的checkpoint文件,盡管我們的文件大小只有幾K,但是在每一個(gè)datanode預(yù)定的空間都是128M乘以分配到的文件數(shù)量(文件很小,不超過128M),那么43G的空間,最多預(yù)定多少文件呢?除一下也就是300多個(gè),三個(gè)節(jié)點(diǎn)也就是最多900個(gè),我們有多個(gè)作業(yè),總并發(fā)較大,在預(yù)留空間完全釋放前,是很容易出現(xiàn)這個(gè)問題的。
之前知道hdfs不適合存儲(chǔ)小文件,原因是大量小文件會(huì)導(dǎo)致inode消耗以及block location這些元數(shù)據(jù)增長(zhǎng),讓namenode內(nèi)存吃緊,這個(gè)例子還表明
當(dāng)blocksize設(shè)置較大,文件大小卻遠(yuǎn)小于blocksize時(shí),大量這種小文件會(huì)導(dǎo)致datanode直接"不可用"。
塊大小不是集群屬性,是文件屬性,客戶端可以設(shè)置的,flink這時(shí)候每個(gè)taskmanager和jobmanager都是hdfs的"客戶端",根據(jù)flink文檔,我們可以做如下配置
1、在conf/flink-conf.yaml中指定一個(gè)hdfs的配置文件路徑
fs.hdfs.hadoopconf: /home/xxxx/flink/conf
復(fù)制代碼
這里跟flink的配置文件路徑選擇同一個(gè)目錄
2、放進(jìn)去2個(gè)配置文件,一個(gè)core-site.xml一個(gè)是hdfs-site.xml
core-site.xml可以不放,如果checkpoint和savepoint指定了具體的hdfs地址的話,
hdfs-site.xml里加上blockSize配置即可,比如這里我們給它設(shè)置為1M
具體塊大小如何設(shè)置,需要觀察自己的作業(yè)狀態(tài)文件大小自己靈活調(diào)整。
重啟flink集群,提交作業(yè)即可,運(yùn)行時(shí)可以觀察下hdfs的fsimage大小,注意不要因?yàn)閴K太小,小文件太多導(dǎo)致元數(shù)據(jù)過大。
我們已經(jīng)將該問題同步到集群自動(dòng)化部署腳本中,部署時(shí)會(huì)專門添加blocksize的配置。
flink這套依賴hdfs的checkpoint方案對(duì)于輕量級(jí)的流計(jì)算場(chǎng)景稍顯臃腫,checkpoint的分布式存儲(chǔ)不管是直接filesystem還是rocksDB都需要hdfs,其實(shí)從checkpoint原理和數(shù)據(jù)類型考慮,es應(yīng)該也是不錯(cuò)的選擇,遺憾的是社區(qū)并沒有提供這種方案。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。