Hadoop 配置API

Hadoop配置

本文章在其他文章基础上参考编辑

Hadoop配置API

hadoop中的组件都是通过Hadoop自己的配置API配置的,一个Configuration类的实例代表了Hadoop集群的配置。配置类似于Map,由属性及值组成。属性为String类型,值则可以为java基本类型、其他有用类型(例如String、Class、java.io.File)及String集合。

API重要属性

  • quitemode:boolean类型,配置信息加载过程中,是否处于安静模式,即有一些信息不会被记录,默认是true;
  • resources:ArrayList类型,Resource是Configuration的内部类,有两个属性Object resource和String name;resources是一个对象数组,用于存储有关包含配置信息的对象;
  • finalParameters:Set类型,所有被声明为final的变量集合,声明为final就表示不能被后续覆盖;
  • loadDefaults:boolean类型,是否加载默认配置;
  • REGISTRY:WeakHashMap<Configuration,Object>类型,用于多个对象的相关配置的注册及对它们进行管理,记录了所有的Configuration;
  • defaultResources:CopyOnWriteArrayList类型,用于存储默认的配置资源名或路径;
  • properties:java内置的Properties类型,存储所有配置信息,KV值;
  • overlay:Properties类型,是用户设置的而不是通过对资源解析得到的;
  • classloader:ClassLoader类型,主要用于加载指定的类或者加载相关资源;
  • updatingResource:HashMap<String, String[]>类型,存储最近加载或修改的属性
  • VAR_PATTERN:静态Pattern类型,用于正则匹配,Pattern.compile("\$\{[\}\$\u0020]+\}"),正则表达式中$、{、}都是保留字,所以需要用"“进行转义,“\$\{”用于匹配${key}中的key前面的”${";最后的"\}“用于匹配key后的”}";中间部分"[\}\KaTeX parse error: Can't use function '\u' in math mode at position 1: \̲u̲0020]+"用于匹配属性扩展…"、"}“和空格(\u0020指的是空格)以外的所有字符,还有”+"出现至少1次。
  • MAX_SUBST:静态int类型,默认值是20,MAX_SUBST是设定对带有环境变量的值所能够深入解析的层次数,超出这个最大的层数的值将不能够解析。

API初始化

  1. 静态代码块: 调用构造方法之前执行,会加载core-default.xml和core-site.xml两个文件,Configuration的子类也会同样加载这两个文件。
static {
        deprecationContext = new AtomicReference(new Configuration.DeprecationContext((Configuration.DeprecationContext)null, defaultDeprecations));
        ClassLoader cL = Thread.currentThread().getContextClassLoader();
        if (cL == null) {
            cL = Configuration.class.getClassLoader();
        }

        if (cL.getResource("hadoop-site.xml") != null) {
            LOG.warn("DEPRECATED: hadoop-site.xml found in the classpath. Usage of hadoop-site.xml is deprecated. Instead use core-site.xml, mapred-site.xml and hdfs-site.xml to override properties of core-default.xml, mapred-default.xml and hdfs-default.xml respectively");
        }

        addDefaultResource("core-default.xml");
        addDefaultResource("core-site.xml");
        VAR_PATTERN = Pattern.compile("\\$\\{[^\\}\\$ ]+\\}");
    }
  1. 构造方法:
  • Configuration():调用参数为true的构造方法。
  • Configuration(boolean loadDefaults):确认是否加载默认配置。
  • Configuration(Configuration other):第三个就是将指定的Configuration对象重新复制一份。
  1. 加载资源
    可以通过Configuration的addResource()方法或者静态方法addDefaultResource()(设置了loadDefaults标志)来添加资源到Configuration中。但是add之后资源并不会立即被加载,hadoop的Configuration被设计成了“懒加载”,即在需要时才会被加载。在add之后会调用reloadConfiguration()方法清空properties和finalParameters。
    • addDefaultResource()方法,这是一个静态方法。通过这个方法可以添加系统的默认资源。在HDFS中会被用来加载hdfs-default.xml和hdfs-site.xml;在MapReduce中会被用来加载mapred-default.cml和mapred-site.xml,可以在相关的Configuration子类中找到相应地静态代码块。
    • addResource方法,该方法有6种形式,也就是可以add的形式:可以是一个输入流、HDFS文件路径、WEB,URL、CLASSPATH资源、以及Configuration对象。这些方法都会将参数封装成Resource对象后,传递给addResourceObject方法并调用该方法。在addResourceObject方法中会将Resource对象加入resources中并调用reloadConfiguration方法
  2. 属性获取
    见:https://www.cnblogs.com/lxf20061900/p/4189727.html

