hadoop系列之Configuration类解析

2023-05-16

前言

Configuration是hadoop中五大组件的公用类,所以放在了core下,org.apache.hadoop.conf.Configruration。这个类是作业的配置信息类,任何作用的配置信息必须通过Configuration传递,因为通过Configuration可以实现在多个mapper和多个reducer任务之间共享信息。hadoop作为Apache旗下hadoop系列最早出现的组件,该组件的核心类Configuration对后续出现的hbase,have,spark的配置都有一定的借鉴意义。

概述

Configuration类最重要的作用是传递配置信息,所以其重要的属性应该是成员变量而非成员函数。

  1. resources 资源列表,用来存储配置文件名
  2. loadDefaults bool值,用来存储是否读取默认配置。默认是true
  3. REGISTRY hashmap,作用未知
  4. defaultResources 资源列表 默认的配置
  5. storeResource bool值 是否备份用户设置的配置信息到overlay
  6. updatingResource hashmap 本进程修改过的配置信息
  7. properties 最终的配置信息
  8. overlay 存放用户设置的配置信息(不包括配置文件的配置信息)

类初始化

我们按着类加载顺序和类实例化顺序来分析

1. 静态变量和静态代码块

静态代码块在defaultResources里添加了两个资源名:

    addDefaultResource("core-default.xml");
    addDefaultResource("core-site.xml");
  public static synchronized void addDefaultResource(String name) {
    if(!defaultResources.contains(name)) {
      defaultResources.add(name);
      for(Configuration conf : REGISTRY.keySet()) {
        if(conf.loadDefaults) {
          conf.reloadConfiguration();
        }
      }
    }
  }

2.非静态变量和非静态代码块

这里只是初始化了类加载器,并没有加载属性

  private ClassLoader classLoader;
  {
    classLoader = Thread.currentThread().getContextClassLoader();
    if (classLoader == null) {
      classLoader = Configuration.class.getClassLoader();
    }
  }

3. 构造函数

Configruration类有四个构造函数。构造函数并没有加载任何配置信息。
构造函数的作用有:
初始化loadDefaults
初始化REGISTRY
初始化storeResource
在这里插入图片描述

tips:

构造函数

  1. 当一个对象被创建时,系统会为这个实例的变量进行默认初始化。如果想改变这种默认的初始化,就需要用构造器来实现。
  2. 如果java没有提供任何构造函数,则系统会为java提供一个无参的构造函数。这个函数的函数体为空。因此可以说:java类至少包含一个构造函数。
  3. 当自定义构造函数之后,默认构造函数就不可再使用。如果不重新定义参数为空的构造函数,则无法使用" 类名(空)"实例化对象。

类加载顺序

https://blog.csdn.net/weixin_37275456/article/details/100594486

配置加载

1. 分析

到目前为止尚未发现有任何加载配置的迹象。也就是说类初始化之后如果没有任何配置信息。是一个空非配置类。那什么时候加载配置文件的呢?
答:第一次从配置类里获取配置信息的时候。例如调用:

public int getInt(String name, int defaultValue)
public long getLong(String name, long defaultValue)
public int getInt(String name, int defaultValue)
。。。

上面这些函数都直接或者间接的调用了下面这个函数

  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);
        if (storeResource) {
          for (Map.Entry<Object,Object> item: overlay.entrySet()) {
            updatingResource.put((String) item.getKey(), "Unknown");
          }
        }
      }
    }
    return properties;
  }

上面这个函数又调用了下面这个函数。

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

上面这个函数又调用了下面这个函数。到现在才真正加载了配置文件。

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

}

整个配置文件调用链如下:

getXXX()->get(String name)->getProps()->loadResource()-> loadResource()

2. 下面要着重介绍几个函数

loadResources()

当loadDefaults为true的情况下,会加载defaultResources包含的配置文件。但是无论loadDefaults是何值,都会加载resources包含的配置文件。而且按照先后顺序,resources包含的配置信息会覆盖defaultResources包含的配置信息

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

配置修改

1.分析

配制的修改和配置的加载有相似之处。
当调用类似下面的函数的时候,开始修改配置文件

void setXXX(String name, float value){
	set(name,Float.toString(value));
}

显然,上面的函数调用了下面这个函数。根据下面这个函数可知,同时修改了Overlay和Props

  public void set(String name, String value) {
    getOverlay().setProperty(name, value);
    getProps().setProperty(name, value);
  }

