最近也觉得应该仔细的看一下Hadoop的源代码了,以前只是懂得基本的架构了使用,最近在做一个系统,觉得很多东西可以借鉴MapReduce的可扩展性。但是当我们的系统的0.1版本出现的时候才发现我们的配置上很混乱。于是我自己的看了一下Hadoop的Configuration类,真的觉得Hadoop的配置是值得借鉴的,学到了很多!下面是Configuration类的属性清单:

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方法的一些工具。其中:

构造方法三个:

第二个是可以指定是否加载默认设置,默认为true,第三个是用一个configuration对象构造一个新的configuration对象。

下面是几个添加配置资源的方法:

分别是添加默认的或者指定的各种来源的配置资源,而reloadConfiguration()则是一个清除所有原有配置信息,以便于重新加载配置信息的方法,这可以在值的覆盖中或者用新的配置资源覆盖之前的配置资源的时候用到。

下面主要是获取一些配置信息的set或者get方法和其他方法:

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方法设置需要知道相应的参数名字,这是很不方便的,但是也满足了灵活性,用户可以自己定制配置参数。也可以提供一个枚举类对相应的参数给予描述,用起来会更方便一些。

转自http://blog.csdn.net/dahaifeiyu/article/details/6655652

转载于:https://www.cnblogs.com/blueofsky/archive/2012/10/19/Hadoop%e5%88%ab%e5%90%8d.html

Hadoop源代码分析之Configuration相关推荐

  1. Hadoop源代码分析

    http://wenku.baidu.com/link?url=R-QoZXhc918qoO0BX6eXI9_uPU75whF62vFFUBIR-7c5XAYUVxDRX5Rs6QZR9hrBnUdM ...

  2. Hadoop源代码分析 - MapReduce(转载)

    1. Hadoop源代码分析(MapReduce概论) http://caibinbupt.javaeye.com/blog/336467

  3. Hadoop源代码分析(完整图文版) part 1

    在网上看到了很多此文章的装载,但是都是纯文字,这篇文章在没有图片的情况下阅读起来意义不大了.花了点时间上传了100多张图片,希望对大家学习hadoop有帮助. Hadoop源代码分析(一) 关键字:  ...

  4. Hadoop源代码分析(完整版)

    Hadoop源代码分析(一) 关键字: 分布式云计算 Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算设施.  GoogleCluster:http:/ ...

  5. Hadoop源代码分析(包mapreduce.lib.input)

    接下来我们按照MapReduce过程中数据流动的顺序,来分解org.apache.hadoop.mapreduce.lib.*的相关内容,并介绍对应的基类的功能.首先是input部分,它实现了MapR ...

  6. Hadoop源代码分析(IFile)

    为什么80%的码农都做不了架构师?>>>    Mapper的输出,在发送到Reducer前是存放在本地文件系统的,IFile提供了对Mapper输出的管理.我们已经知道,Mappe ...

  7. Hadoop源代码分析(四)

    为org.apache.hadoop.io.compress等的分析预留位置 转载于:https://www.cnblogs.com/94julia/archive/2013/04/01/299281 ...

  8. Hadoop源代码分析(MapReduce概论)

    大家都熟悉文件系统,在对HDFS进行分析前,我们并没有花很多的时间去介绍HDFS的背景,毕竟大家对文件系统的还是有一定的理解的,而且也有很好的文档.在分析Hadoop的MapReduce部分前,我们还 ...

  9. Hadoop源代码分析(二)

    下面给出了Hadoop的包的功能分析. Package Dependences tool 提供一些命令行工具,如DistCp,archive mapreduce Hadoop的Map/Reduce实现 ...

最新文章

  1. C++与.net的编译方式
  2. Django博客系统(推荐文章数据展示)
  3. Linux基于expect(tcl)实现shell自动交互
  4. zsh 自动补全导致命令显示重复
  5. 201571030335/201571030320《小学四则运算练习软件软件需求说明》结对项目报告
  6. MySQL使用Amoeba作为Proxy时的注意事项
  7. java日志之slf4j与logback简单使用
  8. SpringBoot:如何处理SprintBoot提示Whitelabel Error Page以及了解原因?
  9. JSP小项目,会员管理系统之实现登录功能
  10. 新入职了一个卷王,一来就把性能提升4倍,这谁受的了~
  11. python工作区是什么_在IPython中保存工作区
  12. PIL修改带有透明像素的png图片颜色
  13. 求解最大公因子(JAVA辗转相除法)、python的最大公因子,最小公倍数
  14. MatLab imhist
  15. iphone手机屏幕投射电脑 简单几步教你完成
  16. 阿里研究员玄难:如何做电商中台
  17. git 将本地master分支代码提到远程develop分支
  18. excel小数不同的取整数的方法
  19. 图像处理之LUT表的使用
  20. 技术视角看行业SaaS

热门文章

  1. ARM 指令集跳转指令
  2. 无法打开登录所请求的数据库 sa。登录失败。 用户 sa 登录失败。
  3. c++--STL迭代器相关辅助函数
  4. 【操作系统】—进程的状态与转换
  5. 定时休眠 linux,linux系统编程手册 定时器和休眠
  6. 10元一瓶的普通白酒和2000元一瓶的茅台酒有什么区别?
  7. 喜欢独自喝茶的人是什么样的人
  8. 想赚钱?找自己的长板!
  9. 给创业前的你4点建议
  10. 产能过剩时代,为什么说“送比卖更赚钱”