dremio provision 模式功能简单说明

目前此功能主要是支持yarn 等资源调度的,在dremio 系统中名称为弹性引擎

ProvisioningService 服务接口定义

参考类图

 

 

不同类型的实现

具体操作是由ProvisioningServiceDelegate定义进行操作的,并在dremio 启动的时候会包含相关服务能力的创建,因为ProvisioningService 服务实现了标准service
接口
服务初始化

 
 public ProvisioningServiceImpl(
    final DremioConfig dremioConfig,
    final Provider<LegacyKVStoreProvider> kvStoreProvider,
    final NodeProvider executionNodeProvider,
    ScanResult scanResult,
    Provider<OptionManager> optionProvider,
    Provider<EditionProvider> editionProvider) {
    this.kvStoreProvider = Preconditions.checkNotNull(kvStoreProvider, "store provider is required");
   // 初始化ProvisioningServiceDelegate 实现列表(基于类型,基于类扫描机制)
    this.delegateProvider = () -> buildConcreteServices(
      scanResult,
      dremioConfig,
      executionNodeProvider,
      optionProvider,
      editionProvider,
      this
    );
  }

查找到的实现类型

 private static Map<ClusterType, ProvisioningServiceDelegate> buildConcreteServices(
    ScanResult scanResult,
    DremioConfig dremioConfig,
    NodeProvider executionNodeProvider,
    Provider<OptionManager> optionProvider,
    Provider<EditionProvider> editionProvider,
    ProvisioningServiceImpl provisioningServiceImpl){
    Set<Class<? extends ProvisioningServiceDelegate>> serviceClasses =
      scanResult.getImplementations(ProvisioningServiceDelegate.class);
    Map<ClusterType, ProvisioningServiceDelegate> concreteServices = new HashMap<>();
    for (Class<? extends ProvisioningServiceDelegate> provisioningServiceClass : serviceClasses) {
      try {
        Constructor<? extends ProvisioningServiceDelegate> ctor =
          provisioningServiceClass.getConstructor(DremioConfig.class, ProvisioningStateListener.class, NodeProvider.class, OptionManager.class,
            EditionProvider.class);
        ProvisioningServiceDelegate provisioningService =
          ctor.newInstance(dremioConfig, provisioningServiceImpl, executionNodeProvider, optionProvider.get(),
          editionProvider.get());
 
        concreteServices.put(provisioningService.getType(), provisioningService);
      } catch (ReflectiveOperationException e) {
        logger.error("Unable to create instance of {} class", provisioningServiceClass.getName(), e);
      }
    }
    return Collections.unmodifiableMap(concreteServices);
  }
 
 

ProvisioningServiceDelegate 类图能力

社区版的实现

默认操作图如下(可以看到包含的是yarn )

 

 


实际支持的类型

 

 

provision 模块提供的能力

参考类图,可以看到包含了一个默认的实现(yarn 类型的),里边包含了集群创建,集群启动,集群停止,集群信息同步,集群配置更新(具体在yarn 模块中)
我以前简单说过是基于了apache twill 进行的资源控制开发的(后边详细说明下开发流程)

 

 

provision 服务的使用

包含了DACDaemonModule 对于ProvisioningService 的注册(到dremio 的ioc 管理中),ui 中的web api ProvisioningResource 主要是进行yarn 资源的
创建包含了状态查看,配置修改(会同时更新yarn 资源可能需要重启),所有集群信息查看,以及删除yarn 集群资源,对于内部yarn 的创建管理以及注册
我后边详细介绍

参考资料

provision/common/src/main/java/com/dremio/provision/service/ProvisioningServiceDelegate.java
provision/common/src/main/java/com/dremio/provision/service/ProvisioningServiceImpl.java
services/resourcescheduler/src/main/java/com/dremio/resource/RuleBasedEngineSelector.java
services/resourcescheduler/src/main/java/com/dremio/resource/GroupResourceInformation.java
sabot/kernel/src/main/java/com/dremio/exec/ops/QueryContext.java
services/resourcescheduler/src/main/java/com/dremio/resource/ClusterResourceInformation.java
services/resourcescheduler/src/main/java/com/dremio/resource/SelectedExecutorsResourceInformation.java
sabot/kernel/src/main/java/com/dremio/exec/planner/fragment/SimpleParallelizer.java
dac/daemon/src/main/java/com/dremio/dac/daemon/YarnDaemon.java
provision/common/src/main/java/com/dremio/provision/resource/ProvisioningResource.java
dac/backend/src/main/java/com/dremio/dac/daemon/DACDaemonModule.java
https://docs.dremio.com/software/deployment/yarn-deployment/
https://docs.dremio.com/software/advanced-administration/workload-management/

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

导航