本文介紹寫入HDFS出現無法close文件的異常的解決方案。
具體報錯
java.io.IOException: Unable to close file because the last block xxx:xxx does not have enough number of replicas.
問題原因
一般是由于DataNode寫入負載過大引起的,數據塊不能及時上報。
解決方案
建議按照以下方式排查解決:
說明
調大dfs.client.block.write.locateFollowingBlock.retries參數值,在節點繁忙時會延長文件close的等待時間,正常寫入不受影響。
查看HDFS配置
查看hdfs-site.xml中dfs.client.block.write.locateFollowingBlock.retries(寫入塊后嘗試關閉的次數)參數的配置。默認為5次(30秒),推薦設置為8次(2分鐘),負載高的集群可以視情況繼續調大。
確認集群中是否是只有少量DataNode節點,大量task節點的情況。如果大量并發提交作業,會有大量JAR文件需要上傳,可能會導致DataNode瞬時壓力大,可以繼續調大dfs.client.block.write.locateFollowingBlock.retries參數值或者增加DataNode數量。
確認集群中是否有大量消耗DataNode的作業。例如Flink Checkpoint會大量創建和刪除小文件,引起DataNode負載過大。此類場景可以把Flink運行在獨立的集群上,Checkpoint會使用獨立的HDFS,或者使用OSS/OSS-HDFS Connector優化Checkpoint。
文檔內容是否對您有幫助?