Java HDFS API 追加檔案寫入內容異常問題的解決
最近在完善一個Java HDFS 的Api功能類,其功能列表如下(主要利用檔案系統進行檔案或目錄的各種操作):
上述功能有:
1、獲取當前HDFS系統的狀態,如容量多少,使用了多少,剩餘多少(getStatus())
2、開啟一個檔案,並返回開啟後的FS資料的輸出流,便於向檔案裡編寫內容(open(destPath))
3、上傳本地(local或remote)檔案至HDFS檔案系統(upLoadFile(srcPath,destPath,dealSrc,override))
4、檔案或目錄的重新命名(rename(srcPath,destPath))
5、驗證HDFS的回收站功能是否開啟(trashEnabled()) ....etc
上述功能有:
1、拿到檔案系統的回收站路徑(getTrashDirPath())
2、將檔案或目錄移除(搬家)到回收站(開啟Hadoop回收站功能,並設定檔案的回收週期和檢查點,可參考我的上一篇文章)
3、將回收站中指定的檔案或目錄進行還原(恢復,restoreFromTrash(srcPath,destPath))
4、清空回收站(emptyTrash())
5、開啟已存在的檔案,並進行檔案內容的追加(appendStringToFile(srcPath,content)) ....etc
在進行檔案追加內容的demo測試時,報了一段異常,以追加檔案1.txt為例
測試demo如下:
/**
* 追加檔案,新增內容
*/
@Test
public void appendFile() throws Exception {
initApi();
api.appendStringToFile("1.txt", "2018年6月28日17:49:50");
api.close();
}
執行後,報異常如下:
java.io.IOException: Failed to replace a bad datanode on the existing pipeline due to no more good datanodes being available to try. (Nodes: current=[DatanodeInfoWithStorage[192.168.142.142:9866,DS-739b593f-ef79-4b6f-9e88-99761faf4064,DISK], DatanodeInfoWithStorage[192.168.142.143:9866,DS-be84ef18-1fb3-4859-adee-85eef093ac02,DISK]], original=[DatanodeInfoWithStorage[192.168.142.142:9866,DS-739b593f-ef79-4b6f-9e88-99761faf4064,DISK], DatanodeInfoWithStorage[192.168.142.143:9866,DS-be84ef18-1fb3-4859-adee-85eef093ac02,DISK]]). The current failed datanode replacement policy is DEFAULT, and a client may configure this via 'dfs.client.block.write.replace-datanode-on-failure.policy' in its configuration.
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.findNewDatanode(DFSOutputStream.java:929)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.addDatanode2ExistingPipeline(DFSOutputStream.java:984)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.setupPipelineForAppendOrRecovery(DFSOutputStream.java:1131)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:455)
Failed to replace a bad datanode on the existing pipeline due to no more good datanodes being available to try. |
異常意思大概是:由於可用的DataNode不多了,導致當前管道中壞掉的DataNode無法被替換
直接貼出解決方案,在Client端,設定conf的properties如下:
Configuration conf = new Configuration();
/**
* dfs.client.block.write.replace-datanode-on-failure.enable=true
* 如果在寫入管道中存在一個DataNode或者網路故障時,
* 那麼DFSClient將嘗試從管道中刪除失敗的DataNode,
* 然後繼續嘗試剩下的DataNodes進行寫入。
* 結果,管道中的DataNodes的數量在減少。
* enable :啟用特性,disable:禁用特性
* 該特性是在管道中新增新的DataNodes。
* 當叢集規模非常小時,例如3個節點或更少時,叢集管理員可能希望將策略在預設配置檔案裡面設定為NEVER或者禁用該特性。
* 否則,因為找不到新的DataNode來替換,使用者可能會經歷異常高的管道寫入錯誤,導致追加檔案操作失敗
*/
conf.set("dfs.client.block.write.replace-datanode-on-failure.enable", "true");
/**
* dfs.client.block.write.replace-datanode-on-failure.policy=DEFAULT
* 這個屬性只有在dfs.client.block.write.replace-datanode-on-failure.enable設定true時有效:
* ALWAYS :當一個存在的DataNode被刪除時,總是新增一個新的DataNode
* NEVER :永遠不新增新的DataNode
* DEFAULT:副本數是r,DataNode的數時n,只要r >= 3時,或者floor(r/2)大於等於n時
* r>n時再新增一個新的DataNode,並且這個塊是hflushed/appended
*/
conf.set("dfs.client.block.write.replace-datanode-on-failure.policy", "NEVER");
看來叢集小了,也是事啊(我本地測試環境,只有兩個DataNode,索性直接啟動該特性,失敗的時候新增新的DataNode)
在執行一次demo,這次無異常丟擲
我們下載1.txt到本地,並檢視內容如下:
相關文章
- java檔案相關(檔案追加內容、檔案內容清空、檔案內容讀取)Java
- java如何追加寫入txt檔案Java
- 追加寫入json檔案JSON
- node中給檔案追加內容
- python操作檔案寫入內容Python
- python對json格式原檔案追加內容PythonJSON
- OSS物件儲存的檔案追加上傳問題及解決方案物件
- git將指定內容寫入檔案Git
- oracle程式異常中止時登入掛起問題的解決Oracle
- URL重寫(rewrite)的具體實現與異常問題解決
- SpringBoot-java.lang.IllegalArgumentException: Not a managed type異常問題解決方法Spring BootJavaException
- 解決Java執行過程中拋簽名異常的問題Java
- Java IO 建立檔案解決檔名重複問題Java
- 10.Java異常問題Java
- NPOI建立word文件,使用unicode寫入打勾的小方框,word2021顯示異常問題解決Unicode
- Java解析xml檔案遇到特殊符號&會出現異常的解決方案JavaXML符號
- 在CSS中解決內容過長的問題CSS
- hdfs檔案本地許可權問題
- JAVA類檔案操作和異常Java
- Python:Python中文寫入csv檔案出現亂碼問題的解決方案之一Python
- 解決root使用者對HDFS檔案系統沒有許可權的問題
- Python異常 ValueError的問題詳解PythonError
- Linux中常見的檔案讀寫錯誤問題及解決方法!Linux
- 徹底解決java WEB專案的檔案路徑問題(war包)JavaWeb
- Java™ 教程(常見問題及其解決方案)Java
- 把list集合的內容寫入到Xml中,通過XmlDocument方式寫入Xml檔案中XML
- Hadoop hdfs上傳檔案報錯解決Hadoop
- HDFS 05 - HDFS 常用的 Java API 操作JavaAPI
- 解決eclipse編輯jsp、js檔案時,經常出現卡死的問題EclipseJS
- Mac常見問題|Safari下載檔案沒有反應的解決方法Mac
- 異常解決:idea Java 動態編譯失敗,獲取classpath屬性不正確問題解決IdeaJava編譯
- Java 例項 - 檔案寫入Java
- python的檔案和異常Python
- Java操作hdfs出現的問題Java
- html匯入導航欄本地檔案解決跨域問題HTML跨域
- 徹底解決Hive小檔案問題Hive
- [問題]多個檔案寫入日誌報錯
- 【知識分享】伺服器常見異常問題及解決辦法伺服器