第三章:小朱笔记hadoop之conf分析
一、Configurable
void setConf(Configuration conf);
//获取配置信息的方法:
Configuration getConf();
二、Configured
实现了Configurable接口,也就是必须实现接口中的两个方法,当然并不是直接实现的,而是调用Configuration类来实现的,这里我们如果希望自己实现Configurable接口也是可以的。Configured类的方法比较简单,主要是通过调用Configuration类的方法来完成接口方法的。
三、 Configuration
Hadoop 中的组件是根据以上 API 进行配置的。一个 Configuration 实例包括一系列名值对形式的配置属性。每个属性是一个 String 类型,值类型可以任何 java 基础类型或 String 等其他类型。配置属性可以从以下方式加载:
(1)通过名值对设置
(2)通过其他的 Configuration 配置
(3)通过 URL 配置
(4)通过 Path 配置(将会从本地读取)
需要注意的是,当多次使用 addResource 时,后面的属性会覆盖以前设置的非 final 属性, final 属性是不可以被覆盖的。同时 Configuration 实现了 Writable 接口,是可序列化的。
下面重点讨论Configuration类,这个类实现了两个接口:Iterable 迭代接口、Writable 序列化接口
主要属性:
(1)static代码段首先获得了当前线程的类加载器然后找到资源hadoop-site.xml,如果找到了这个资源文件,就会log出一段提示信息: 因为找到了hadoop-site.xml这个文件,那么core-default.xml、hdfs-default.xml、mapred- default.xml的文件中的配置信息将会被core-site.xml、hdfs-site.xml、mapred-site.xml三个文件中的 配置所取代,从这段日志中也可以看出*-site的配置文件的优先级要高于*-default文件。
(2)defaultResources是个CopyOnWriteArrayList的连续数组,这个CopyOnWriteArrayList类会在io包中具体分析,这个数组的目的是存储配置文件的名字而不是配置文件的全路径,配置文件指的就是上文中提到的xml文件。
(3)finalParameters存储所有被声明为final的参数
(4)loadDefault是布尔类型的变量意思是是否加载默认的配置信息,也就是上文中提到的三个default.xml中的配置
(5)LOG是用apache的logging包中的日志方式记录日志
(6)int MAX_SUBST = 20 是设定对带有环境变量的值所能够深入解析的层次数,超出这个最大的层数的值将不能够解析
(7)overlay属性类型变量,记录了进行覆盖的属性
(8)properties存储的是Configuration对象中读取到的全部配置信息
(9)布尔值quietmode: 对应的是配置信息加载过程是否属于默认的模式,如果属于默认的模式下也就是快速模式,则在配置信息加载的过程中的一些信息不会记录在日志中,这个值的作用是影响log的输出,当然也会影响一些异常的抛出。
(10)REGISTRY是一个WeakHashMap的变量,key为Configuration,value为Object,可以看出这个对象存储了不同对象的多个配置信息,弱HashMap可以自动清除不在正常使用的键对应的条目,发现如果这个值不是null会重新加载默认的配置文件中的信息。
(11)resources列表中存放了包含配置信息的对象。
(12)varPat对含有环境变量的值的进行转换的正则表达式对象。
//Hadoop在创建配置类的时候,考虑了三种资源:
//
//URL资源(网络资源,指的是一个链接);
//
//CLASSPATH资源(String形式);
//
//Hadoop文件系统中的Path资源(该资源是基于Hadoop的FileSystem的,使用斜线“/”作为分隔符,如果是绝对路径,应该以“/”开始)
public class Configuration implements Iterable<Map.Entry<String,String>>,
Writable {
//LOG是记录日志的对象
private static final Log LOG = LogFactory.getLog(Configuration.class);
//quietmode对应的是配置信息加载过程是否属于默认的模式,如果属于默认的模式下也就是快速模式,则在配置信息加载的过程中的一些信息不会记录在日志中
private boolean quietmode = true;
/**
* List of configuration resources.
* resources是一个对象组,用于存放有关包含配置信息的对象。
*/
private ArrayList<Object> resources = new ArrayList<Object>();
/**
* List of configuration parameters marked <b>final</b>.
* 是所有配置值被声明为final变量的集合
*/
private Set<String> finalParameters = new HashSet<String>();
//是否加载默认配置
private boolean loadDefaults = true;
/**
* Configuration objects
* 用于多有个对象的相关配置的注册对它们进行管理,弱哈希可以自动清除不再正常使用的键对应的条目
*/
private static final WeakHashMap<Configuration,Object> REGISTRY =
new WeakHashMap<Configuration,Object>();
/**
* List of default Resources. Resources are loaded in the order of the list
* entries
* defaultResources用于存储默认的配置资源名或者路径
*/
private static final CopyOnWriteArrayList<String> defaultResources =
new CopyOnWriteArrayList<String>();
/**
* Flag to indicate if the storage of resource which updates a key needs
* to be stored for each key
*/
private boolean storeResource;
/**
* Stores the mapping of key to the resource which modifies or loads
* the key most recently
*/
private HashMap<String, String> updatingResource;
//如果是老版本的hadoop则加载配置文件hadoop-site.xml不是老版本则加载配置文件core-default.xml,core-site.xml
static{
//print deprecation warning if hadoop-site.xml is found in classpath
ClassLoader cL = Thread.currentThread().getContextClassLoader();
if (cL == null) {
cL = Configuration.class.getClassLoader();
}
if(cL.getResource("hadoop-site.xml")!=null) {
LOG.warn("DEPRECATED: hadoop-site.xml found in the classpath. " +
"Usage of hadoop-site.xml is deprecated. Instead use core-site.xml, "
+ "mapred-site.xml and hdfs-site.xml to override properties of " +
"core-default.xml, mapred-default.xml and hdfs-default.xml " +
"respectively");
}
addDefaultResource("core-default.xml");
addDefaultResource("core-site.xml");
}
//properties存储的是Configuration对象中的全部配置信息,类型Properties是Java提供的对KV配置的一个属性集,提高了对KV配置参数的存储和操作方法
private Properties properties;
//overlay则是进行覆盖的属性
private Properties overlay;
//主要是用于配置冲根据配 置的参数构造相应的对象实例时提供上下文环境的类加载器
private ClassLoader classLoader;
{
classLoader = Thread.currentThread().getContextClassLoader();
if (classLoader == null) {
classLoader = Configuration.class.getClassLoader();
}
}
.............
}
主要方法:
(1)初始化方法:
Configuration() :默认构造函数
Configuration(boolean loadDefaults):是否加载默认配置的构造函数
Configuration(Configuration other):通过克隆其他的配置对象配置来构造自己,这个构造函数主要克隆了resources、properties、overlay和 finalParameters四个对象,克隆的时候加了线程锁,确保在同一个jvm下的单线程执行,这个也很容易理解,为了保证配置的统一。
(2)增加资源的方法:
addResource(InputStream in):通过inputstream流来增加资源
addResource(Path file):通过制定的path文件加载资源
addResource(String name):通过资源名称来加载资源
addResource(URL url):通过资源的url来加载资源
上述四个方法的实现都调用了
addResourceObject(Object resource)这个方法,这个方法的设计巧妙之处在于参数是Object类型,充分体现了面向对象设计中的李氏替换的原则,把资源全部加入 resources变量后调用reloadConfiguration()方法重新加载配置信息。
(3)设置资源属性的方法:
set(String name, String value):设置指定参数的值,因为是加载后设置,所以除了要在设置properties中设置以外还需要在overlay中设置,表明之前的属性被覆盖掉了。
setBoolean(String name, boolean value):设置参数的布尔值
setBooleanIfUnset(String name, boolean value) :如果指定的属性没设置,则设置值为指定的布尔值
其他的set方法基本大同小异
(4)取得资源属性的方法:
这些方法很多与set方法相似,就是取得设置的资源属性的值,还有一些是取得Configuration对象中属性的值。
(5)其他方法:
Properties getProps():获得properties对象和overlay对象中的属性配置
reloadConfiguration():清除properties和finalParameters以便于重新加载配置信息
substituteVars(String):上面的正则表达式对象对含有环境变量的参数值进行解析的方法