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

posted on 2024-01-19 10:24  荣锋亮  阅读(7)  评论(0编辑  收藏  举报

导航