使用查询队列

BigQuery 会自动确定可并发运行的查询数量,称为动态并发。如有更多查询,这些查询会排入队列,直到处理资源可用。本文档介绍如何控制最大并发数目标,以及如何为交互式查询和批量查询设置队列超时。

概览

BigQuery 会根据可用的计算资源动态确定可以并发运行的查询数量。可以并发运行的查询数量按每个按需项目或每个预留计算得出。其他查询会放入队列中,直到有足够的容量可用于开始执行查询。无论项目是按需使用还是使用预留,队列长度都限制为每个区域每个项目 1,000 个交互式查询和 20,000 个批量查询。以下示例显示了当计算的查询并发数量为 202 时按需项目的行为:

202 个并发查询,后跟已加入队列的查询,后跟返回错误的查询。

对于预留,您可以选择设置最大并发数目标(即预留中可以并发运行的查询数量上限),以确保为每个查询分配最小数量的槽。您无法为按需项目指定最大并发数目标;始终动态计算。

排队行为

BigQuery 会强制执行公平调度,以确保任何单个项目都不会使用预留中的所有槽。

并发数量份额最小的项目的查询会被首先移出队列。在执行期间,槽首先在项目之间均匀分发,然后在项目中的所有作业之间继续分发。

例如,假设您有一个预留分配给两个项目:A 和 B。BigQuery 为预留计算出的并发数量为 5。 项目 A 有四个正在并发运行的查询,项目 B 有一个正在运行的查询,其他查询会排入队列。来自项目 B 的查询将首先移出队列,即使该查询是在项目 A 的查询之后提交的也是如此。查询开始执行后,它会在共享预留中收到相等份额的槽。

除了并发查询总数之外,BigQuery 还会动态确定每个按需项目或预留可运行的并发批量查询数上限。如果同时运行的批量查询数量达到此上限,系统会优先处理 Interactive 查询,即使它们提交的时间较晚也是如此。

当您删除预留时,所有排队的查询都会超时。当分配给某个预留的项目被重新分配给其他预留时,所有正在排队或运行的请求都会在旧预留中继续当前状态,而所有新请求都会转到新预留。从预留中移除分配给该预留的项目时,正在运行的查询会继续在该预留中运行,而新请求和排队的请求则使用按需模型执行。您可以选择取消个别正在运行或排队的查询作业。

控制队列超时

如需控制交互式查询或批量查询的队列超时,请使用 ALTER PROJECT SET OPTIONS 语句ALTER ORGANIZATION SET OPTIONS 语句设置项目或组织的默认配置中的 default_interactive_query_queue_timeout_msdefault_batch_query_queue_timeout_ms 字段。

如需查看项目中交互式查询或批量查询的队列超时,请查询 INFORMATION_SCHEMA.EFFECTIVE_PROJECT_OPTIONS 视图

如需关闭队列,请将队列超时设置为 -1。如果达到查询并发数上限,则其他查询将失败并显示 ADMISSION_DENIED 错误。

设置最大并发数目标值

您可以在创建预留时手动设置最大并发数目标值。默认情况下,最大并发数目标为零,这意味着 BigQuery 会根据可用资源动态确定并发。否则,如果您设置了非零目标,则最大并发数目标会指定一个预留中并发运行的查询数量的上限,从而保证每个查询可运行的槽容量下限。

提高最大并发数目标不能保证同时执行更多查询。实际并发数取决于可用的计算资源,您可以通过向预留添加更多槽来增加可用的资源。

所需的角色

如需获得在新预留中设置并发数所需的权限,请让您的管理员为您授予维持承诺所有权的管理项目BigQuery Resource Editor (roles/bigquery.resourceEditor) IAM 角色。 如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

此预定义角色包含在新预留中设置并发数所需的 bigquery.reservations.create 权限。

您也可以使用自定义角色或其他预定义角色来获取此权限。

如需详细了解 BigQuery 中的 IAM 角色,请参阅预定义的角色和权限

为预留设置最大并发数目标

从下列选项中选择一项:

控制台

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在导航菜单中,转到容量管理部分。

  3. 点击创建预留

  4. 选择您的预留设置

  5. 如需展开高级设置部分,请点击 展开箭头。

  6. 如需设置目标作业并发,请点击开启替换自动目标作业并发切换开关,然后输入目标作业并发

  7. 点击保存

SQL

如需为新预留设置最大并发数目标,请使用 CREATE RESERVATION DDL 语句并设置 target_job_concurrency 字段

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

    CREATE RESERVATION `ADMIN_PROJECT_ID.LOCATION.RESERVATION_NAME`
      OPTIONS (
        target_job_concurrency = CONCURRENCY);

    请替换以下内容:

    • ADMIN_PROJECT_ID:拥有预留的项目
    • LOCATION:预留的位置,例如 region-us
    • RESERVATION_NAME:预留的名称
    • CONCURRENCY:最大并发数目标

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

bq

如需为新预留设置最大并发数目标值,请运行 bq mk 命令

bq mk \
    --project_id=ADMIN_PROJECT_ID \
    --location=LOCATION \
    --target_job_concurrency=CONCURRENCY \
    --reservation \
    RESERVATION_NAME

请替换以下内容:

  • ADMIN_PROJECT_ID:拥有预留的项目
  • LOCATION:预留的位置
  • CONCURRENCY:最大并发数目标
  • RESERVATION_NAME:预留的名称

API

如需在 BigQuery Reservation API 中设置最大并发数目标,请在预留资源中设置 concurrency 字段并调用 CreateReservationRequest 方法

