求韩剧《听见你声音韩剧百度云的声音》百度云资源,付费勿扰,谢谢

Hadoop源代码分析 之hadoop配置及启动(1)—–classpath与配置文件&&categories:&&tags:&&author:原创文章,转载请指明出处并保留原文url地址hadoop是基于java平台的,他有自己的启动及管理脚本,他的启动脚本是如何工作,他的程序是如何启动的,启动过程中配置文件如何传递的,他同普通java项目的区别在那里,为什么我们必须用hadoop脚本来启动hadoop系统以及运行我们自定义的程序。从本文开始,我们将正式进入hadoop源代码中,本文重点阐述hadoop启动过程中配置文件的加载,希望通过文章来解答上面的问题。本文是对分析过程的一个描述,文章后面还会有两个视频文件, 分别是代码静态分析以及动态分析过程,大家根据习惯参考阅读。系列文章简介,hadoop代表一种新的编程思想,基于hadoop有很多衍生项目,充分利用他们是非常必要的,同时hadoop又是一个复杂系统,若能理解他的工作原理对我们将有非常大的帮助,我们以hadoop 0.1.0版本为基础逐步分析他的基本工作原理、结构、思路等等,本文是系统文章的一部分,系列文章详情参见希望通过这个能帮助我们理解生产中hadoop。 时间有限,经验不足,疏漏难免,在这里仅分享一些心得,希望对大家能起到一个抛砖引玉的作用,有问题请大家给我留言或者评论等,这样也能对我的工作有很大帮助。感谢您阅读这篇文章!一.Hadoop文件组成Hadoop程序解压缩完成后源代码如下图Bin目录,hadoop脚本,管理及维护hadoop系统,Conf目录,hadoop配置文件,hadoop系统相关信息等,Docs目录,文档目录Lib目录,hadoop依赖的相关jar文件Src目录,hadoop源代码文件Webapps目录, hadoop内嵌的webserver的j2ee程序目录相关文件:Build.xml文件时hadoop的ant编译配置文件其他文件略二.Hadoop基本启动过程假设hadoop程序安装主目录用${hadoop_home}表示管理人员可以执行${hadoop_home}\bin\start-all.sh文件启动hadoop系统这个脚本将根据conf目录中相关配置文件,启动datanode,namenode,tasktracter,jobtracter等程序Hadoop的几个主要配置文件如下:那么脚本在启动hadoop程序中,配置文件信息如何传递给java程序,java程序是如何加载的?本文将以datanode启动过程为例分析hadoop的配置文件传递,然后后续将逐步分析其他启动程序的配置文件的启动情况。三.程序员角度看待hadoop启动我们打开hadoop的源代码项目(eclipse的java项目)如下图,我们打开如上目录及java源代码文件双击左侧 main函数的节点, 然后右面显示相关源代码, 然后在“runAndWait(new Configuration());”函数调用处,右击鼠标,弹出相关对话框,选择“open Declaration” 选项, 可以直接使用快捷方式 F3按键,可以快速到达相关源代码处代码如下:private static void runAndWait(Configuration conf) throws IOException {run(conf); // 调用run函数,进行相关业务逻辑(注意这里的参数对象 conf是在哪里创建的????? 这个非常重要,呕!!!) // Wait for sub threads to exit 等等线程 退出for (Iterator iterator = subThreadList.iterator(); iterator.hasNext();) {Thread threadDataNode = (Thread) iterator.next();try {threadDataNode.join();} catch (InterruptedException e) {if (Thread.currentThread().isInterrupted()) {// did someone knock?return;}}}}下面我们看一下配置文件是在哪里创建,我们可以回顾一下main函数,如下图看红色区域,代码,这个代码创建一个匿名的 配置对象,这个配置对象,采用默认的构造函数。配置类的构造函数如下/** A new configuration. */public Configuration() {defaultResources.add(“hadoop-default.xml”); // 添加配置文件,最大问题,这里仅仅有文件名,没有文件路径,系统到哪里去找文件?finalResources.add(“hadoop-site.xml”); // 添加配置文件,同上面有相同问题}稍后我们在解释。。。下面我们看一下run函数(这里run函数同java线程里面的run函数不是同一个类型的,仅仅是名称相同)/** Start datanode daemons.* Start a datanode daemon for each comma separated data directory* specified in property dfs.data.dir*/public static void run(Configuration conf) throws IOException {String[] dataDirs = conf.getStrings(“dfs.data.dir”); // 这里面就调用了我们今天需要重点解决的问题,这里调用配置,配置从哪里来的。 Conf对象在哪里来的&下面代码不再今天解释之列,今天可以忽略!!!subThreadList = new Vector(dataDirs.length);for (int i = 0; i & dataDirs. i++) {DataNode dn = makeInstanceForDir(dataDirs[i], conf);if (dn != null) {Thread t = new Thread(dn, “DataNode: “+dataDirs[i]);t.setDaemon(true); // needed for JUnit testingt.start();subThreadList.add(t);}}}本函数中重点是: String[] dataDirs = conf.getStrings(“dfs.data.dir”); 这行语句的相关情况,直接关联hadoop启动过程中,配置文件的相关获取方法。并且这个过程在整个hadoop中都是类似的,仅仅是获取的配置信息不同而已,但是过程,方法都是非常相似的。上面函数将调用下面的函数,如下/** Returns the value of the &code&name&/code& property as an array of* strings. If no such property is specified, then &code&null&/code&* is returned. Values are whitespace or comma delimted.*/public String[] getStrings(String name) {String valueString = get(name); // 重点语句,负责初始化相关代码,我们需要跟踪进入相关代码if (valueString == null)return null;StringTokenizer tokenizer = new StringTokenizer (valueString,”, \t\n\r\f”);List values = new ArrayList();while (tokenizer.hasMoreTokens()) {values.add(tokenizer.nextToken());}return (String[])values.toArray(new String[values.size()]);}相关函数代码如下:/** Returns the value of the &code&name&/code& property, or null if no* such property exists. */public String get(String name) { return getProps().getProperty(name);}如下图中用特别颜色标注的代码。getProps()这是个函数调用,函数调用后会返回一个对象。getProps().getProperty(name);,根据前一个函数返回的对象,然后调用哪个对象的一个函数下面是getProps函数的代码private synchronized Properties getProps() {if (properties == null) { // 请特别注意这里面的代码,当系统构造配置对象后,这个对象默认是null值的,因此将执行下面代码块中语句的Properties newProps = new Properties(); // 创建一个资源loadResources(newProps, defaultResources, false, false); // 装载一个资源,本函数中关键代码!!!!loadResources(newProps, finalResources, true, true);properties = newP}return}下面是 配置类中properties 的定义,如下:private P // java中对象默认没有new时 是null的。装载资源文件函数如下private void loadResources(Properties props,ArrayList resources,boolean reverse, boolean quiet) {ListIterator i = resources.listIterator(reverse ? resources.size() : 0);while (reverse ? i.hasPrevious() : i.hasNext()) {loadResource(props, reverse ? i.previous() : i.next(), quiet); // 循环装入配置文件中的配置,将配置信息存入Properties props中,返回给上层函数。(小问题:java参数一般都是传递值的, 为什么能返回数据给上层???)}}具体装载资源函数如下private void loadResource(Properties properties, Object name, boolean quiet) {try {DocumentBuilder builder =DocumentBuilderFactory.newInstance().newDocumentBuilder();Document doc = null;// 我们目前的程序默认进入的,是走第一个if分支,即name是string类型的,相关情况可以在动态分析中获取到if (name instanceof String) { // a CLASSPATH resourceURL url = getResource((String)name); // 从classpath路径中加载一个命名的资源,一般为文件等if (url != null) {LOG.info(“parsing ” + url);doc = builder.parse(url.toString()); // 解析这个文件}} else if (name instanceof File) { // a file resourceFile file = (File)if (file.exists()) {LOG.info(“parsing ” + file);doc = builder.parse(file);}}if (doc == null) {if (quiet)return;throw new RuntimeException(name + ” not found”);}// 获取相关配置信息,本是系列文章重点,我们重点研究程序运行脉络,细节都可以忽略!!!!Element root = doc.getDocumentElement();if (!”configuration”.equals(root.getTagName()))LOG.severe(“bad conf file: top-level element not &configuration&”);NodeList props = root.getChildNodes();for (int i = 0; i & props.getLength(); i++) {Node propNode = props.item(i);if (!(propNode instanceof Element))continue;Element prop = (Element)propNif (!”property”.equals(prop.getTagName()))LOG.warning(“bad conf file: element not &property&”);NodeList fields = prop.getChildNodes();String attr = null;String value = null;for (int j = 0; j & fields.getLength(); j++) {Node fieldNode = fields.item(j);if (!(fieldNode instanceof Element))continue;Element field = (Element)fieldNif (“name”.equals(field.getTagName()))attr = ((Text)field.getFirstChild()).getData();if (“value”.equals(field.getTagName()) && field.hasChildNodes())value = ((Text)field.getFirstChild()).getData();}if (attr != null && value != null)properties.setProperty(attr, value);}} catch (Exception e) {LOG.severe(“error parsing conf file: ” + e);throw new RuntimeException(e);}}这个类是上面调用的 加载资源的实现方法/** Returns the URL for the named resource. */public URL getResource(String name) {return classLoader.getResource(name);}好了,我们已经基本分析完成启动的基本过程, 万里长征我们终于走出第一步,胜利就在我们脚下。神秘面纱终于揭开一角,一切即将在眼前展现!!!!!&& (17.63M, 日 09:56 到期) (39.41M, 日 09:56 到期) 参考文章 hadoop 相关视频下载地址: 近期文章
分类目录选择分类目录书路&&(10)儿童画&&(121)&&&儿童作品&&(82)&&&儿童画教程&&(24)原创&&(127)&&&0基础编程&&(23)&&&android&&(9)&&&hadoop&&(18)&&&java原创&&(2)&&&livewriter&&(11)&&&nginx&&(52)资料&&(1,038)&&&android资料&&(83)&&&java资料&&(74)&&&linux资料&&(36)&&&mq&&(24)&&&mysql资料&&(34)&&&nginx资料&&(17)&&&svn&&(9)&&&wordpress&&(48)&&&搜索资料&&(45) 文章归档 选择月份 2017年七月 &(12) 2017年六月 &(23) 2017年五月 &(35) 2017年四月 &(38) 2017年三月 &(20) 2017年二月 &(5) 2017年一月 &(9) 2016年十二月 &(8) 2016年十一月 &(1) 2016年十月 &(10) 2016年九月 &(5) 2016年八月 &(8) 2016年七月 &(6) 2016年六月 &(9) 2016年五月 &(14) 2016年四月 &(6) 2016年三月 &(21) 2016年二月 &(11) 2016年一月 &(15) 2015年十二月 &(18) 2015年十一月 &(14) 2015年十月 &(6) 2015年九月 &(6) 2015年八月 &(7) 2015年七月 &(11) 2015年六月 &(19) 2015年五月 &(27) 2015年四月 &(19) 2015年三月 &(35) 2015年二月 &(38) 2015年一月 &(20) 2014年十二月 &(8) 2014年十一月 &(8) 2014年十月 &(3) 2014年九月 &(3) 2014年八月 &(3) 2014年七月 &(4) 2014年六月 &(3) 2014年五月 &(7) 2014年四月 &(9) 2014年三月 &(8) 2014年二月 &(8) 2014年一月 &(11) 2013年十二月 &(11) 2013年十一月 &(9) 2013年十月 &(40) 2013年九月 &(79) 2013年八月 &(50) 2013年七月 &(68) 2013年六月 &(50) 2013年五月 &(59) 2013年四月 &(65) 2013年三月 &(59) 2013年二月 &(20) 2013年一月 &(59) 2012年十二月 &(52) 2012年十一月 &(91) 2012年十月 &(23)

我要回帖

更多关于 韩剧听见你的声音 的文章

 

随机推荐