SqoopConfiguration对象源码分析
2016-07-01 本文已影响102人
zjlearn
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过程
初始化的过程主要分为:
- 读取配置文件信息
- 获取ConfigurationProvider的类信息, 并进行构造
- 初始化ConfigurationProvider对象
- 将配置管理器注册到ConfigurationProvider中去。当配置更新时, ConfigurationProvider将通知SqoopConfiguration进行配置更新。
- 标注初始化完成。
主要的代码如下:
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接口。