SqoopConfiguration对象源码分析

2016-07-01  本文已影响102人  zjlearn

SqoopConfiguration类

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

SqoopConfiguration 初始化

serer调用sqoop的初始化过程。

SqoopConfiguration.getInstance().initialize();
/**
   * 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接口。

上一篇下一篇

猜你喜欢

热点阅读