HDFS配置文件参数设置的优先级
hdfs-site.xml是HDFS的配置文件,其中包含了各种对HDFS集群的设置参数,比如集群中存储文件副本的数量,namenode辅助节点的地址等。对于hdfs-site.xml中的属性值,我们可以在不同的地方进行设置,
第一种是通过HDFS客户端代码进行对属性值进行设置,这是优先级最高的方式;
第二种是在当前的项目下创建一个hdfs-site.xml文件,对相关属性的值进行设置;
第三种是在服务器集群中进行自定义hdfs-site.xml的属性值;
第四张是按照集群默认的配置文件的属性值来参与相关的操作,这个默认的配置文件是"hdfs-default.xml"
下面我们来一起实验一下,hdfs读取配置文件的优先顺序:
@Test public void readConf() throws URISyntaxException, IOException, InterruptedException { Configuration conf = new Configuration(); // 默认加载的是本地hadoop安装路径下的core-default.xml conf.set("dfs.replication","2"); String s1 = conf.get("dfs.replication"); System.out.println(s1); FileSystem fs = FileSystem.get(new URI("hdfs://192.168.182.101:9000"), conf, "fym000"); fs.copyFromLocalFile(new Path("F:/520.txt"),new Path("/fym/pyx/lll/520.txt")); fs.close(); }
在服务器集群中,hdfs-site.xml文件的配置是这样的:
<configuration> <property> <name>dfs.replication</name> <value>3</value> </property> <!-- 指定Hadoop辅助名称节点主机配置 --> <property> <name>dfs.namenode.secondary.http-address</name> <value>192.168.182.103:50090</value> </property> </configuration>
也就是副本数,设置的是3,但是我在客户端代码中,将文件的副本数设置为了2,那么运行程序之后,结果如下:
2
同时,访问namenode的web站点,发现,上传上去的文件,副本数量是2,说明代码设置参数值的优先级大于集群自定义配置文件的优先级。
然后继续比较,本地项目中创建一个对应的配置文件,设置副本数为1,并在上面的代码中添加一行读取本地配置文件的代码:
conf.set("dfs.replication","2");
conf.addResource(new Path("./config/hdfs-site.xml"));
String s1 = conf.get("dfs.replication");
System.out.println(s1);
输出结果是:
2
192.168.182.103:50090
下面那行ip地址是从本地的项目下的配置文件中读取的而非从服务器集群的配置文件中。所以看出,客户端代码设置的参数的优先级同样大于本地项目下创建的配置文件设置的参数值。
最后比较一下,本地项目中创建的配置文件和集群中自定义的配置文件的优先级,上面的代码修改为:
Configuration conf = new Configuration(); // 默认加载的是本地hadoop安装路径下的core-default.xml conf.addResource(new Path("./config/hdfs-site.xml")); String s1 = conf.get("dfs.replication"); System.out.println(s1); String s2 = conf.get("dfs.namenode.secondary.http-address"); System.out.println(s2); FileSystem fs = FileSystem.get(new URI("hdfs://192.168.182.101:9000"), conf, "fym000"); fs.copyFromLocalFile(new Path("F:/520.txt"),new Path("/fym/pyx/lll/523.txt")); fs.close();
然后运行,输出结果如下:
1 192.168.182.103:50090
namenode的web站点显示如下:
可以看出,在本地项目下的配置文件优先级要高于集群中配置文件的优先级。
然后就是集群中默认的配置文件低于集群中自定义的配置文件的优先级,所以优先顺序既可以排列出来了。
客户端代码 > 项目目录下的配置文件 > 集群自定义配置文件 > 集群默认文件