dremio 基于Options注解的配置技巧
以前简单写过一个dremio 配置相关的介绍,以下是一个简单的使用
原理
dremio 自己定义了一个Options 的注解,包含此注解的类会被启动的时候进行类扫描加载,Options 的会存储起来(分为不用类型的)
有session 级别的,系统级别的。。。。
简单使用
- pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dalong</groupId>
<artifactId>dremio-conf-options</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<dremio.version>24.3.0-202312190021150029-52db2faf</dremio.version>
</properties>
<dependencies>
<dependency>
// dremio options 模块服务
<groupId>com.dremio.services</groupId>
<artifactId>dremio-services-options</artifactId>
<version>${dremio.version}</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>tencent-public</id>
<url>https://mirrors.cloud.tencent.com/nexus/repository/maven-public/</url>
</repository>
<repository>
<id>dremio-public</id>
<url>https://maven.dremio.com/public/</url>
</repository>
<repository>
<id>dremio-free</id>
<url>https://maven.dremio.com/free/</url>
</repository>
</repositories>
</project>
- 定义配置
ConfValidator.java
package com.dalong;
import com.dremio.options.Options;
import com.dremio.options.TypeValidators;
@Options
public class ConfValidator {
public static final TypeValidators.LongValidator RESERVE = new TypeValidators.PositiveLongValidator("myapp.index", Long.MAX_VALUE, 1);
public static final TypeValidators.LongValidator LIMIT = new TypeValidators.PositiveLongValidator("myapp.pagesize", Long.MAX_VALUE, 1);
}
- 加载配置
基于typesafe 的配置加载 resources/sabot-module.conf 这样dremio就会在启动的时候进行配置的加载,同时我们也是可以进行修改的
dremio.classpath.scanning.packages += "com.dalong"
使用
编译包,直接copy 到dremio 的classpath 中,可以放到jars中也可以放到jars/3rdparty 中
- 效果
同时也可以进行修改
内部加载处理
sabot/kernel/src/main/java/com/dremio/exec/server/options/OptionValidatorListingImpl.java (DACDaemonModule 中会使用加载)
private static CaseInsensitiveMap<OptionValidator> getValidators(ScanResult scanResult) {
ImmutableMap.Builder<String, OptionValidator> builder = ImmutableMap.builder();
for (Class<?> clazz : scanResult.getAnnotatedClasses(Options.class)) {
for (Field field : clazz.getDeclaredFields()) {
if (!OptionValidator.class.isAssignableFrom(field.getType())) {
continue;
}
try {
final OptionValidator optionValidator = (OptionValidator) field.get(null);
builder.put(optionValidator.getOptionName(), optionValidator);
} catch (IllegalAccessException e) {
logger.info("Ignoring not-accessible option {}.{}", clazz.getName(), field.getName(), e);
}
}
}
return CaseInsensitiveMap.newImmutableMap(builder.build());
}
说明
我们开发的一些扩展就可以使用,进行方便的配置管理,dremio 的配置设计还是很方便的
参考资料
sabot/kernel/src/main/java/com/dremio/exec/server/options/OptionValidatorListingImpl.java
dac/backend/src/main/java/com/dremio/dac/daemon/DACDaemonModule.java
services/options/src/main/java/com/dremio/options/OptionManager.java
dac/backend/src/main/java/com/dremio/dac/daemon/DACDaemonModule.java
https://www.cnblogs.com/rongfengliang/p/17061676.html
https://www.cnblogs.com/rongfengliang/p/15969816.html