首页 > 其他分享 >dremio DACModule 模块简单说明

dremio DACModule 模块简单说明

时间:2023-01-20 11:12:44浏览次数:54  
标签:dremio java 模块 dac DACModule bootstrapRegistry new class

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

标签:dremio,java,模块,dac,DACModule,bootstrapRegistry,new,class
From: https://www.cnblogs.com/rongfengliang/p/17062534.html

相关文章

  • Python学习笔记-常用模块介绍--subprocess函数
    1.什么是subprocess?是英文翻译过来,是子进程的意思。sub儿子;process进程2.示例1:importsubprocess#sub是儿子的意思,这个函数是开启了子进程。importtime......
  • Python学习笔记-常用模块介绍--configparser函数
    1.常见的配置有哪些?ini/cnfyaml2.示例#注释1;注释2这是config.ini的文件[mysqld]k1=v1k2:v2user=egonage=18is_admin=truesalary=31[client]k1=......
  • Python学习笔记-常用模块介绍--random随机数函数
    1.random模块基本使用importrandomprint(random.random())#(0,1)----float大于0且小于1之间的小数print(random.randint(1,3))#[1,3]大于等于1且小......
  • Python学习笔记-常用模块介绍--hashlib哈希函数
    1.hash算法是什么?传入的值一样,结果一样。一种哈希算法算出来的结果,长度固定。不能反解。2.(扩展知识)文件下载完成后,进度显示100%,为什么不能立马打开?下载完成后,会进......
  • SOFAJRaft模块启动过程
    本篇文章旨在分析SOFAJRaft中jraft-example模块的启动过程,由于SOFAJRaft在持续开源的过程中,所以无法保证示例代码永远是最新的,要是有较大的变动若有纰漏或者错误的地方,欢......
  • dremio DACDaemon 简单说明
    通过DremioDaemon我们知道dremio服务的启动时通过DACDaemon处理的DACDaemon的启动<wiz_code_mirror>       //包含了DACConfig,模块的类......
  • verilator书写模块testbench
    默认顶层模型名称为top,环境名称为contextpconststd::unique_ptr<VerilatedContext>contextp{newVerilatedContext};conststd::unique_ptr<Vxxx>top{newVxxx{cont......
  • Spring security模块
    在SpringSecurity3.0中,"安全性"模块分为单独的jar文件。目的是根据jar文件的功能进行划分,以便开发人员可以根据其要求进行集成。这还有助于将所需的依赖项设置为maven项......
  • dremio DremioDaemon 简单说明
    DremioDaemon的核心是启动dremio服务同时进行一些依赖的注入简单启动说明包含了自动更新处理(主要是kv存储的,后边会介绍dremio一些任务)查找DACModule创建类,并初始化......
  • 基于simulink的PN码伪码匹配的同步仿真,包括解调,伪码匹配,fft等模块
    1.算法描述在扩频数字通信系统中,接收端与发送端必须实现信息码元同步、PN码元和序列同步及载波同步。只有实现了这些同步,直扩系统才能正常工作,可以说没有同步就没有扩频通......