配置属性特性

  • 配置可以被覆盖,也可以被系统属性或其他属性重新定义。一般优先级为:系统定义(例如命令行模式下用JVM参数-Dproperty=value覆盖资源文件中的该属性定义) > 资源文件定义
  • 资源文件中被标记为final的属性无法被覆盖
  • 系统属性可以覆盖配置属性,但是如果定义了系统属性,但没有定义同名的配置属性,则无法通过该API访问。

配置管理

管理配置的目的

开发Hadoop应用时,经常需要在本地运行和集群运行之间切换,因此通过不同Hadoop配置文件包含各个集群配置,在运行时指定连接。

基于环境变量

通过配置HADOOP_CONF_DIR。当使用Configuration conf = new Configuration()时Hadoop会自动加载该变量指向的目录下的资源文件。

通过Hadoop自带工具的-conf参数配置

使用方法:hadoop fs -conf [config local path] [cmd]
使用例子:hadoop fs -conf conf/hadoop-local.xml -ls /

通过使用Tool接口实现

GenericOptionParser

该类的主要作用是通过解析常用的Hadoop命令行选项,并为Configuration对象是指相应的取值。不过通常情况下不使用该类,而是实现Tool接口,通过ToolRunner类运行。后者内部调用该类。

Tool和ToolRunner

在下面的实例中,ConfigurationPrinter作为Configured的一个子类,ConfiguredConfigurable接口的一个实现
资源文件:
example/resource_1.xml

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <property>
        <name>sizes</name>
        <value>10</value>
    </property>
    <property>
        <name>weight</name>
        <value>50</value>
        <final>true</final>
    </property>
    <property>
        <name>size-weigh</name>
        <value>${sizes},${weight},${test}</value>
    </property>
</configuration>

example-resource_2.xml

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <property>
        <name>sizes</name>
        <value>1</value>
    </property>
    <property>
        <name>weight</name>
        <value>20</value>
        <final>true</final>
    </property>
</configuration>

使用示例:

package chapter6;
/*
 * @author 赵鹏越
 * @date 2018/11/2
 */

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
import java.util.Map;

/**
 * 用于解析命令行参数
 * hadoop chapter6.ConfigurationPrinter -D color=value |egrep 'color|weight|sizes|size-weigh|test'
 * 注:
 * -D 设置一个属性键值对
 * out:
 * color=value
 */
public class ConfigurationPrinter extends Configured implements Tool {

    static {
        // 加载配置文件
        Configuration.addDefaultResource("hadoop/core-site.xml");
        Configuration.addDefaultResource("hadoop/hdfs-site.xml");
        Configuration.addDefaultResource("hadoop/mapred-site.xml");
        Configuration.addDefaultResource("hadoop/yarn-site.xml");
    }

    public int run(String[] strings) throws Exception {
        // 所有命令行参数都会加载到下面的Configuration对象中
        Configuration conf = getConf();
        for (Map.Entry<String, String> entry: conf) {
            System.out.printf("%s=%s\n", entry.getKey(), entry.getValue());
        }
        // 系统变量配置sizes,优先级最高
        System.setProperty("sizes", "12");
        conf.addResource("example/resource_1.xml");
        conf.addResource("example/resource_2.xml");
        // 系统变量test在资源未见中未定义,可引用,但是无法获取
        System.setProperty("test", "12");
        // 系统变量优先级较高,输出12
        System.out.println("sizes: " + conf.get("sizes"));
        // resource_1文件中标记为final属性,故输出50
        System.out.println("weight: " + conf.get("weight"));
        // 引用相关变量,故输出12,50,12
        System.out.println("size-weigh: " + conf.get("size-weigh"));
        // 系统变量test在资源未见中未定义,可引用,但是无法获取,输出null
        System.out.println("test: " + conf.get("test"));
        return 0;
    }

    public static void main(String[] args) throws Exception {
        int exitCode = ToolRunner.run(new ConfigurationPrinter(), args);
        System.exit(exitCode);
    }
}
// STDOUT
sizes: 1
weight: 50
size-weigh: 12,50,12
test: null

猜你喜欢

转载自blog.csdn.net/m0_37367424/article/details/84031013