编辑: LinDa_学友 | 2019-07-12 |
这些属性需要有一个系统(类)进行管理 .然而,Hadoop没有使用 Java.util.Properties 管理配置文件,也没有使用Apache Jakarta Commons Configuration管理配置文件,而是单独开发了一个配置文件管理类,这个类就是 org.apache.hadoop.conf.Configuration .它可以解析如下格式的xml文件: color red 如果想及时了 解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop 我们可以 将所有的配置都写 入这种格式的文件中;
Hadoop就是这 么做的,可以参见:core-site.xml、mapred-site.xml以及hdfs-site.xml 文件.Hadoop生态系统中有很多API都需要传进一个 Configuration 对象,我们需要在这个对象中传进一些关于系统的配置.通过 Configuration
1 /
4 设置属性的方式主要有以下几种: public void set(String name, String value) public void addResource(String name) public void addResource(URL url) public void addResource(Path file) public void addResource(InputStream in) 通过 set 方法传参只能通过在程序里面进行;
而addResource 方法允许我们将配置写入到文件中 ,然后后面会解析这个文件里面相关的配置.我们也可以同时通过这两种方式进行相关属性的配 置.那么问题来了,同一个 属性通过这两种方式进行配置,最后哪种方式有效?如下: Configuration conf = new Configuration(false);
conf.addResource(new Path("/iteblog.xml"));
conf.set("color", "blue");
System.out.println(conf.get("color"));
Configuration conf = new Configuration(false);
conf.set("color", "blue");
conf.addResource(new Path("/iteblog/test.xml"));
System.out.println(conf.get("color"));
上面两个代码片段主要的区别就是调用 set 和addResource顺序不一样.大家先猜猜这两个程序的输出. 有趣的是,上面两个代码片段输出的结果一样,都是 blue !(原理见下面)大家再看看下面代码片段的输出是什么: iteblog.xml color red iteblog1.xml
2 /
4 color yellow Configuration conf = new Configuration(false);
conf.addResource(new Path("/iteblog.xml"));
conf.addResource(new Path("/iteblog1.xml"));
System.out.println(conf.get("color"));
Configuration conf = new Configuration(false);
conf.addResource(new Path("/iteblog1.xml"));
conf.addResource(new Path("/iteblog.xml"));
System.out.println(conf.get("color"));
上面的输出结果依次为 yellow 和red !因为通过 addResource 设置的属性,后面的设置会覆盖前面的,除非前面文件该属性被设置为final(true). 在Configuration 类中存在三个比较重要的数据结构:Properties overlay、HashMap updatingResource 以及 private Properties properties overlay:只有通过调用 set 方法设置的属性才会写入到这里面;
updatingResource:这里面主要记录的是各个属性的来源.不管程序调用 addResource 和set 的顺序如何,最后通过 set 设置的属性来源是 programatically (这个名字可以修改) ;
properties:这里面主要存的是通过 addResource 和set 方式设置属性的交集.不管程序调用 addResource 和set 的顺序如何,最后一定是通过 set 方式设置属性的值覆盖通过 addResource 复制的值. 最后总结如下: 通过 set 设置的属性优先级比通过 addResource 设置要高;