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

posted on 2022-03-08 20:53  荣锋亮  阅读(86)  评论(0编辑  收藏  举报

导航