文档章节

Hadoop学习笔记7: 0.1.0的conf学习

强子大叔的码田
 强子大叔的码田
发布于 2014/08/07 15:01
字数 1851
阅读 582
收藏 23

0.1.0文件分析

类的关系图

Configurable【接口】

public interface Configurable {

 void setConf(Configuration conf);

//一个接口函数方法,设置配置对象

Configuration getConf();

//一个接口函数方法,返回配置对象

}

Configured【类】

public class Configured implements Configurable {

  private Configuration conf;

//具体的存储对象

  public Configured(Configuration conf) {

    setConf(conf);

  }

//构造函数初始化存储配置对象

  public void setConf(Configuration conf) {

    this.conf = conf;

  }

//实现接口,引用配置对象

  public Configuration getConf() {

    return conf;

  }

//实现接口,返回配置对象

}

Configuration【类】

public class Configuration {

  private static final Logger LOG =

LogFormatter.getLogger("org.apache.hadoop.conf.Configuration");

//日志对象

  private ArrayList defaultResources = new ArrayList();

//列表对象

  private ArrayList finalResources = new ArrayList();

//列表对象

  private Properties properties;

//属性k/v对象

  private ClassLoader classLoader = 

Thread.currentThread().getContextClassLoader();

//类加载对象

  public Configuration() {

    defaultResources.add("hadoop-default.xml");

finalResources.add("hadoop-site.xml");

//分别在两个集合里分别设置一个配置文件名

//类似于conf/nutch-site.xml

        conf/nutch-default.xml

  }

  

  public Configuration(Configuration other) {

    this.defaultResources = (ArrayList)other.defaultResources.clone();

    this.finalResources = (ArrayList)other.finalResources.clone();

    if (other.properties != null)

      this.properties = (Properties)other.properties.clone();

//基于别的对象复制其配置文件列表及属性集合对象

  }

  public void addDefaultResource(String name) {

    addResource(defaultResources, name);

  }//往默认集合列表里添加一个文件名

  public void addDefaultResource(File file) {

    addResource(defaultResources, file);

  }//往默认集合列表里添加一个文件

  public void addFinalResource(String name) {

    addResource(finalResources, name);

  }//final集合列表里添加一个文件名

  public void addFinalResource(File file) {

    addResource(finalResources, file);

  }//final集合列表里添加一个文件

  private synchronized void addResource(ArrayList resources, Object resource) {

resources.add(resource);                      

properties = null;

  }

//由多个函数调用,参数1的列表添加另外一个对象,并设置propertiesnull.

  

  public Object getObject(String name) { return getProps().get(name);}

//从属性集合里查找name对应的值

  public void setObject(String name, Object value) {

    getProps().put(name, value);

  }

//<name,value>设置到属性里

  public Object get(String name, Object defaultValue) {

    Object res = getObject(name);

    if (res != nullreturn res;

    else return defaultValue;

  }

//从属性集合里查找,同时提供默认值

  

  public String get(String name) 

return getProps().getProperty(name);}

//从属性集合里查找对应的value

  public void set(String name, Object value) {

    getProps().setProperty(name, value.toString());

  }

//设置<name,value>到属性中

  

  public String get(String name, String defaultValue) {

     return getProps().getProperty(name, defaultValue);

  }

//查找对应的值,同时提供默认值

  

  public int getInt(String name, int defaultValue) {

    String valueString = get(name);

    if (valueString == null)

      return defaultValue;

    try {

      return Integer.parseInt(valueString);

    } catch (NumberFormatException e) {

      return defaultValue;

    }

  }

//从属性集合中查找name对应的整数,同时提供默认值

  public void setInt(String name, int value) {

    set(name, Integer.toString(value));

  }

//添加<name,value>入集合

  public long getLong(String name, long defaultValue) {

    String valueString = get(name);

    if (valueString == null)

      return defaultValue;

    try {

      return Long.parseLong(valueString);

    } catch (NumberFormatException e) {

      return defaultValue;

    }

  }

//查找name对应的long,提供默认值

  public void setLong(String name, long value) {

    set(name, Long.toString(value));

  }

//同上

 

