设为首页 收藏本站
查看: 1860|回复: 0

[经验分享] 第四章:小朱笔记hadoop之源码分析-conf分析

[复制链接]

尚未签到

发表于 2016-12-13 07:27:10 | 显示全部楼层 |阅读模式
 

第三章:小朱笔记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)初始化方法:
 

DSC0000.png
 
 
Configuration() :默认构造函数
Configuration(boolean loadDefaults):是否加载默认配置的构造函数
Configuration(Configuration other):通过克隆其他的配置对象配置来构造自己,这个构造函数主要克隆了resources、properties、overlay和 finalParameters四个对象,克隆的时候加了线程锁,确保在同一个jvm下的单线程执行,这个也很容易理解,为了保证配置的统一。

(2)增加资源的方法:
 
DSC0001.png
 
addResource(InputStream in):通过inputstream流来增加资源
addResource(Path file):通过制定的path文件加载资源
addResource(String name):通过资源名称来加载资源
addResource(URL url):通过资源的url来加载资源
上述四个方法的实现都调用了
addResourceObject(Object resource)这个方法,这个方法的设计巧妙之处在于参数是Object类型,充分体现了面向对象设计中的李氏替换的原则,把资源全部加入 resources变量后调用reloadConfiguration()方法重新加载配置信息。

(3)设置资源属性的方法:
 
DSC0002.png
 
set(String name, String value):设置指定参数的值,因为是加载后设置,所以除了要在设置properties中设置以外还需要在overlay中设置,表明之前的属性被覆盖掉了。
setBoolean(String name, boolean value):设置参数的布尔值
setBooleanIfUnset(String name, boolean value) :如果指定的属性没设置,则设置值为指定的布尔值
其他的set方法基本大同小异

(4)取得资源属性的方法:
 
DSC0003.png
 
这些方法很多与set方法相似,就是取得设置的资源属性的值,还有一些是取得Configuration对象中属性的值。

(5)其他方法:
Properties getProps():获得properties对象和overlay对象中的属性配置
reloadConfiguration():清除properties和finalParameters以便于重新加载配置信息
substituteVars(String):上面的正则表达式对象对含有环境变量的参数值进行解析的方法

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-313386-1-1.html 上篇帖子: 实验室要做一个hadoop上传文件性能测试,自己用实验室破电脑做了个简单的测试 下篇帖子: 施宏良:Hadoop安全概述—从基础安全部署到高级服务 视频观后感
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表