Amoro ResourceGroup的管理机制


发布于 2025-08-28 / 2 阅读 / 0 评论 /
基于amoro-0.9.0,解读ResourceGroup管理机制

什么是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);
		}
	)