  public float getFloat(String name, float defaultValue) {

    String valueString = get(name);

    if (valueString == null)

      return defaultValue;

    try {

      return Float.parseFloat(valueString);

    } catch (NumberFormatException e) {

      return defaultValue;

    }

  }

//同上

 

  public boolean getBoolean(String name, boolean defaultValue) {

    String valueString = get(name);

    if ("true".equals(valueString))

      return true;

    else if ("false".equals(valueString))

      return false;

    else return defaultValue;

  }

//根据name对应的字符串返回true/false.提供默认值

   public void setBoolean(String name, boolean value) {

    set(name, Boolean.toString(value));

  }

//设置<name,value>入属性集合

  

  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()]);

  }

//根据name对应的值,分词,提取对应的字符串数组

  

  public Class getClass(String name, Class defaultValue) {

    String valueString = get(name);

    if (valueString == null)

      return defaultValue;

    try {

      return Class.forName(valueString);

    } catch (ClassNotFoundException e) {

      throw new RuntimeException(e);

    }

  }

//返回name对应的值对应的类,同时提供默认类值

  

  public Class getClass(String propertyName, Class defaultValue,Class xface) {

    try {

      Class theClass = getClass(propertyName, defaultValue);

      if (theClass != null && !xface.isAssignableFrom(theClass))

        throw new RuntimeException(theClass+" not "+xface.getName());

      return theClass;

    } catch (Exception e) {

      throw new RuntimeException(e);

    }

  }

//在提供默认类的前提下,查找propertyName对应的类,同时检测theClassxface的类/子类,否则报错。

    

  public void setClass(String propertyName, Class theClass, Class xface) {

    if (!xface.isAssignableFrom(theClass))

      throw new RuntimeException(theClass+" not "+xface.getName());

    set(propertyName, theClass.getName());

  }

//经过判断后,设置name对应的类

 

  public File getFile(String dirsProp, String path) throws IOException {

    String[] dirs = getStrings(dirsProp);

    int hashCode = path.hashCode();

    for (int i = 0; i < dirs.length; i++) {  // try each local dir

      int index = (hashCode+i & Integer.MAX_VALUE) % dirs.length;

      File file = new File(dirs[index], path).getAbsoluteFile();

      File dir = file.getParentFile();

      if (dir.exists() || dir.mkdirs()) {

        return file;

      }

    }

    throw new IOException("No valid local directories in property: "+dirsProp);

  }

//先查找dirsProp对应的字符串数组,根据一定的逻辑,生成一个文件夹并返回对应的文件

    public URL getResource(String name) {

    return classLoader.getResource(name);

  }

//返回name对应的url

 

  public InputStream getConfResourceAsInputStream(String name) {

    try {

      URL url= getResource(name);

      if (url == null) {

        LOG.info(name + " not found");

        return null;

      } else {

        LOG.info("found resource " + name + " at " + url);

      }

      return url.openStream();

    } catch (Exception e) {

      return null;

    }

  }

//打开文件的输入流

  

  public Reader getConfResourceAsReader(String name) {

    try {

      URL url= getResource(name);

      if (url == null) {

        LOG.info(name + " not found");

        return null;

      } else {

        LOG.info("found resource " + name + " at " + url);

      }

      return new InputStreamReader(url.openStream());

    } catch (Exception e) {

      return null;

    }

  }

//打开对应文件的输入流对象

  private synchronized Properties getProps() {

    if (properties == null) {

      Properties newProps = new Properties();

      loadResources(newProps, defaultResourcesfalsefalse);

      loadResources(newProps, finalResourcestruetrue);

      properties = newProps;

    }

    return properties;

  }

//根据2个列表里的文件或者文件名对应的配置信息构造properties

  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);

    }

  }