现在又回到了getProps()。我们再来回顾一下这个函数。当properties不为null,直接返回properties。当properties为null.则重新加载默认的配置文件和用户添加的配置文件。同时如果overlay(前面已经说过,这里面放的是被修改的配置信息)不为空,说明有配置信息被修改过,也要重新加载overlay里的配置信息。并在updatingResource里记录那些信息被本进程(只是本进程,其他进程修改的不在此范围内)修改过。

  private synchronized Properties getProps() {
    if (properties == null) {
      properties = new Properties();
      // 第一次加载配置
      loadResources(properties, resources, quietmode);
      if (overlay!= null) {
        properties.putAll(overlay);
        if (storeResource) {
          for (Map.Entry<Object,Object> item: overlay.entrySet()) {
            updatingResource.put((String) item.getKey(), "Unknown");
          }
        }
      }
    }
    return properties;
  }

总结

当调用reloadConfiguration()函数的时候回将properties置为null,此后如果再调用进行set和get操作都要重新加载配置文件。而下面这些函数触发了reloadConfiguration()函数。

addResourceObject()
addDefaultResourc()
dumpConfiguration()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

hadoop系列之Configuration类解析 的相关文章

  • c语言中特殊符号怎么定义,C语言特殊符号意义

    C语言特殊符号意义 由会员分享 xff0c 可在线阅读 xff0c 更多相关 C语言特殊符号意义 17页珍藏版 请在人人文库网上搜索 1 下载可编辑C 语言中像 D amp f符号的作用说一下最佳答案C 语言中的符号运算符的种类 C 语言的
  • 11 项目的工程文件存在哪里

    项目的工程文件都存在SVN服务器上 xff0c 在日常开发中 xff0c 一定存在多人进行开发 xff0c 那么就会造成代码重合现象 xff0c SVN就是解决这种矛盾冲突的 xff0c SVN是从Linux下产生的一款C S模式的软件版本
  • vnc连接某个服务器显示10061,VNC connect:Connection refused(10061)(示例代码)

    下面介绍一个VNC连接工具 xff1a iis7服务器管理工具 IIs7服务器管理工具可以批量连接并管理VNC服务器 作为服务器集成管理器 xff0c 它最优秀的功能就是批量管理windows与linux系统服务器 vps 能极大的提高站长
  • linux安装软件sudo吗,安装软件包方式:sudo apt-get和sudo tasksel有何不同

    要安装ubuntu desktop有什么方法 xff0c 比较方便的运行命令 xff0c 下面三条命令都成功的安装ubuntu desktop xff0c 即 xff1a sudo apt get install ubuntu deskto
  • 牛客网中c++题目及其知识点详解

    1 下面描述正确的是 1 2 int p1 61 new int 10 int p2 61 new int 10 p1和p2申请的空间里面的值都是随机值 p
  • 【C++】Eigen优化及D8016错误

    Eigen优化过程 背景 最近在写一个保边滤波的算法 为了加快运算速率 xff0c 采用C 43 43 语言 xff0c 使用Eigen库进行大矩阵运算 效率问题 作为基于全局图像的算法 xff0c 需要创建一个全局的矩阵 xff08 n
  • 控制系统-观测器介绍与设计-龙伯格观测器及其与控制器对比

    目录 1 观测器提出的背景 1 1 龙伯格观测器的物理意义 2 状态空间下龙伯格观测器设计 2 1 状态观测器设计 3 状态观测器实例 3 1 直接法 4 控制器与观测器对比 4 1 基于状态反馈的控制器设计 4 2 基于输出反馈的控制器设
  • 一文彻底搞懂大小端字节序

    一文彻底搞懂大小端字节序 文章目录 一文彻底搞懂大小端字节序 1 基本概念1 1大端字节序 big endian 1 2小端字节序 little endian 2 常用处理器架构大小端模式3 如何查看系统的大小端模式3 1 96 dpkg
  • logback输出日志到elasticsearch方案

    功能一 xff1a 微服务日志采集汇聚方案 第一步 xff1a maven引入 xff0c 放在dependencys的第一位 xff0c 一定是第一位 lt dependency gt lt groupId gt com suncreat
  • Ubuntu16.04 远程界面配置

    Ubuntu16 04安装 x11vnc远程桌面并设置开机自动启动 1 安装x11vnc sudo apt get install x11vnc 2 设置开机自动启动连接密码 sudo x11vnc storepasswd 3 将密码储存在
  • 12 怎么从SVN下载项目工程文件

    输入如下命令 一定要在自己的根目录下 xff1a 即 home xxx 否则需要修改环境变量 xff0c 将来与其他人的操作也会不统一 xff0c SVN服务器IP以192 168 0 1为例 命令 xff1a svn co svn 192
  • numpy中np.max和np.maximum

    参考 numpy中np max和np maximum 云 43 社区 腾讯云 1 np max a axis 61 None out 61 None keepdims 61 False 求序列的最值 最少接受一个参数 axis默认为axis
  • Pytorch的to(device)用法

    参考 Pytorch的to device 用法 云 43 社区 腾讯云 如下所示 xff1a device 61 torch device 34 cuda 0 34 if torch cuda is available else 34 cp
  • Camouflaged Object Detection

    摘要 我们对一项名为伪装物体检测 COD 的新任务进行了全面研究 xff0c 该任务旨在识别 无缝 嵌入到周围环境中的物体 目标对象与背景之间的高内在相似性使目标检测比传统的目标检测任务更具挑战性 为了解决这个问题 xff0c 我们精心收集
  • 如何改变vncserver在windows桌面下的分辨率

    用shell登录自己的服务器 xff0c 并输入一下命令 xff0c 1920x1080为屏幕分辨率 xff0c 11为自己的端口号 vncserver kill 14 vncserver 14 geometry 2000x1100 dpi
  • CVPR2019目标检测方法进展

    目标检测是很多计算机视觉应用的基础 xff0c 比如实例分割 人体关键点提取 人脸识别等 xff0c 它结合了目标分类和定位两个任务 现代大多数目标检测器的框架是 two stage xff0c 其中目标检测被定义为一个多任务学习问题 xf
  • ubuntu16.04+cuda8.0+cudnn+opencv3.0+caffe

    一 ubuntu16 04安装 开机F12进入BIOS的设备启动菜单 xff0c 选择U盘启动 安装类型 xff0c 选择其他选项 xff0c 进行分区 Swap xff1a 逻辑分区 xff0c 20GB 空间起始位置 交换空间 boot
  • Linux 用户态通过中断切换到内核态详解

    文章目录 一 用户态与内核态二 中断三 任务状态段四 Linux 进程从用户态切换到内核态的过程五 参考资料 一 用户态与内核态 Linux 把内存主要分为 4 个段 xff0c 分别是内核代码段 内核数据段 用户代码段 用户数据段 内核两
  • PX4中串口名称、设备名称、端口名称对应关系

    这里规定了各种uart usart的波特率 bufsize等配置 xff0c boards px4 fmu v5 nuttx config nsh defconfig CONFIG STM32F7 UART4 span class toke
  • PX4调试过程中的小问题

    使用USB直连飞控可以开始校准 xff0c 但是用无线的方式开始任一传感器的校准都报错 xff1a Transition denied SHUTDOWN to INIT 明明飞控正常上电 xff0c 也许报了个错说 critical bat

