presto Resource Groups

资源组

资源组限制资源使用,能够对运行在其中的任务执行强制排队策略,也能够在子组间分配资源。一个任务属于一个资源组,消费这个组的资源。除了对排队任务限制外,当资源组用完资源时,不会致使正在运行的任务失败,而是让新的任务排队。资源组可能有子组或者接收任务,也可能都不。正则表达式

资源组和相关筛选规则由一个插件配置。etc/resource-groups.properties这个配置文件有以下内容,内部插件能够读取json配置文件。json

resource-groups.configuration-manager=file
resource-groups.config-file=etc/resource_groups.json

修改resource-groups.config-file这个属性的值指向一个json配置文件,这个能够是一个相对路径也能够是一个绝对路径。c#

资源组属性

name(必须):组名称,能够是一个模板并发

maxQueued(必须):排队任务的最大数量,一旦达到这个数量,新的任务将被拒绝分布式

hardConcurrencyLimit(必须):正在运行的任务的数量spa

softMemoryLimit(必须):这个组分布式内存的最大使用量,一旦到达,新任务排队。能够指定为一个绝对值,也能够指定对集群的百分比。插件

softCpuLimit(可选):一个周期里可使用cpu的时间,hardCpuLimit也必须指定code

hardCpuLimit(可选):一个周期里可使用的cpu时间继承

schedulingPolicy(可选):指定排队任务执行的优先级,子组执行任务的优先级,有如下三个选项:ip

  • 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:DESCRIBEDESCRIBE INPUTDESCRIBE OUTPUT, and SHOW类型的任务
  • 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#(?<tool_name>.*)",
      "clientTags": ["hipri"],
      "group": "global.adhoc.bi-${tool_name}.${USER}"
    },
    {
      "group": "global.adhoc.other.${USER}"
    }
  ],
  "cpuQuotaPeriod": "1h"
}
相关文章
相关标签/搜索