资源组
资源组限制资源使用,可以对运行在其中的任务执行强制排队策略,也可以在子组间分配资源。一个任务属于一个资源组,消费这个组的资源。除了对排队任务限制外,当资源组用完资源时,不会导致正在运行的任务失败,而是让新的任务排队。资源组可能有子组或者接收任务,也可能都不。
资源组和相关筛选规则由一个插件配置。etc/resource-groups.properties这个配置文件有如下内容,内部插件可以读取json配置文件。
resource-groups.configuration-manager=fileresource-groups.config-file=etc/resource_groups.json
修改resource-groups.config-file这个属性的值指向一个json配置文件,这个可以是一个相对路径也可以是一个绝对路径。
资源组属性
name(必须):组名称,可以是一个模板
maxQueued(必须):排队任务的最大数量,一旦达到这个数量,新的任务将被拒绝
hardConcurrencyLimit(必须):正在运行的任务的数量
softMemoryLimit(必须):这个组分布式内存的最大使用量,一旦到达,新任务排队。可以指定为一个绝对值,也可以指定对集群的百分比。
softCpuLimit(可选):一个周期里可以使用cpu的时间,hardCpuLimit也必须指定
hardCpuLimit(可选):一个周期里可以使用的cpu时间
schedulingPolicy(可选):指定排队任务执行的优先级,子组执行任务的优先级,有以下三个选项:
- fair(默认):排队中的查询以first-in-first-out形式调度,如果子组中有排队,轮流执行
- weighted_fair:子组选择基于schedulingWeight和目前在运行的任务。运行的任务需要的资源是基于合格的子组的权重。选择相对于其资源具有最少并发性的子组来启动下一个查询。
- weighted:排队任务按照优先级顺序随机选择,选择子组与它们的调度权重成比例地启动新查询。
- query_priority:所有子组也必须指定query_priority,排队任务将根据priority严格执行
schedulingWeight(可选):子组权重,默认为1
jmxExport(可选):如果设置为true,组相关的统计指标被吓到JMX以便监控,默认为false
subGroups(可选):子组列表
选择规则
user(可选):匹配用户名
source(可选):匹配源头
queryType(可选):匹配任务类型
- DATA_DEFINITION:alter/create/drop schemas/tables/views的元数据和权限、会话、事物相关的任务
- DELETE:删除数据的任务
- DESCRIBE:
DESCRIBE
,DESCRIBE INPUT
,DESCRIBE OUTPUT
, andSHOW
类型的任务 - EXPLAIN:EXPLAIN类型的任务
- INSERT:
INSERT
和CREATE TABLE AS
类型的任务 - SELECT:SELECT类型的任务
clientTags(可选):tag列表,每个tag必须在用户提交任务的tag列表里
group(必须):这些任务运行的组
全局属性
cpuQuotaPeriod(可选):cpu份额被强制执行的时间
选择器顺序处理,匹配的第一个将被使用
提供选择器属性
source名字可以如下设置:
- CLI:用--source属性
- JDBC:通过连接实例设置ApplicationName属性
Client tags可以如下设置
- CLI:用--client-tags属性
- JDBC:通过连接实例设置ClientTags属性
例子
例子中的配置如下,这里有多个资源组,一些是模板。模板允许管理员动态的构建资源树。例如,在pipeline_${USER} 组中,${USER}将被扩展为提交任务的用户名。${SOURCE}也支持,将被扩展为提交任务的来源。你可以用自定义变量在source和user正则表达式中
这里定义了四个筛选器,这些任务运行在子组中:
- 第一个筛选器匹配bob的任务,并放在admin组中运行
- 第二个筛选器匹配所有的来源名字包含pipeline的DDL任务,放在global.data_definition组中运行。这有助于减少这类任务的执行时间,因为他们一般需要快速运行
- 第三个筛选器匹配来源中包含pipeline的任务,并放在global.pipeline中的dynamically-created per-user pipeline组中
- 第四个筛选器来源于 BI tools 的任务,并且客户端提供的tag是“hi-pri”的超集。他们被放在global.pipeline.tools组里的动态创建的子组。动态子组的创建基于tool_name变量的名字,从来源的正则表达式中取出。一个任务来源为“jdbc#powerfulbi”,用户为“kayla”,客户端tag为“hipri”和“fast”,这个任务将被放在global.pipeline.bi-powerfulbi.kayla资源组中。
- 最后一个筛选器是针对所有没有被前面匹配的任务。
这些筛选器继承了如下策略:
- 用户“bob”是管理员,能同时运行50个任务,任务运行基于用户提供的priority
其它的用户:
- 不能同时运行100个任务
- 来源为“pipeline”的最多可以同时运行5个DDL任务,先进先出
- Non-DDL任务运行在global.pipeline中,总并发为45,每个用户并发为5,先进先出
- 对应BI tools,每个tools最多可以运行10个任务,每个用户最多运行3个。如果超过10个,运行任务最少的用户将可以继续运行,这样是保持公平。
- 其它任务被放在global.adhoc.other中的per-user 组中运行,运行相似
{ "rootGroups": [ { "name": "global", "softMemoryLimit": "80%", "hardConcurrencyLimit": 100, "maxQueued": 1000, "schedulingPolicy": "weighted", "jmxExport": true, "subGroups": [ { "name": "data_definition", "softMemoryLimit": "10%", "hardConcurrencyLimit": 5, "maxQueued": 100, "schedulingWeight": 1 }, { "name": "adhoc", "softMemoryLimit": "10%", "hardConcurrencyLimit": 50, "maxQueued": 1, "schedulingWeight": 10, "subGroups": [ { "name": "other", "softMemoryLimit": "10%", "hardConcurrencyLimit": 2, "maxQueued": 1, "schedulingWeight": 10, "schedulingPolicy": "weighted_fair", "subGroups": [ { "name": "${USER}", "softMemoryLimit": "10%", "hardConcurrencyLimit": 1, "maxQueued": 100 } ] }, { "name": "bi-${tool_name}", "softMemoryLimit": "10%", "hardConcurrencyLimit": 10, "maxQueued": 100, "schedulingWeight": 10, "schedulingPolicy": "weighted_fair" "subGroups": [ { "name": "${USER}", "softMemoryLimit": "10%", "hardConcurrencyLimit": 3, "maxQueued": 10 } ] } ] }, { "name": "pipeline", "softMemoryLimit": "80%", "hardConcurrencyLimit": 45, "maxQueued": 100, "schedulingWeight": 1, "jmxExport": true, "subGroups": [ { "name": "pipeline_${USER}", "softMemoryLimit": "50%", "hardConcurrencyLimit": 5, "maxQueued": 100, } ] } ] }, { "name": "admin", "softMemoryLimit": "100%", "hardConcurrencyLimit": 50, "maxQueued": 100, "schedulingPolicy": "query_priority", "jmxExport": true } ], "selectors": [ { "user": "bob", "group": "admin" }, { "source": ".*pipeline.*", "queryType": "DATA_DEFINITION", "group": "global.data_definition" }, { "source": ".*pipeline.*", "group": "global.pipeline.pipeline_${USER}" }, { "source": "jdbc#(?.*)", "clientTags": ["hipri"], "group": "global.adhoc.bi-${tool_name}.${USER}" }, { "group": "global.adhoc.other.${USER}" } ], "cpuQuotaPeriod": "1h"}