SqoopConfiguration对象源码分析

SqoopConfiguration类

SqoopConfiguration类的对象用于对sqoop的配置信息进行管理。
其有以下特点:

  • 每个sqoop_server服务器有唯一的SqoopConfiguration实例。

SqoopConfiguration 初始化

serer调用sqoop的初始化过程。

SqoopConfiguration.getInstance().initialize();
  • SqoopConfiguration类使用单例设计模式保存唯一对象
    源代码如下:
/**
   * Private instance to singleton of this class.
   */
  private static SqoopConfiguration instance;

  /**
   * Create default object by default.
   *
   * Every Sqoop server application needs one so this should not be performance issue.
   */
  static {
    instance = new SqoopConfiguration();
  }

  /**
   * Return current instance.
   *
   * @return Current instance
   */
  public static SqoopConfiguration getInstance() {
    return instance;
  }

SqoopConfiguration的数据结构

SqoopConfiguration作用在于对配置信息进行管理。 其数据结构如下所示:

 private File configDir = null;
  private boolean initialized = false;
  private ConfigurationProvider provider = null;
  private Map<String, String> config = null;
  private Map<String, String> oldConfig = null;

值得一提的是:
oldConfig变量用于保存旧的配置信息。
provider变量是配置信息的提供者, 其作用在于从文件中读取配置信息。

SqoopConfiguration的层次关系

SqoopConfiguration实现Reconfigurable接口。

/**
 * Interface that make Sqoop Server components sensitive to
 * configuration file changes at the runtime
 */
public interface Reconfigurable {
  /**
   * Method to notify each reconfigurable components
   */
  public void configurationChanged();
}

Reconfigurable接口的作用是标志配置是可以更新的。这也是存在oldConfig变量的原因。
对于接口方法的实现如下所示:

@Override
  public synchronized void configurationChanged() {
    oldConfig = config;
    config = provider.getConfiguration();
    configureLogging();
  }

其中provider.getConfiguration为provider重新从配置文件中读取配置信息。

SqoopConfiguration的initialize过程

初始化的过程主要分为:

  1. 读取配置文件信息
  2. 获取ConfigurationProvider的类信息, 并进行构造
  3. 初始化ConfigurationProvider对象
  4. 将配置管理器注册到ConfigurationProvider中去。当配置更新时, ConfigurationProvider将通知SqoopConfiguration进行配置更新。
  5. 标注初始化完成。
    主要的代码如下:
String configDirPath = System.getProperty(
        ConfigurationConstants.SYSPROP_CONFIG_DIR);  //步骤1
...    //略去
  provider = (ConfigurationProvider) configProviderClass.newInstance();  //step2
  .... //略去
  // Initialize the configuration provider
    provider.initialize(configDir, bootstrapProperties); //step3
    configurationChanged();

    provider.registerListener(new CoreConfigurationListener(SqoopConfiguration.getInstance())); //step4

    initialized = true; //step5

其中step1相当于:

System.getProperty("sqoop.config.provider")

系统变量由SQOOP_HOME文件夹下/server/setenv.sh设置。
setp4中的CoreConfigurationListener是SqoopConfiguration类中的静态类成员。
源代码如下:

 public static class CoreConfigurationListener implements ConfigurationListener {

    private Reconfigurable listener;

    public CoreConfigurationListener(Reconfigurable target) {
      listener = target;
    }

    @Override
    public void configurationChanged() {
      listener.configurationChanged();
    }
  }

ConfigurationProvider的实现

ConfigurationProvider是一个接口。其主要的功能就是监听配置是否变化。然后更新相应的对象。
源代码中实现了PropertiesConfigurationProvider类实现ConfigurationProvider接口。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,600评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,972评论 18 399
  • 一. Java基础部分.................................................
    wy_sure阅读 9,263评论 0 11
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,470评论 11 349
  • 数据更新机制通过- (BOOL)tableNode:(ASTableNode *)tableNode should...
    黄x黄阅读 4,948评论 0 0