dremio DACDaemon 简单说明

通过DremioDaemon 我们知道dremio 服务的启动时通过DACDaemon 处理的
DACDaemon的启动

<wiz_code_mirror>
 
 
 
 
 
 
 
  // 包含了DACConfig,模块的类扫描结果, DACModule 模块实现(可以通过配置选择的,比如自定义自己的)
  DACDaemon.newDremioDaemon(config, classPathScan, module)
 
 

DACDaemon 提供的能力

  • 做为dremio 所有服务的单一容器
  • 包含web ui,嵌入式zk(可选,单机模式默认使用),以及sabot 实例的运行
  • 对于服务的启动,也就是DremioDaemon 中调用的init 方法

DACDaemon 类图

如下图,对于我们使用核心是newDremioDaemon 以及init,还有就是closeOnJVMShutDown (DremioDaemon 入口需要的)
同时DACDaemon 也包含了一个自己的main 入口,实际上应该是可以单独运行的(从设计上似乎官方包装DremioDaemon就是为了解决一些
扩展的问题)

 

 

参考处理

  • init 方法
 
public final void init() throws Exception {
  try (TimedBlock b = Timer.time("init")) {
    // 基础通用服务
    startPreServices();
   // 在master 或者无master 模式以及特定,都使用了SingletonRegistry 进行服务管理
    startServices();
    final String text;
    if (isMaster) {
      text = "master";
    } else if (isCoordinator) {
      text = "coordinator";
    } else {
      text = "worker";
    }
    System.out.println("Dremio Daemon Started as " + text);
    // LocalAdmin 服务创建,此服务更多像是一个工具使用的,后边再研究下
    LocalAdmin.getInstance().setDaemon(this);
    if(webServer != null){
      System.out.println(String.format("Webserver available at: %s://%s:%d",
          dacConfig.webSSLEnabled() ? "https" : "http", thisNode, webServer.getPort()));
    }
 
  }
}
  • 对于关联服务的处理以及dacModule模块的调用
   // 基于SingletonRegistry 实际上就是一个guice 的一个扩展模块,会注入DremioServer 服务,同时也提供一个ioc 容器的服务查找能力
   this.bootstrapRegistry = new SingletonRegistry();
    if (isMaster || isMasterless) {
      registry = new SingletonRegistry();
    } else {
      // retry if service start fails due to master is unavailable.
      registry = new NonMasterSingletonRegistry(bootstrapRegistry.provider(MasterStatusListener.class));
    }
 
    if (server == null) {
      registry.bind(DremioServer.class, new DremioServer());
    } else {
      registry.bind(DremioServer.class, server);
    }
    // dacModule 模块方法的调用主要是bootstrap 以及build,详细的后边介绍下,这个类代码还是比较多的
    dacModule.bootstrap(shutdownHook, bootstrapRegistry, scanResult, dacConfig, isMaster);
    dacModule.build(bootstrapRegistry, registry, scanResult, dacConfig, isMaster);
  • DACDaemon 的main 入口
  public static void main(final String[] args) throws Exception {
    try (TimedBlock b = Timer.time("main")) {
      DACConfig config = DACConfig.newConfig();
      // 此处会使用默认的dacModule模块实现,然后启动服务,dremio 为了方便扩展基于DremioDaemon 调整了
      DACDaemon daemon = newDremioDaemon(config, ClassPathScanner.fromPrescan(config.getConfig().getSabotConfig()));
      daemon.init();
      daemon.closeOnJVMShutDown();
    }
  }

说明

DACDaemon 核心是进行dremio所有服务的启动管理,核心上还是对于dacModule 服务的管理,后边会详细介绍关于dacModule 的

参考资料

dac/backend/src/main/java/com/dremio/dac/daemon/DACDaemon.java
common/src/main/java/com/dremio/config/DremioConfig.java
dac/backend/src/main/java/com/dremio/dac/server/DACConfig.java
dac/backend/src/main/java/com/dremio/dac/server/DremioServer.java
common/src/main/java/com/dremio/service/ServiceRegistry.java
dac/backend/src/main/java/com/dremio/dac/daemon/DACDaemonModule.java
dac/backend/src/main/java/com/dremio/dac/daemon/NonMasterSingletonRegistry.java

posted on 2023-01-19 22:30  荣锋亮  阅读(19)  评论(0编辑  收藏  举报

导航