什么是ResourceGroup
Amoro中,ResourceGroup表示资源组,为优化器任务的执行提供资源和环境。
ResourceGroup对应着resource_group,表中的每条记录对应一个资源组。
ResourceGroup的管理
ResourceGroup的增删改查在Amoro WebUI上进行,有专门的“优化”菜单项进行优化器组和优化器的管理。
Amoro Server提供ResourceGroup的处理接口。比如创建优化器组接口的处理过程如下:
接口“/optimize/resourceGroups POST”
org.apache.amoro.server.dashboard.controller.OptimizerGroupController#createResourceGroup
// 获取请求报文体,转换为map。主要包含name、container、properties属性。
Map<String, Object> map = ctx.bodyAsClass(Map.class);
// 校验优化器组名称。不能为空,满足"^[A-Za-z0-9_-]{1,50}$"正则表达式,resource_group表中不存在该优化器组名称
validateGroupName(name);
// 构建ResourceGroup.Builder实例,并填充属性
ResourceGroup.Builder builder = new ResourceGroup.Builder(name, container);
// 将ResourceGroup实例持久化到resource_group表中
optimizerManager.createResourceGroup(builder.build());
// 正常返回
ctx.json(OkResponse.of("The optimizer group has been successfully created."));
配置好优化器组后,如何使用呢?
ResourceGroup的使用
Amoro Server在启动过程中会创建一个OptimizingConfigWatcher实例,过程如下:
org.apache.amoro.server.AmoroServiceContainer#main
service.startService();
optimizingService = new DefaultOptimizingService(serviceConfig, catalogManager, optimizerManager, tableService);
OptimizingConfigWatcher optimizingConfigWatcher = new OptimizingConfigWatcher();
OptimizingConfigWatcher类实现了Runnable接口,类中有一个单线程的ScheduledExecutorService定时线程池,用于处理定时任务,定时任务就是刷新ResourceGroup信息,间隔时间由self-optimizing.refresh-group-interval配置,默认是30秒。
刷新ResourceGroup的处理逻辑如下:
org.apache.amoro.server.DefaultOptimizingService.OptimizingConfigWatcher#syncGroups
// 从resource_group表中查询所有的资源组列表
List<ResourceGroup> resourceGroups = optimizerManager.listResourceGroups();
// 获取资源组名称
Set<String> groupNames
// 将“不存在于groupNames,但存在于缓存optimizingQueueByGroup”中的资源组从缓存中移除
Sets.difference(optimizingQueueByGroup.keySet(), groupNames).forEach(DefaultOptimizingService.this::deleteResourceGroup);
// 便利资源组resourceGroups
resourceGroups.forEach(resourceGroup -> {
// 如果optimizingQueueByGroup中不存在此resourceGroup,则创建并存入缓存optimizingQueueByGroup
createResourceGroup(resourceGroup);
// 否则,更新缓存optimizingQueueByGroup中的资源组信息
updateResourceGroup(resourceGroup);
}
)