前言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