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

[经验分享] Hadoop源码学习笔记(1) ——第二季开始——找到Main函数及读一读Configure类

[复制链接]

尚未签到

发表于 2015-7-11 11:39:36 | 显示全部楼层 |阅读模式
  Hadoop源码学习笔记(1)
   ——找到Main函数及读一读Configure类
  前面在第一季中,我们简单地研究了下Hadoop是什么,怎么用。在这开源的大牛作品的诱惑下,接下来我们要研究一下它是如何实现的。
  提前申明,本人是一直搞.net的,对java略为生疏,所以在学习该作品时,会时不时插入对java的学习,到时也会摆一些上来,包括一下设计模式之类的。欢迎高手指正。
  整个学习过程,我们主要通过eclipse来学习,之前已经讲过如何在eclipse中搭建调试环境,这里就不多述了。
  在之前源码初窥中,我们已经找到了主要几个的main函数入口。所以这里我们列一列计划:


  • FsShell main入口: org.apache.hadoop.fs.FsShell

  • NameNode main入口: org.apache.hadoop.hdfs.server.namenode.NameNode

  • DataNode main入口: org.apache.hadoop.hdfs.server.datanode.DataNode

  • JobTracker main入口: org.apache.hadoop.mapred.JobTracker

  • TaskTracker main入口: org.apache.hadoop.mapred.TaskTracker
  我们会按这个顺序来研究,至于其他的像SecondeNameNode之类的,在最后再来研究。
  同样,针对这些内容,我们还会分一下,第一步先来看DFS,第二步再来看MapReduce部份。
  在研究DFS之前,我们看一下,这三者关系:
DSC0000.png
  其中NameNode是客户端的主接口,也是唯一的对接点,同时主要负责文件名目录管理,以及数据DataNode的映射。
  
  好了,要研究一块,我们先来把程序跑起来吧。
  在eclipse中我们很方便地就能找到每个模块的对应的main函数,但还是有些不便,为了调试方便,我们再新建三个入口类:
DSC0001.png
  自建入口类主要是为方便找到,然后这三个类中的代码分别为:
  FsShellEnter.java


  • import org.apache.hadoop.fs.FsShell;


  • public class FsShellEnter {


  •    public static void main(String[] args) throws Exception {

  •       FsShell.main(new String[]{"-ls"});

  •    }

  • }
  NamNodeEnter.java


  • public class NameNodeEnter {


  •    public static void main(String[] args) throws Exception {

  •       org.apache.hadoop.hdfs.server.namenode.NameNode.main(args);

  •    }

  • }
  DataNodeEnter.java


  • public class DataNodeEnter {


  •    public static void main(String[] args) {

  •       org.apache.hadoop.hdfs.server.datanode.DataNode.main(args);

  •    }

  • }
  运行之:
  启动命令行,运行:$ bin/hadoop namenode
  然后在eclipse中,打开FsShellEnter.java,然后点击运行,可以看到:
DSC0002.png
  
  反过来,在eclipse中,打开NamNodeEnter.java,点击运行,
DSC0003.png
  在控制台中,可以输入一堆的信息,说明正常了。
  然后打开命令行,输入:$ bin/hadoop fs -ls,可以看到:
DSC0004.png
  这样,说明正反运行都可以了。
  当然这里我们没有涉及文件内容操作,所以没有DataNode也没问题,不过可以自行试一下。
  
  打开这几个main函数,都可以看到上来都在初使化这个Configuration类。所以我们先来看一看这个类到底有点啥:
  先看一下之前我们如何用这个类的:


  • Configuration conf = new Configuration();

  • String name = conf.get("fs.default.name");

  • System.out.println(name);
  从字面意思及这段函数,可以看出Configuration类用于读取配置文件的,且该程序就是读出配置文件中fs.default.name的值。
  观察其构造函数:


  • public Configuration() {

  •     this(true);

  • }

  • public Configuration(boolean loadDefaults) {

  •     this.loadDefaults = loadDefaults;

  •     if (LOG.isDebugEnabled()) {

  •       LOG.debug(StringUtils.stringifyException(new IOException("config()")));

  •     }

  •     synchronized(Configuration.class) {

  •       REGISTRY.put(this, null);

  •     }

  •   }
  发现其本没有做什么操作,主要设置了一个loadDefaults值为true。
  然后再观察get函数:


  •   public String get(String name) {

  •     return substituteVars(getProps().getProperty(name));

  •   }

  • private synchronized Properties getProps() {

  •     if (properties == null) {

  •       properties = new Properties();

  •       loadResources(properties, resources, quietmode);

  •       if (overlay!= null)

  •         properties.putAll(overlay);

  •     }

  •     return properties;

  •   }
  Get函数先是调用了substituteVars函数,这个是正则表达式处理函数,对返回值进行去非法字符处理,然后getProps函数中,对hashtable类型的properties进行判断,如果为空则创建并进行初使化,否则直接返回。然后getProperty再根据其key值进行取值。
  很明显,这里是采用了懒加载的方式,就是说并没有一开始加载配置文件中的数据,而是等要访问时,才进行加载。
  进一步看如何初使化的,loadResources函数:


  • private void loadResources(Properties properties,

  •                              ArrayList resources,

  •                              boolean quiet) {

  •     if(loadDefaults) {

  •       for (String resource : defaultResources) {

  •         loadResource(properties, resource, quiet);

  •       }


  •       //support the hadoop-site.xml as a deprecated case

  •       if(getResource("hadoop-site.xml")!=null) {

  •         loadResource(properties, "hadoop-site.xml", quiet);

  •       }

  •     }


  •     for (Object resource : resources) {

  •       loadResource(properties, resource, quiet);

  •     }

  •   }
  这里第5行可看到先加载了defaultResources中的资源,然后再加载hadoop-site.xml(第10行)。
  defaultResources有哪些呢,一步步找,可以看到:


  • static{

  •    ...

  •     addDefaultResource("core-default.xml");

  •     addDefaultResource("core-site.xml");

  •   }

  • public static synchronized void addDefaultResource(String name) {...}
  从这里看到,默认加载了core-default.xml和core-site.xml这两个文件。
  到这里,我们可以再打开这3个XML来看看了:
DSC0005.png
DSC0006.png
  
  从这两个文件,我们可以看出,配置文件中存储就是用的key-value的健值对方式,然后加一个description对该配置项的描述。所以程序中读取也是传入key即可获取value。
  同时,core-site.xml是我们自己配置文件,仔细看,可发现,在core-defalut.xml中也有一些相同的配置项。加载时先加载defalut再site,后者有相同key时覆盖前者。
  所以换句话说,我们可以不配置hadoop.tmp.dir 则默认就在上面default中的/tmp….目录。
  同时也可相到,hadoop的其他配置,就可以参考core-default.xml中的了。 可以直接改,也可以在core-site中再复制一份再改。
  
  继续观察Configuration还有哪些方法:
DSC0007.png
  发现其中有很多个get函数,然后是返回各种不同类型的。这样就方便我们取值后直接处理了。
DSC0008.png
  同时,可以看到还有一堆的set函数。这些set函数追进去看,是在修改hashtable的,并没有保存。所以说这些用途也是可见的,不用配置文件也可以让Configuration工作起来。
  

运维网声明 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-85517-1-1.html 上篇帖子: Hadoop 分布式部署 下篇帖子: Hadoop学习笔记—2.不怕故障的海量存储:HDFS基础入门
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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