dremio DACModule 模块简单说明

DACModule 核心是进行dac 一个帮助类,进行一些依赖的处理,方便在DACDaemon 中使用,同时官方为了支持自定义
基于动态类创建进行了扩展(DremioDaemon 处理的)

接口定义

参考类图

 

 


备注: 会发现包含两个SingletonRegistry (bootstrap的以及一个普通的,主要是不同优先级的服务处理),会将不同的服务模块注册到ioc 容器中,方便共享
使用

参考实现

包含了一个默认实现DACDaemonModule,以及几个方便测试的,如下

 

 

bootstrapRegistry 注册的服务

包含了bootstap context ,内存分配,集群协调器,master 选举服务,请求上下文等,会对于不同的节点角色提供不能的服务注册
参加如下

 
public void bootstrap(final Runnable shutdownHook, final SingletonRegistry bootstrapRegistry, ScanResult scanResult, DACConfig dacConfig, boolean isMaster) {
    final DremioConfig config = dacConfig.getConfig();
    final boolean embeddedZookeeper = config.getBoolean(DremioConfig.EMBEDDED_MASTER_ZK_ENABLED_BOOL);
    final BootStrapContext bootStrapContext = new BootStrapContext(config, scanResult, bootstrapRegistry);
    boolean isMasterless = config.isMasterlessEnabled();
 
    bootstrapRegistry.bindSelf(bootStrapContext);
 
    bootstrapRegistry.bind(BufferAllocator.class, bootStrapContext.getAllocator());
 
    // Start cluster coordinator before all other services so that non master nodes can poll for master status
    if (dacConfig.getClusterMode() == ClusterMode.LOCAL) {
      bootstrapRegistry.bind(ClusterCoordinator.class, new LocalClusterCoordinator());
    } else if (config.getBoolean(DremioConfig.NO_OP_CLUSTER_COORDINATOR_ENABLED)) {
      isMasterless = true;
      Preconditions.checkState(!isMaster);
      bootstrapRegistry.bind(ClusterCoordinator.class, new NoOpClusterCoordinator());
    } else {
      // ClusterCoordinator has a runtime dependency on ZooKeeper. If no ZooKeeper server
      // is present, ClusterCoordinator won't start, so this service should be initialized first.
      final Provider<Integer> portProvider;
      if (isMaster && embeddedZookeeper) {
        ZkServer zkServer = new ZkServer(
            config.getString(DremioConfig.EMBEDDED_MASTER_ZK_ENABLED_PATH_STRING),
            config.getInt(DremioConfig.EMBEDDED_MASTER_ZK_ENABLED_PORT_INT),
            dacConfig.autoPort);
        bootstrapRegistry.bindSelf(zkServer);
 
        portProvider = dacConfig.autoPort ? new Provider<Integer>(){
          @Override
          public Integer get() {
            return bootstrapRegistry.lookup(ZkServer.class).getPort();
          }} : null;
      } else {
        portProvider = null;
      }
 
      final ZKClusterCoordinator coord;
      try {
        coord = new ZKClusterCoordinator(config.getSabotConfig(), portProvider);
      } catch (IOException e) {
        throw new RuntimeException("Cannot instantiate the ZooKeeper cluster coordinator", e);
      }
      bootstrapRegistry.bind(ClusterCoordinator.class, coord);
    }
 
    // Start master election
    if (isMaster && !config.getBoolean(DremioConfig.DEBUG_DISABLE_MASTER_ELECTION_SERVICE_BOOL)) {
      bootstrapRegistry.bindSelf(new MasterElectionService(bootstrapRegistry.provider(ClusterCoordinator.class)));
    }
 
    final MasterStatusListener masterStatusListener;
    final Provider<ClusterServiceSetManager> clusterServiceSetManagerProvider =
      () -> bootstrapRegistry.provider(ClusterCoordinator.class).get();
 
    if (!isMasterless) {
      masterStatusListener = new MasterStatusListener(clusterServiceSetManagerProvider, config.getSabotConfig(), isMaster);
    } else {
      masterStatusListener =
        new MasterlessStatusListener(clusterServiceSetManagerProvider, isMaster);
    }
    // start master status listener
    bootstrapRegistry.bind(MasterStatusListener.class, masterStatusListener);
    bootstrapRegistry.bindProvider(EngineId.class, Providers.of(null));
    bootstrapRegistry.bindProvider(SubEngineId.class, Providers.of(null));
 
    // Default request Context
    bootstrapRegistry.bind(RequestContext.class,
      RequestContext.empty()
        .with(TenantContext.CTX_KEY, TenantContext.DEFAULT_SERVICE_CONTEXT)
        .with(UserContext.CTX_KEY, UserContext.SYSTEM_USER_CONTEXT)
    );
 
  }

普通registry注册的服务

普通registry注册的服务就比较多了,包含了不少能力,也是dremio 节点的一些核心能力模块
具体参考build 方法,注意此处也依赖了bootstrapRegistry,会将一些注册的binding 复制到普通registry 中
具体的代码比较多,核心是对于dremio的服务进行注册到ioc 容器中,包含了:执行服务(ExecutorService)
内存分配器工厂(集成了bootstrapRegistry的),ConnectionReader(数据连接读取的)rpc 处理,fabric 服务
身份服务,ConduitServiceRegistry,ConduitServer,ConduitInProcessChannelProvider,kv 存储,整理的一些参考注册服务(很多,将dremio
的核心服务都关联起来了,比如认证,反射加速,数据源数据,catalog服务,namespace 服务,taskpool 任务执行服务。。。。),参考如下
InformationSchemaServiceBlockingStub,DatasetCatalogServiceBlockingStub,ProjectRoleInitializer,ViewCreatorFactory,UserServer,ContextService,SabotContext, NodeEndpoint,NamespaceService,DatasetListingService,CoordExecService,HomeFileTool,SchedulerService,SystemOptionManager,OptionManager,SplitOrphansCleanerService,SpillService,CatalogService,CommandPool,LocalJobsService,SimpleJobRunner,ProvisioningService,ResourceAllocator,ExecutorSelectionService,MaestroForwarder,MaestroServicem,RuleBasedEngineSelector,foremenWorkManager,UserWorker,ContextInformationFactory,TaskPool,workloadTicketDepotService,JobResultsClientFactory,fragmentWorkManager,AccelerationManager,StatisticsService,JobsService,ReflectionService,ReflectionStatusService,ServerHealthMonitor,SupportService,NodeRegistration,SearchService,RestServerV2,APIServer,DremioServlet,SourceService,DremioFlightService,NessieService,UserPreferenceService,WebServer,TokenManager

说明

以上是一个简单的说明,如果希望完整的了解组件的关联关系,可以详细阅读的源码,部分组件我以前也简单的介绍过,可以参考,后边我也会详细介绍下

参考资料

dac/backend/src/main/java/com/dremio/dac/daemon/DACModule.java
dac/backend/src/main/java/com/dremio/dac/daemon/DACDaemonModule.java
dac/backend/src/test/java/com/dremio/dac/server/TestMultiMaster.java
dac/backend/src/test/java/com/dremio/dac/server/TestServerTracing.java
dac/backend/src/main/java/com/dremio/dac/daemon/DACDaemon.java
https://www.cnblogs.com/rongfengliang/p/17061281.html

posted on 2023-01-20 10:55  荣锋亮  阅读(38)  评论(0编辑  收藏  举报

导航