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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2020-03-08 pgspider Citu 副本以及节点移除简单学习
2020-03-08 Citus 官方docker demo 中membership-manager原理简单说明
2020-03-08 pgspider Citus docker 镜像使用
2019-03-08 nginx unit 1.8 支持基于java servlet 的开发模型
2019-03-08 试用 openresty/lua-resty-shell
2018-03-08 grpc rust 项目基本使用
2016-03-08 Jquery使用ajax以及angularjs 动态模板加载并进行渲染