目前此功能主要是支持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/