Hadoop的源码实在庞大, 第一部分先分析Configuration。
Hadoop系统中的一个configuration,可以看做是一堆key-value对,保存在Configuration的properties属性中,而这些properties来源于 Resources,一个Resource可以是一个xml文件,可以是另一个Configuration,等等。Configuration会默认加载 core-default.xml和core-site.xml两个Resource。Configuration可以调用AddResource方法动 态加载Resource,加载后,会触发Hadoop系统中所有configuration的property重构。
为了知道Hadoop系统中有哪些Configuration, Configuration类中就由一个static 的 REGISTRY, 是一个WeakHashMap,但Value没有用到,保存了所有存在的Configuration。
WeakHashMap是一个比较有趣的东西。
HashMap当put(key,value)时,会给key加一个reference,当这个key在其他地方都被删除了,如果HashMap没有删除这个key, gc时是不会回收这个key的。
但WeakHashMap put (key, value)时,不会给key加一个reference, 当这个key在其他地方被删除后,gc之后,WeakHashMap会自动删除这个key, 所以,WeakHashMap非常适合管理资源,当资源被删除后,WeakHashMap也会自动删除这个key:
1. 新建WeakHashMap,将“键值对”添加到WeakHashMap中。实际上,WeakHashMap是通过数组table保存Entry(键值对);每一个Entry实际上是一个单向链表,即Entry是键值对链表。
2. 当某“弱键”不再被其它对象引用,并被GC回收时。在GC回收该“弱键”时,这个“弱键”也同时会被添加到ReferenceQueue(queue)队列中。
3. 当下一次我们需要操作WeakHashMap时,会先同步table和queue。table中保存了全部的键值对,而queue中保存被GC回收的键值对;同步它们,就是删除table中被GC回收的键值对。
这就是“弱键”如何被自动从WeakHashMap中删除的步骤了
property被触发重构后,所以当外部调用Configuration的get方法想得到某个property值时,会重新从各种Resource加载key-value对到properties里。
除 了AddResource,还有AddDefaultResource方法,一般是在Configuration初始化时使用,例如 Configuration会加载core-default.xml和core-site.xml两个Resource作为defaultResource,而其子类HdfsConfiguration会加载hdfs-default.xml和hdfs-site.xml作为defaultResource
defaultResource是static类型,也就是Hadoop系统里所有的Configuration都会共享defaultResource,所以要考虑线程安全问题,defaultResource是CopyOnWriteArrayList类型
CopyOnWriteArrayList是一个线程安全的ArrayList类型,会使用copy onwrite的方式,一般适合读多写少的情景,如果写多,copy on write就会copy太多次,影响性能
除了AddResource这回事,还可以使用Configuration的set方法修改properties,为了保留这些修改,Configuration里有overlay这个属性
总的来说Hadoop的Configuration并不复杂,主要维护一些properties供Hadoop计算时使用。