随机推荐

  • PX4中IMU传感器的数据经过了哪些处理后被使用的?

    注 xff1a 所用PX4的代码版本为当前master最新版9e309f62a9b1731caae96000b824aa96661e67ad 2019年11月所写 xff0c 新版本有所不同 xff0c 尚未更新 IMU的数据 xff1a
  • WARNING: [Vivado 12-13340] WARNING: [Vivado 12-13277]

    仿真的时候遇问题 xff1a WARNING Vivado 12 13340 Unable to auto find GCC executables from simulator install path path not set WARN
  • 二.因子图优化学习---董靖博士在深蓝学院的公开课学习(2)

    专栏系列文章如下 xff1a https blog csdn net weixin 36773706 article details 122440411 https blog csdn net weixin 36773706 article
  • 四.因子图优化学习---对因子图优化的粗浅理解

    专栏系列文章如下 xff1a 一 因子图优化学习 董靖博士在深蓝学院的公开课学习 xff08 1 xff09 goldqiu的博客 CSDN博客 二 因子图优化学习 董靖博士在深蓝学院的公开课学习 xff08 2 xff09 goldqiu
  • 多传感器融合SLAM、导航研究和学习专栏汇总

    从2021年9月份开始学习多传感器融合SLAM xff0c 期间也发了不少博客记录学习过程 xff0c 自己对SLAM的认识也逐渐加深 xff0c 以前一些博客中会有一些错误的地方还未及时去修正 xff0c 敬请谅解 由于课题组需要和自身发
  • 启航篇——四旋翼飞行器之入坑两年心路历程和毕设总结

    笔者今年大四毕业 xff0c 由于之前参加比赛及准备考研 xff0c 没有时间总结这两年来做四旋翼飞行器的心得体会 现在借毕业设计这个契机 xff0c 想把这件事做了 xff0c 算是两年的收尾工作 xff0c 也是个新的开始 先从介绍这两
  • Gazebo学习笔记(一)

    搭建一个移动车 ctrl 43 m 进入到gazebo编辑界面 ctrl 43 m 进入到gazebo编辑界面 1 搭建一个车底盘 xff0c 选择simple shapes 的box xff0c 点击后在编辑框中释放 2 利用resize
  • 1分钟教会你二进制撩妹(汉)读心术

    近些年来 xff0c 小魔发现 xff0c 对于年轻的男女而言 xff0c 一些传统的节日似乎都变成了情人节或者脱单节 xff0c 就连 光棍节 xff0c 实际上很多人都是抱着节前或者是当天脱单而过的 双11 光棍节 即将来临 xff0c
  • 树莓派光敏传感器控制LED小灯的开关

    今天来做一个关于光敏传感器的使用demo xff0c 如图 xff0c 我采用的是普通用于开发的光敏传感器 传感器的基板上有两个LED xff0c 上一个是表示DO的高低电平 xff0c 下一个表示是否通电 当挡住传感头之后 xff0c D
  • Opencv+YOLO3目标检测/C++

    1 引言 YOLO3能够快速识别图片和视频中的80种物体 xff0c 而且实时性强 xff0c 准确度接近SSD Opencv是目前最流行的开源图像处理库 xff0c 使用Opencv能够非常方便的对图像进行处理 Opencv4 0已经包含
  • Linux安装Docker

    安装前菜 如何卸载Docker 1 查询docker安装包 yum list installed grep docker 2 删除安装包 yum remove docker 3 删除镜像 容器等 rm rf var lib docker 下
  • 北邮初试+复试经验分享

    初试情况 xff1a 政治 53 英语 70 数学 122 计算机综合 xff08 803 xff09 110 一些相关的基本情况 xff1a 本科专业数学 本科期间学过数据结构 通过了英语四六级 本科成绩还算可以 初试材料选择 xff08
  • apt命令概述

    目录 Linux软件仓库 软件源配置 apt命令 常见的命令如下 xff1a 常见的用法 示例 xff1a 使用apt安装redis软件 Linux软件仓库 Ubuntu采用集中式的软件仓库机制 xff0c 将各式各样 的软件包分门别类地存
  • 索引覆盖与回表

    懂的越多 xff0c 不懂的越多 上回书说到 xff1a 什么情况下 xff0c 索引下推没办法提高sql查询效率 xff1f 表info主键id名称name值value别名realname 对于info表 xff0c 我们现在有 xff0
  • Ubuntu18.04安装实时内核Preempt-RT

    文章目录 1 安装环境2 安装依赖包3 查看内核版本4 下载新的内核和对应的Preempt RT补丁5 解压缩6 打补丁7 配置内核8 编译内核9 校验结果10 重启11 测试12 调整分辨率 1 安装环境 Ubuntu18 04内核版本
  • CAS 5.2.X 使用cas-overlay-template 搭建cas-server

    1 下载 cas overlay template 地址 xff1a https github com apereo cas overlay template 选择需要的版本 xff1a cas 6 x开始使用gradle构建 xff0c
  • Jupyter 更改主题解决 jt 不存在问题

    pip安装之后 xff0c 并不是像传统的那样安装到了envs中的script文件中 而是在C盘的appdata C Users Administrator AppData Roaming Python Python36 Scripts 中
  • 树莓派4 桌面图标显示 No wireless interface found

    树莓派4 桌面图标显示 No wireless interface found 解决方式 先使用有线链接网络 安装wpasupplicant wpagui libengine pkcs11 openssl sudo apt install
  • mysql _外键、实体关系与ER图

    外键约束 概念 A实体的某个字段指向 B实体的主键 则称A实体的那个字段为该实体的外键 一个表里可以有多个外键 span class hljs operator span class hljs keyword drop span span
  • hadoop系列之Configuration类解析

    前言 Configuration是hadoop中五大组件的公用类 xff0c 所以放在了core下 xff0c org apache hadoop conf Configruration 这个类是作业的配置信息类 xff0c 任何作用的配置