前言java
這段時間在用hdfs,因爲要處理的文件比較多,要及時產出舊文件,可是發現hdfs的blocks數一直在上漲,經分析是hdfs寫入的速度較快,而block回收較慢,因此分心了一下hadoop刪文件的流程,並作了調優,但願對遇到此類問題的程序猿們有幫助。ios
正文函數
經分析與查看源碼發現,hdfs刪除文件的流程是這樣的:oop
(1)java程序中的DFSClient調用delete函數,刪除文件spa
(2)NameNode將文件從他的namespace中刪除.net
(3)NameNode經過心跳的方式,發命令給DataNode,告訴DataNode哪些block塊該刪除,而後DataNode才真正將文件刪除。xml
固然這裏面還有不少詳細的流程,這裏暫時不解釋了,經過查看源碼發現,NameNode每次經過心跳發給DataNode的block塊數是100, 如今調優有連個地方能夠改blog
(1)把心跳間隔改小一點,這個在配置文件hdfs-site.xml中的dfs.heartbeat.interval 。hadoop
(2)讓NameNode每次多發給DataNode一些block塊,因爲是看源碼發現的因此就該源碼了,後來發現其實能夠在配置文件中陪get
修改DFSConfigKeys類中的DFS_BLOCK_INVALIDATE_LIMIT_DEFAULT,從新編譯hadoop,替換到集羣中便可。
更簡單的方法就是修改配置文件 dfs.block.invalidate.limit