更新最大并发数目标值

您可以随时更新预留的并发数目标。 但是,提高目标值并不能保证可同时执行更多查询。实际并发数取决于可用的计算资源。 如果降低最大并发数目标,则当前正在运行的查询不会受到影响,并且排队的查询不会运行,直到并发查询的数量少于新目标值为止。

如果将最大并发数目标设置为 0,BigQuery 会根据可用资源动态确定并发(默认行为)。

所需的角色

如需获得更新预留的最大并发数目标所需的权限,请让您的管理员为您授予维持承诺所有权的管理项目BigQuery Resource Editor (roles/bigquery.resourceEditor) IAM 角色。 如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

此预定义角色包含更新预留的最大并发数目标所需的 bigquery.reservations.update 权限。

您也可以使用自定义角色或其他预定义角色来获取此权限。

如需详细了解 BigQuery 中的 IAM 角色,请参阅预定义的角色和权限

更新预留的最大并发数目标

从下列选项中选择一项:

控制台

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在导航菜单中,转到容量管理部分。

  3. 点击槽预留标签页。

  4. 找到要更新的预留。

  5. 展开 操作选项。

  6. 点击修改

  7. 如需展开高级设置部分,请点击 展开箭头。

  8. 如需设置目标作业并发,请点击开启替换自动目标作业并发切换开关,然后输入目标作业并发

  9. 点击保存

SQL

如需更新现有预留的最大并发数目标,请使用 ALTER RESERVATION DDL 语句,并设置 target_job_concurrency 字段

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

    ALTER RESERVATION `ADMIN_PROJECT_ID.LOCATION.RESERVATION_NAME`
    SET OPTIONS (
      target_job_concurrency = CONCURRENCY);

    请替换以下内容:

    • ADMIN_PROJECT_ID:拥有预留的项目
    • LOCATION:预留的位置,例如 region-us
    • RESERVATION_NAME:预留的名称
    • CONCURRENCY:最大并发数目标

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

bq

如需更新现有预留的最大并发数目标,请运行 bq update 命令

bq update \
    --project_id=ADMIN_PROJECT_ID \
    --location=LOCATION \
    --target_job_concurrency=CONCURRENCY \
    --reservation \
    RESERVATION_NAME

请替换以下内容:

  • ADMIN_PROJECT_ID:拥有预留的项目
  • LOCATION:预留的位置
  • CONCURRENCY:最大并发数目标
  • RESERVATION_NAME:预留的名称

API

如需更新 BigQuery Reservations API 中的最大并发数目标,请在预留资源中设置 concurrency 字段并调用 UpdateReservationRequest 方法

监控

如需了解哪些查询正在运行以及哪些查询已加入队列,请查看 INFORMATION_SCHEMA.JOBS_BY_*INFORMATION_SCHEMA.JOBS_TIMELINE_BY_* 视图。对于正在运行的查询,将 state 字段设置为 RUNNING;对于已加入队列的查询,设置为 PENDING

如需查看过去一天达到动态并发阈值时每秒运行的并发查询数,请运行以下查询:

SELECT
  t1.period_start,
  t1.job_count AS dynamic_concurrency_threshold
FROM (
  SELECT
    period_start,
    state,
    COUNT(DISTINCT job_id) AS job_count
  FROM
    `PROJECT_ID.REGION_ID`.INFORMATION_SCHEMA.JOBS_TIMELINE
  WHERE
    period_start BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
    AND CURRENT_TIMESTAMP()
    AND reservation_id = "RESERVATION_ID"
  GROUP BY
    period_start,
    state) AS t1
JOIN (
  SELECT
    period_start,
    state,
    COUNT(DISTINCT job_id) AS job_count
  FROM
    `PROJECT_ID.REGION_ID`.INFORMATION_SCHEMA.JOBS_TIMELINE
  WHERE
    state = "PENDING"
    AND period_start BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
    AND CURRENT_TIMESTAMP()
    AND reservation_id = "RESERVATION_ID"
  GROUP BY
    period_start,
    state
  HAVING
    COUNT(DISTINCT job_id) > 0 ) AS t2
ON
  t1.period_start = t2.period_start
WHERE
  t1.state = "RUNNING";

替换以下内容:

  • PROJECT_ID:运行查询的项目的名称
  • REGION_ID:处理查询的位置
  • RESERVATION_ID:运行查询的预留的名称

如需监控预留的查询队列长度,您可以使用 BigQuery 管理资源图表并选择作业并发图表和待处理指标。

管理资源图表中的队列长度。

您还可以在 Cloud Monitoring 中监控队列长度,方法是查看作业计数指标并按待处理状态的作业数量过滤。

Cloud Monitoring 中的队列长度。

限制

  • 每个按需项目一次最多可以将 1,000 个交互式查询和 20,000 个批量查询排入队列。超出此限制的查询会返回配额错误。 您不能申请提高这些限制。
  • 在预留中,分配给该预留的每个项目一次最多可以将 1,000 个交互式查询和 20,000 个批量查询排入队列。超出此限制的查询会返回配额错误。 您不能申请提高这些限制。
  • 默认情况下,尚未开始执行的查询作业在交互式查询后 6 小时后超时,在批量查询时超时 24 小时。
  • 您无法为在按需项目中运行的查询设置最大并发数目标。
  • 您无法为使用标准版预留运行的查询设置最大并发数目标。如需详细了解版本,请参阅 BigQuery 版本简介

后续步骤