dremio DACDaemon 简单说明
通过DremioDaemon 我们知道dremio 服务的启动时通过DACDaemon 处理的
DACDaemon的启动
// 包含了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