//根据参数来从2个方向来分别提取配置信息

  private void loadResource(Properties properties, Object name, boolean quiet) {

    try {

      DocumentBuilder builder =

        DocumentBuilderFactory.newInstance().newDocumentBuilder();

      Document doc = null;

      if (name instanceof String) {               // a CLASSPATH resource

        URL url = getResource((String)name);

        if (url != null) {

          LOG.info("parsing " + url);

          doc = builder.parse(url.toString());

        }

      } else if (name instanceof File) {          // a file resource

        File file = (File)name;

        if (file.exists()) {

          LOG.info("parsing " + file);

          doc = builder.parse(file);

        }

      }

//获得DOM文档

      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)propNode;

        if (!"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)fieldNode;

          if ("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);

    }

    

  }

//根据配置文件来设置<k,v>注意后面的配置会覆盖前面的配置

   public void write(OutputStream out) throws IOException {

    Properties properties = getProps();

    try {

      Document doc =

        DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();

      Element conf = doc.createElement("configuration");

      doc.appendChild(conf);

      conf.appendChild(doc.createTextNode("\n"));

      for (Enumeration e = properties.keys(); e.hasMoreElements();) {

        String name = (String)e.nextElement();

        Object object = properties.get(name);

        String value = null;

        if(object instanceof String) {

          value = (String) object;

        }else {

          continue;

        }

        Element propNode = doc.createElement("property");

        conf.appendChild(propNode);

      

        Element nameNode = doc.createElement("name");

        nameNode.appendChild(doc.createTextNode(name));

        propNode.appendChild(nameNode);

      

        Element valueNode = doc.createElement("value");

        valueNode.appendChild(doc.createTextNode(value));

        propNode.appendChild(valueNode);

        conf.appendChild(doc.createTextNode("\n"));

      }

    

      DOMSource source = new DOMSource(doc);

      StreamResult result = new StreamResult(out);

      TransformerFactory transFactory = TransformerFactory.newInstance();

      Transformer transformer = transFactory.newTransformer();

      transformer.transform(source, result);

    } catch (Exception e) {

      throw new RuntimeException(e);

    }

  }

//保存配置信息

  public String toString() {

    StringBuffer sb = new StringBuffer();

    sb.append("Configuration: ");

    sb.append("defaults: ");

    toString(defaultResources, sb);

    sb.append("final: ");

    toString(finalResources, sb);

    return sb.toString();

  }

//打印配置信息

  private void toString(ArrayList resources, StringBuffer sb) {

    ListIterator i = resources.listIterator();

    while (i.hasNext()) {

      if (i.nextIndex() != 0) {

        sb.append(" , ");

      }

      Object obj = i.next();

      if (obj instanceof File) {

        sb.append((File)obj);

      } else {

        sb.append((String)obj);

      }

    }

  }

//打印配置信息

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

    new Configuration().write(System.out);

  }

}

例子程序

package conf;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.io.Writer;

import java.net.URL;

import org.apache.hadoop.conf.Configurable;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.conf.Configured;

public class ConfTest {

private static ClassLoader classLoader = Thread.currentThread()

.getContextClassLoader();

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

//String dir = new File("").getAbsolutePath();

String dir = ClassLoader.getSystemResource("").getFile().toString();

System.out.println("classpath: "+dir);

StringBuffer defaultString = new StringBuffer();

defaultString.append("<configuration>");

defaultString.append(" <property>");

defaultString.append(" <name>name</name>");

defaultString.append(" <value>qiangzigege</value>");

defaultString.append(" </property>");

defaultString.append(" <property>");

defaultString.append(" <name>age</name>");

defaultString.append(" <value>1</value>");

defaultString.append(" </property>");

defaultString.append("</configuration>");

File defaultXml = new File(dir, "hadoop-default.xml");

defaultXml.deleteOnExit();

boolean create = defaultXml.createNewFile();

if(!create){

System.out.println("create failed for "+defaultXml.getAbsolutePath());

return;

}

System.out.println("create ok for "+defaultXml.getAbsolutePath());

// URL url = classLoader.getResource(defaultXml.getAbsolutePath());

Writer writer = new OutputStreamWriter(new FileOutputStream(defaultXml));

writer.write(defaultString.toString());

writer.flush();

writer.close();

// /

defaultString = new StringBuffer();

defaultString.append("<configuration>");

defaultString.append(" <property>");

defaultString.append(" <name>name</name>");

defaultString.append(" <value>qiangzigege</value>");

defaultString.append(" </property>");

defaultString.append(" <property>");

defaultString.append(" <name>age</name>");

defaultString.append(" <value>100</value>");

defaultString.append(" </property>");

defaultString.append("</configuration>");

defaultXml = new File(dir, "hadoop-site.xml");

System.out.println(defaultXml.getAbsolutePath());

defaultXml.deleteOnExit();

create = defaultXml.createNewFile();

if(!create){

System.out.println("create failed for "+defaultXml.getAbsolutePath());

return;

}

System.out.println("create ok for "+defaultXml.getAbsolutePath());

// URL url = classLoader.getResource(defaultXml.getAbsolutePath());

writer = new OutputStreamWriter(new FileOutputStream(defaultXml));

writer.write(defaultString.toString());

writer.flush();

writer.close();

//if(true)return;

// System.out.println("current-path:" + new

// File("./").getAbsolutePath());

Configuration config = new Configuration();

Configurable configurable = new Configured(config);

config = configurable.getConf();

String name = config.get("name");

int age = config.getInt("age", 6);

String result = "name: " + name + " age: " + age;

System.out.println(result);

}

}

