• Hadoop Configuration


    Configuration的主要是加载配置文件,并储存在properties中。

    细节内容不重复了,主要参考Hadoop技术内幕,Hadoop源代码,以及:

    http://blog.csdn.net/zhoubangtao/article/details/25977561

    • 整个资源的加载流程如下:

    • 过程中遇到的问题:
      • Java Io 学习:
        • http://blog.csdn.net/yczz/article/details/38761237
      • Document Builder使用:
        • http://blog.csdn.net/redarmy_chen/article/details/12912065
        • http://docs.oracle.com/javase/7/docs/api/javax/xml/parsers/DocumentBuilder.html
    package com.baidu.configuration;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.File;
    import java.io.BufferedInputStream;
    import java.io.FileInputStream;
    import java.lang.System;
    import java.util.Objects;
    import java.util.Properties;
    import java.net.URL;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    
    import org.w3c.dom.DOMException;
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    import org.w3c.dom.Text;
    import org.xml.sax.SAXException;
    
    
    public class Configuration {
    
        private Properties properties;
    
        /**
         * 判断参数是否为空,并对url进行处理
         * @param builder
         * @param url
         * @return
         * @throws IOException
         * @throws SAXException
         */
        private Document parse(DocumentBuilder builder, URL url)
                throws IOException, SAXException {
            if (url == null) {
                return null;
            }
            return parse(builder, url.openStream(), url.toString());
        }
    
        /**
         * 判断参数是否为空,实际调用Documentbuilder parse 函数
         * @param builder
         * @param is
         * @param systemId
         * @return
         * @throws IOException
         * @throws SAXException
         */
        private Document parse(DocumentBuilder builder, InputStream is,
                               String systemId) throws IOException, SAXException {
            if (is == null) {
                return null;
            }
            try {
                return (systemId == null) ? builder.parse(is) : builder.parse(is,
                        systemId);
            } finally {
                is.close();
            }
        }
    
    
        /**
         * 获取 properties 对应key的value
         * @param key
         * @return
         */
        public String get(String key) {
            return properties.getProperty(key);
        }
    
        public void addResource(String source_name) {
            properties = new Properties();
            loadResource(properties, source_name);
        }
    
        /**
         * 通过DocumentBuilder来解析xml文件, resource 直接使用了 Object 来代替,
         * 实际就是一个字符串
         * @param properties 储存的prpoerties
         * @param resource xml文件的绝对路径
         */
        public void loadResource(Properties properties, Object resource) {
            try {
                DocumentBuilderFactory docBuilderFactory
                        = DocumentBuilderFactory.newInstance();
    
                //ignore all comments inside the xml file
                docBuilderFactory.setIgnoringComments(true);
    
                //allow includes in the xml file
                docBuilderFactory.setNamespaceAware(true);
                try {
                    docBuilderFactory.setXIncludeAware(true);
                } catch (UnsupportedOperationException e) {
                    System.out.println("Failed to set setXIncludeAware(true) for parser");
                }
                DocumentBuilder builder = docBuilderFactory.newDocumentBuilder();
                Document doc = null;
                Element root = null;
    
                if (resource instanceof String) {          // a file resource
                    // Can't use FileSystem API or we get an infinite loop
                    // since FileSystem uses Configuration AP
                    //
                    //I.  Use java.io.File instead.
                    File file = new File(((String)resource)).getAbsoluteFile();
                    if (file.exists()) {
                        doc = parse(builder, new BufferedInputStream(
                                new FileInputStream(file)), ((String)resource).toString());
                    }
                }
    
                root = doc.getDocumentElement();
    
                NodeList props = root.getChildNodes();
    
                for (int i = 0; i < props.getLength(); i++) {
                    Node propNode = props.item(1);
    
                    Element prop = (Element)propNode;
    
                    if ("configuration".equals(prop.getTagName())) {
                        loadResource(properties, prop.getTagName());
                    }
    
                    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)fieldNode;
                        if ("name".equals(field.getTagName()) && field.hasChildNodes())
                            attr = ((Text)field.getFirstChild()).getData().trim();
    
                        if ("value".equals(field.getTagName()) && field.hasChildNodes())
                            value = ((Text)field.getFirstChild()).getData().trim();
                    }
                    //System.out.println("name is " + attr);
                    //System.out.println("value is " + value);
                    properties.setProperty(attr, value);
                }
    
            } catch (IOException e) {
                e.printStackTrace();
            } catch (DOMException e) {
                e.printStackTrace();
            } catch (SAXException e) {
                e.printStackTrace();
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String args[]) {
            //System.out.println("Hello");
            Configuration c = new Configuration();
            c.addResource("test.xml");
    
            String value = c.get("yarn.nodemanager.aux-services");
            System.out.println(value);
        }
    
    }
  • 相关阅读:
    Java_流程控制
    Java_循环
    Java_集合
    Java_泛型
    关于DTO的理解
    IDEA_Springboot启动Tomcat报错_APR
    canvas画圆又毛边
    关于数字加载的动画 jquery
    微信里关闭窗口 js
    依赖jquery的select皮肤2
  • 原文地址:https://www.cnblogs.com/SpeakSoftlyLove/p/5384377.html
Copyright © 2020-2023  润新知