dremio 整体包含了两大类存储扩展,系统内部使用的,以及用户开发的,
整体区别
- 系统的目前是在dremio 自己启动的时候就会注册以及使用的,比如加速反射的,home,元数据存储插件
- 用户自己开发的主要是通过web ui 或者api 初始化以及维护的
- 用户以及系统存储配置的可配置性不一样,系统不能配置,类似静态,用户的可以配置,同时dremio api 以及web 管理也是通过是是否支持配置加载的
内部实际处理
- 用户插件加载处理
public ResponseList<SourceTypeTemplate> getSourceTypes() {
final ConnectionReader connectionReader = sabotContext.getConnectionReaderProvider().get();
final ResponseList<SourceTypeTemplate> types = new ResponseList<>();
final boolean showHive = sabotContext.getOptionManager().getOption(ALLOW_HIVE_SOURCE);
for(Class<? extends ConnectionConf<?, ?>> input : connectionReader.getAllConnectionConfs().values()) {
// we can't use isInternal as its not a static method, instead we only show listable sources,内部判断
if (isListable(input)) {
String sourceType = input.getAnnotation(SourceType.class).value();
if (!showHive && "HIVE".equals(sourceType)) {
continue;
}
if (sabotContext.getSourceVerifierProvider().get().isSourceSupported(sourceType)) {
types.add(SourceTypeTemplate.fromSourceClass(input, false));
}
}
}
return types;
}
内部判断处理
private boolean isListable(Class<? extends ConnectionConf<?, ?>> clazz) {
SourceType type = clazz.getAnnotation(SourceType.class);
return type != null && type.configurable() && type.listable();
}
- SourceType 注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface SourceType {
String value();
String label() default "";
String uiConfig() default "";
boolean configurable() default true;
boolean listable() default true;
boolean externalQuerySupported() default false;
boolean previewEngineRequired() default false;
}
- 系统插件加载处理
以前说过,通过SystemStoragePluginInitializer 加载的,实际上是通过直接硬编码处理的
参考资料
dac/backend/src/main/java/com/dremio/dac/api/SourceResource.java
sabot/kernel/src/main/java/com/dremio/exec/store/dfs/InternalFileConf.java
dac/backend/src/main/java/com/dremio/dac/homefiles/HomeFileConf.java
services/accelerator/src/main/java/com/dremio/service/reflection/materialization/AccelerationStoragePluginConfig.java