© 著作权归作者所有

强子大叔的码田

强子大叔的码田

粉丝 922
博文 1504
码字总数 1256303
作品 9
南京
架构师
私信 提问
Hadoop学习笔记14:./bin/hadoop namenode -format之源码解析

上一节讲解了shell脚本运行的本质 这下让我们真正来一探类 org.apache.hadoop.dfs.NameNode PS:这年头不会源码不好混啊,生活所迫! 准备工作: 需要把相应的.xml文件放在正确的目录下 还有源...

强子哥哥
2014/08/20
579
5
Cascalog:Up and Run

运行 cascalog 经过几天的挣扎(业余时间),终于把 cascalog 运行起来。因为 hadoop 集群不是自己搭的,有一些关于安全方面的设置,对初学造成了一定的麻烦。反复尝试才跑起来。 创建项目 ...

ljie-PI
2013/12/08
173
0
Hdoop 学习笔记

简介:Hadoop分布式系统体系结构的核心: HDFS和MapReduce 。HDFS在集群上实现分布式文件系统,MapReduce在集群上实现了分布式计算和任务处理。HDFS在MapReduce任务处理过程中提供了文件操作...

james_lz
2016/03/08
118
0
【Azkaban搭建】---Azkaban 3.25.0搭建细则 超实用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LHWorldBlog/article/details/84305321 drop table active_sla;drop table execution_flows;drop table execu......

LHWorldBlog
2018/11/02
0
0
学习笔记TF065: TensorFlowOnSpark

Hadoop生态大数据系统分为Yam、 HDFS、MapReduce计算框架。TensorFlow分布式相当于MapReduce计算框架,Kubernetes相当于Yam调度系统。TensorFlowOnSpark,利用远程直接内存访问(Remote Direc...

利炳根
2017/11/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java Varargs 可变参数使用

Java1.5 提供了一个叫varargs的新功能,就是可变长度的参数。 "Varargs"是 “variable number of arguments”的意思。有时候也被简单的称为 “variable arguments”。 定义实参个数可变的方法...

honeymoose
今天
69
0
IDEA 拉取、上传、更新 项目到 Gitee+GitHub_超详细超简单版

注:本人使用的idea是最新版(2019.1.2),要是其他的版本的不要惊慌〜,基本上都一样,没有什么太大的差别的 首先我要说一下,拉取项目分两个,一个,你就没有项目,拉取仓库的整个项目,而...

杨木发
今天
54
0
pyqt5环境搭建(Ubuntu19.10+pycharm+python3)

1.安装pyqt5 sudo apt-get install python3-pyqt5 sudo apt-get install qttools5-dev-tools sudo apt-get install qt5-default 2.安装pycharm 下载pycharm社区版安装包并解压 在桌面新建pyc......

小芯片
今天
54
0
Vue造轮子-tab组件(中)

1. 如果给一个标签一个class,标签本身又有class,vue是默认会合并的。只有两个属性是这样一个是class,一个是style。这样就比较好改样式。 <g-tabs-head class="red"></g-tabs> 2. 组件的...

ories
昨天
59
0
Windows 版本 Anaconda 配置加速源安装软件

C:\Users\lenovo\.condarc 首先安装Anaconda最新版本。 其次添加安装目录到环境变量。文本为 C:\ProgramData\Anaconda3\Library\bin 运行 conda 命令在 Windows 用户下生成文件 .conda...

白豆腐徐长卿
昨天
232
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部