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

[经验分享] [转]Hadoop源码分析 之Configuration配置

[复制链接]

尚未签到

发表于 2015-7-13 11:39:05 | 显示全部楼层 |阅读模式
  本文转自:http://blog.iyunv.com/dahaifeiyu/article/details/6655652
  
  
  最近也觉得应该仔细的看一下Hadoop的源代码了,以前只是懂得基本的架构了使用,最近在做一个系统,觉得很多东西可以借鉴MapReduce的 可扩展性。但是当我们的系统的0.1版本出现的时候才发现我们的配置上很混乱。于是我自己的看了一下Hadoop的Configuration类,真的觉 得Hadoop的配置是值得借鉴的,学到了很多!下面是Configuration类的属性清单:
DSC0000.gif
  Log是记录日志的对象。quietmode对应的是配置信息加载过程中是否属于静默的模式,如果处于静默的模式下,则在配置信息加载的过程中的一些信息 不会被记录在日志中,默认情况是设置为true的。resources是一个对象数组,用于存放有关包含配置信息的对象。finalParameter是 所有配置值被声明为final的变量的一个集合。loadDefault从表面字段上可以理解为是否要加载默认的配置。REGISTRY是一个 WeakHashMap,用于多有个对象的相关配置的注册对它们进行管理,弱哈希可以自动清除不在正常使用的键对应的条目。 defaultResources是一个CopyOnWrite的字符串数组,用于存储默认的配置资源名或者路径。{…}是一个静态初始化块,用于加载默 认的配置资源。properties存储的是Configuration对象中的全部配置信息,它的类型是Properties的,这个类型是Java提 供的对KV配置的一个属性集,提高了对KV配置参数的存储和操作方法。overlay则是进行覆盖的属性。classLoader主要是用于配置冲根据配 置的参数构造相应的对象实例时提供上下文环境的类加载器。varPat是一个对含有环境变量的值的进行转换的正则表达式对象,比如我们设定的一个路径变量 的值为$HOME/data,那么这个变量就会以一定的规则把该变量的值分为字串$HOME和/data,之后会把$HOME解析成系统上的家目录了。 MAX_SUBST是设定对带有环境变量的值所能够深入解析的层次数,超出这个最大的层数的值将不能够解析。
  下面具体的说一下各个方法的情况。Configuration类的方法按照访问控制来分有两类,就是private和public,其中private主要是public方法的一些工具。其中:
  构造方法三个:
DSC0001.gif
  第二个是可以指定是否加载默认设置,默认为true,第三个是用一个configuration对象构造一个新的configuration对象。
  下面是几个添加配置资源的方法:
DSC0002.gif
  分别是添加默认的或者指定的各种来源的配置资源,而reloadConfiguration()则是一个清除所有原有配置信息,以便于重新加载配置信息的方法,这可以在值的覆盖中或者用新的配置资源覆盖之前的配置资源的时候用到。
  下面主要是获取一些配置信息的set或者get方法和其他方法:
DSC0003.gif
DSC0004.gif
  
  substituteVars(String)方法就是配合上面的正则表达式对象对含有环境变量的参数值进行解析的方法。后面的set和get方法主要是 获取各种参数值的方法,它的主要机制是通过getPros()调用 loadResources(Properties,ArrayList,boolean)方法再调用 loadResource(Properties,Object,boolean)加载配置资源中的配置信息,而set(String,String)和 get(String)的方法中会调用getPros()方法获取当前Configuration对象的properties对象,如果该对象为空,则调 用loadResources(Properties,ArrayList,boolean)方法加载配置信息,之后的其他get和set方法都是通过调 用get(String)和set (String,String)方法来实现对配置信息的操作的。最后几个方法分别是size()方法是获取配置信息大小的,clear()方法是用于清除 配置信息的,IntegerRanges是一个关于整型数范围的内部类,iterator()是配置对象的一个迭代器,最后的 readFields(DataInput)方法和write(DataOutput)方法则是因为Configuration类实现了Writable 接口的实现方法,这样Configuration类就可以在集群中进行分发,使得同一个作业的所有节点上的配置信息都完全相同。
  这就是Hadoop的配置信息的核心类,从这里可以看出一个大型的分布式系统中该如何去提供一个有价值的配置,来实现系统的可用和满足业务的灵活性。我总结有一下几点:
  1.     需要提供各种的set和get方法,方便获取各种的配置参数值,比如上面的大量的set和get方法以及它们的实现逻辑。
  2.     适当的集合垃圾回收机制和线程同步问题采用合理的存储数据结构,比如这里用到的弱哈希和CopyOnWriteArrayList,还有在对Configuration.class进行的加锁
  3.     分布式系统中的配置一定要实现序列化,这样才能在集群中保持配置信息的一致性,使得配置信息可以从流中来到留中去。
  4.     一个分布式系统的配置方法应该是至少分为3层的,第一层就是默认的,也是全局的静态配置,第二层是可以针对每个作业可以定制的参数,这个是用 Configuration中的set方法即可做到,第三层就是通过命令行的方式为一次的作业进程组定制配置参数。这三层的作用域不同,他们的作用域依次 是全局系统、一个作业程序、一次作业运行的进程组,每一次都可以覆盖前一层的参数值。
  在这里我觉得对于Hadoop的配置参数过多,通过set方法设置需要知道相应的参数名字,这是很不方便的,但是也满足了灵活性,用户可以自己定制配置参数。也可以提供一个枚举类对相应的参数给予描述,用起来会更方便一些。
  

运维网声明 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.yunweiku.com/thread-86294-1-1.html 上篇帖子: Hadoop学习笔记二 安装部署 下篇帖子: Hadoop日志分析工具——White Elephant
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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