接着上一篇,来探寻一下hadoop中的Configuration类;
在第一次wordcount中我们都看到了使用这个类创建的对象,然后各种配置;其实本质上这个配置是在加载资源,配置信息参数;
在windows中我们都用过的ini结尾的文件,比如mysql的my.ini文件,就直接使用的是键值对,xx=xxx,key=value;
当然我们也在hadoop中配置了n个xml,配置了各种信息,在我理解其实都是经过加载配置文件来初始化软件的,mysql如此,hadoop也如此;
(当然后续的设置参数也是有的)
通过加载这些配置文件然后进行解析读取就可以应用到软件上了;java实现了java.util.Properties来加载配置文件,加载属性集,而在此中加载属性本质上还是通过key找value;
;
hadoop实现了自己的一套API来处理配置信息;
根元素是Configuration,资源素property,property元素是一个配置项,配置文件不支持分层或者分级,一般包括属性键key,值value,描述description
还可以有final来确定此元素固定不变,不可覆盖;
hadoop配置系统还有属性扩展,类似于shell的变量,比如定义了属性hadoop.tmp.dir为/usr/local/hadoop/tmp,则可以直接使用
${hadoop.tmp.dir}来代替该变量,其他地方使用的时候可以直接使用这个来代替,当然也可以嵌套,这个变量中如果有其他的替代,比如
当hadoop.tmp.dir定义为${tmp}/hadoop,使用${hadoop.tmp.dir}时就会去寻找${tmp}的对应值;
当然属性扩展是有一定次数的,防止嵌套时产生死循环;一般是20次,Configuration对象中的静态成员变量MAX_SUBST来限定最大次数;
使用Configuration类的一般过程是构造Configuration对象,并通过类中的addResource()方法来添加需要加载的资源,然后就可以使用get和set方法来设置访问配置项;
资源会在第一次使用的时候自动加载到对象中,在构造函数里有调用这个方法;
在Configuration类中有quietmode:boolean,reaources:Array List<Object>
finalParameters:Set<String>
LoadDefaults:boolean
defaultResources:ArrayList<String>
properties:Properties
overlay:propertles
classLoader:ClassLoader
这些变量;
quietmode是用来设置加载模配置的模式,如果quietmode为true(默认值),则在加载解析配置文件的过程中,不输出日志信息;
resources保存了所有通过addResource方法添加Configuration对象的资源;
Configuration.add resource()有重载的参数InputStream in | Path file | String name(classpath资源) | URL url
loadDefaults用来确定是否加载默认资源,这些资源保存在defaultResources中,defaultResources是一个静态成员变量;通过方法addDefaultResource()来添加默认资源;
在hdfs中会把hdfs-default.xml和hdfs-site.xml作为默认资源,MR中则时mapred-default.xml和mapredsite.xml;
properties用来装解析完的配置文件的键值对,finalProperties则是Set<String>用来装final值的键,overlay则是记录通过set方法改变的配置;
classLoader是一个类加载器变量,用来加载指定类,也可以通过他加载相关资源,比如classpath中的资源;
而且当使用了方法加载了所有的配置之后,并不是直接就进行加载资源,而是将所有的properties和finalProperties清空,然后进行延迟加载
当运行使用的时候才会进行加载,当properties中某个参数为空的时候还会触发重新加载,加载时实现了个解析dom的工厂,创建了个解析器,然后解析赋值;
其中的get是通过key来找到值,set是set(String name,String value);
一个类如果实现了configurable接口,则这个类是可配置的;