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