美文网首页
SqoopConfiguration对象源码分析

SqoopConfiguration对象源码分析

作者: zjlearn | 来源:发表于2016-07-01 21:47 被阅读102次

    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接口。

    相关文章

      网友评论

          本文标题:SqoopConfiguration对象源码分析

          本文链接:https://www.haomeiwen.com/subject/pzfqjttx.html