寫入文件提示無法滿足最小寫入副本要求
本文介紹寫入文件提示無法滿足最小寫入副本要求問題的原因和解決方案。
具體報錯
報錯信息如下所示。其中,【X】
是當(dāng)前正在運(yùn)行的DataNode數(shù)量,【Y】
是被排除在此操作之外的DataNode數(shù)量。
org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /foo/file1 could only be written to 0 of the 1 minReplication nodes,there are 【X】 datanode(s) running and 【Y】 node(s) are excluded in this operation.
問題原因
該問題表示在當(dāng)前的集群狀態(tài)下,因?yàn)闊o法滿足文件的最小副本數(shù)量,HDFS無法將文件寫入到指定路徑中。
解決方案
如果【X】為0,說明集群DataNode上報NameNode路徑出現(xiàn)問題,需要檢查以下方面:
檢查DataNode節(jié)點(diǎn)是否可以連通NameNode節(jié)點(diǎn)。
如果連通的命令長時間或超時不返回信息,則可通過以下命令,檢查NameNode節(jié)點(diǎn)和DataNode節(jié)點(diǎn)是否在同一安全組下。
hadoop dfs -ls /
檢查DataNode服務(wù)是否啟動。
登錄DataNode服務(wù)所在節(jié)點(diǎn),請參見登錄集群。
切換到hdfs用戶。
su - hdfs
執(zhí)行以下命令,查看是否有DataNode進(jìn)程正在運(yùn)行。
jps
如果返回信息中包含DataNode,則表示DataNode進(jìn)程正在運(yùn)行。
如果【Y】不為0,說明某些DataNode節(jié)點(diǎn)被HDFS客戶端排除,需要檢查以下方面:
檢查HDFS客戶端是否可以連通所有DataNode節(jié)點(diǎn)。
檢查DataNode節(jié)點(diǎn)的負(fù)載是否過高。DataNode負(fù)載過高時或者DataNode本身容量太小,同時寫入多個文件會導(dǎo)致DataNode無法處理NameNode的分塊請求,需要對DataNode進(jìn)行擴(kuò)容。
說明您可以通過HDFS Web UI查看DataNode節(jié)點(diǎn)的負(fù)載,詳細(xì)信息請參見HDFS Web UI介紹。
如果【X】不為0,并且【X】>【Y】,可檢查以下方面。
如果DataNode數(shù)量較少(少于10臺)或容量較滿,并且集群中存在大量寫入小文件的作業(yè),可能會導(dǎo)致NameNode無法找到合適的DataNode節(jié)點(diǎn)進(jìn)行寫入。這種情況常見于Flink Checkpoint寫入HDFS;Hive或Spark動態(tài)分區(qū)寫入作業(yè)需要大量分區(qū)的場景。
為了解決這個問題,您可以增加集群中DataNode的數(shù)量或者容量。推薦擴(kuò)容DataNode的數(shù)量,一般情況下可以快速解決此類問題,并且后續(xù)進(jìn)行縮容也更加方便,從而更好地滿足大量小文件的寫入需求。此外,您也可以使用OSS-HDFS服務(wù)的存算分離方案來實(shí)現(xiàn)更高的性價比。