dremio ConnectionConf 接口说明
基本所有dremio 的存储扩展的配置管理都会使用此类
参考类图定
ConnectionConf 继承了AbstractConnectionConf 功能比较简单,主要是提供了获取类型,以及转换为字节字符串
获取类型部分使用了dremio 的注解(开发扩展会包含一个注解,设计还是比较巧妙的,简化了注解的处理)
配置转换为字节字符串(利用了protostuff的能力,主要是方便存储使用)
参考处理
@Override
public ByteString toBytesString() {
return ByteString.copyFrom(toBytes());
}
@SuppressWarnings("unchecked")
public byte[] toBytes() {
return ProtobufIOUtil.toByteArray( (T) this, schema, LinkedBuffer.allocate() );
}
ConnectionConf 提供了newPlugin 抽象方法,我们开发存储扩展的配置管理也就是基于此方法
public abstract P newPlugin(final SabotContext context, final String name, Provider<StoragePluginId> pluginIdProvider);
比如jdbc 的
public abstract class JdbcConf<T extends DialectConf<T, JdbcStoragePlugin>> extends DialectConf<T, JdbcStoragePlugin> {
private static final Logger logger = LoggerFactory.getLogger(JdbcConf.class);
public JdbcConf() {
}
// 此方法是jdbc 特有的,简化了jdbc 的处理,newPlugin 使用JdbcSchemaFetcherFactory 会调用此方法
public abstract JdbcPluginConfig buildPluginConfig(Builder var1, CredentialsService var2, OptionManager var3);
// 创建存储扩展的实现,ManagedStoragePlugin 就使用了此方法
public JdbcStoragePlugin newPlugin(SabotContext context, String name, Provider<StoragePluginId> pluginIdProvider) {
JdbcSchemaFetcherFactory factory = JdbcSchemaFetcherFactory.of(context.getConfig(), context.getJdbcSchemaFetcherFactoryContext());
logger.debug("Plugin {} is using fetcher factory: {}", name, factory.getClass());
JdbcSchemaFetcher schemaFetcher = factory.newFetcher(name, this);
return new JdbcStoragePlugin(schemaFetcher.getConfig(), schemaFetcher, context.getConfig(), pluginIdProvider, context.getOptionManager().getOption(PlannerSettings.FULL_NESTED_SCHEMA_SUPPORT));
}
}
JdbcSchemaFetcherFactory 包装了如何创建JdbcSchemaFetcher ,参考处理
public class JdbcSchemaFetcherFactoryImpl implements JdbcSchemaFetcherFactory {
private final OptionManager optionManager;
private final CredentialsService credentialsService;
public JdbcSchemaFetcherFactoryImpl(JdbcSchemaFetcherFactoryContext context) {
this.optionManager = context.getOptionManager();
this.credentialsService = context.getCredentialsService();
}
public JdbcSchemaFetcher newFetcher(String sourceName, ConnectionConf<?, ?> connectionConf) {
JdbcConf<?> jdbcConf = (JdbcConf)connectionConf;
Supplier<Integer> rowCountQueryTimeout = () -> {
return Ints.saturatedCast(this.optionManager.getOption(JdbcConstants.JDBC_ROW_COUNT_QUERY_TIMEOUT_VALIDATOR));
};
Builder configBuilder = JdbcPluginConfig.newBuilder().withSourceName(sourceName).withRowCountQueryTimeOut(rowCountQueryTimeout);
JdbcPluginConfig pluginConfig = jdbcConf.buildPluginConfig(configBuilder, this.credentialsService, this.optionManager);
return pluginConfig.getDialect().newSchemaFetcher(pluginConfig);
}
}
同时ConnectionConf 也实现了Externalizable 方便进行序列化处理
ConnectionConf几个方法说明
- isInternal
标记是否是内部的配置(dremio 系统的,比如加速处理的)还是外部链接的(一般是可视化配置的) - writeExternal&readExternal
自定义序列化处理的 - newPlugin
基于配置生成存储扩展的 - getType
基于注解获取注册的source 类型,目前看到主要在物理执行计划处 - registerSubTypes
注册类型到jackson 中,基于了jackson的类型注册实现一个多态数据处理
ConnectionConf 的使用
目前对于ConnectionConf的使用主要是以下几个
DatasetManager(dataset管理),SourceResource(source api),ManagedStoragePlugin(具体创建存储扩展)
PhysicalPlanReader(物理执行计划读取,使用了静态方法),CatalogServiceImpl(catalog 服务管理),SourceUI(source 配置展示)
SourceService(source管理)
说明
ConnectionConf 在dremio 的ui 管理存储扩展以及一些内置存储扩展上使用的是比较多的,基于注解的开发模式,简化了存储扩展的开发
参考资料
sabot/kernel/src/main/java/com/dremio/exec/catalog/ManagedStoragePlugin.java
sabot/kernel/src/main/java/com/dremio/exec/planner/PhysicalPlanReader.java