本文介紹寫入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。