背景:
目前,对HDFS的某些参数进行修改后,若想让其生效,必须滚动重启Namenode。
由于NN元数据量比较多,我们公司线上的NN重启一次要花费1h 15min左右,而且随着元数据量的增长以及块数量的增长重启NN花费的时间会越来越久。
Why
我们为什么需要把一些参数做成reconfig的?
因为我们想达到每次修改参数无须重启NN的目标。这样有以下好处:
1.缩短参数调优周期
2.提高开发自测效率
0x00 原生支持reconfig的参数配置demo
使用hdfs dfsadmin -reconfig namenode <替换成你Namenode域名>:8020 properties
命令列出支持reconfig的配置项。
![](https://img-blog.csdnimg.cn/img_convert/7f28f53210831c0cf00e799f17a60ef8.png)
![](https://img-blog.csdnimg.cn/img_convert/1e4e0af2a739617d4f0d52fe8b939aa6.png)
以dfs.heartbeat.interval为例,默认值是3,我们在不重启NN的情况下,给他修改成4。首先修改hdfs-site.xml中的值,然后运行:hdfs dfsadmin -reconfig namenode <替换成你Namenode域名>:8020 start
运行完这条命令后,NN就会去加载新的配置。然后我们运行hdfs dfsadmin -reconfig namenode <替换成你Namenode域名>:8020 status查看reconfig的结果,显示reconfig successful。
![](https://img-blog.csdnimg.cn/img_convert/380c6c132d0a1154e6f681535277b133.png)
到Namenode的Conf界面查看,确实修改成功了。
![](https://img-blog.csdnimg.cn/img_convert/b9f02c74913c143c127179d9cccf6d0f.png)
0x01 把自己感兴趣的配置项变为reconfig的
这里以dfs.namenode.blocks.per.postponedblocks.rescan这个配置项为例,把他改造成reconfig的。
首先在NameNode.java中import这个配置项:
![](https://img-blog.csdnimg.cn/img_convert/09df7dd3358cc99207780c981aa07b6d.png)
接着,在NameNode类下,有个成员变量reconfigurableProperties用来记录哪些配置项是可reconfig的(也就是执行properties命令返回的内容)。
在这个TreeSet中添加刚才import的key。
![](https://img-blog.csdnimg.cn/img_convert/51ab855d3ea85b68bf7cc7ee0d062bc9.png)
然后在NameNode类的reconfigurePropertyImpl方法中添加一个else if分支,用来判断key是我们刚才添加的key。
![](https://img-blog.csdnimg.cn/img_convert/7688e6c281a8aa332aa71c178b8f6f5c.png)
最后添加else if里面的响应方法,本例为reconfigBlocksPerPostponedblocksRescan方法:
![](https://img-blog.csdnimg.cn/img_convert/46daceabdd52f687018479d96a3d3f25.png)
实验结果:
改完代码后,我们打包后上传到测试集群进行实验验证,实验结果如下:
![](https://img-blog.csdnimg.cn/img_convert/0ad3df7d94ee23970d5f1ec359b468ae.png)
reconfig start前:
![](https://img-blog.csdnimg.cn/img_convert/a58fa59bc90949b72a785eba8f232f52.png)
reconfig start后:
![](https://img-blog.csdnimg.cn/img_convert/10ba62eecc0aeb3aa0659b13ddb79ac0.png)
大功告成。