vlambda博客
学习文章列表

【HDFS】--如何动态刷新一个配置项

背景:

目前,对HDFS的某些参数进行修改后,若想让其生效,必须滚动重启Namenode。
由于NN元数据量比较多,我们公司线上的NN重启一次要花费1h 15min左右,而且随着元数据量的增长以及块数量的增长重启NN花费的时间会越来越久。

Why
我们为什么需要把一些参数做成reconfig的?
因为我们想达到每次修改参数无须重启NN的目标。这样有以下好处:
1.缩短参数调优周期
2.提高开发自测效率

0x00 原生支持reconfig的参数配置demo

使用
hdfs dfsadmin -reconfig namenode <替换成你Namenode域名>:8020 properties 命令列出支持reconfig的配置项。

【HDFS】--如何动态刷新一个配置项

以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。

【HDFS】--如何动态刷新一个配置项

到Namenode的Conf界面查看,确实修改成功了。

【HDFS】--如何动态刷新一个配置项

0x01 把自己感兴趣的配置项变为reconfig的

这里以dfs.namenode.blocks.per.postponedblocks.rescan这个配置项为例,把他改造成reconfig的。

首先在NameNode.java中import这个配置项:

【HDFS】--如何动态刷新一个配置项

接着,在NameNode类下,有个成员变量reconfigurableProperties用来记录哪些配置项是可reconfig的(也就是执行properties命令返回的内容)。
在这个TreeSet中添加刚才import的key。

【HDFS】--如何动态刷新一个配置项

然后在NameNode类的reconfigurePropertyImpl方法中添加一个else if分支,用来判断key是我们刚才添加的key。

【HDFS】--如何动态刷新一个配置项

最后添加else if里面的响应方法,本例为reconfigBlocksPerPostponedblocksRescan方法:

【HDFS】--如何动态刷新一个配置项

实验结果:
改完代码后,我们打包后上传到测试集群进行实验验证,实验结果如下:

【HDFS】--如何动态刷新一个配置项

reconfig start前:

reconfig start后:

大功告成。