쿼리 큐 사용

BigQuery는 동시에 실행할 수 있는 동적 동시 실행 쿼리 수를 결정합니다. 처리 중인 리소스를 사용할 수 있을 때까지 추가 쿼리가 큐에 추가됩니다. 이 문서에서는 최대 동시 실행 목표를 제어하고 대화형 및 일괄 쿼리의 큐 제한 시간을 설정하는 방법을 설명합니다.

개요

BigQuery는 사용 가능한 컴퓨팅 리소스를 기반으로 동시에 실행할 수 있는 쿼리 수를 동적으로 결정합니다. 동시에 실행할 수 있는 쿼리 수는 주문형 프로젝트 또는 예약별로 계산됩니다. 추가 쿼리는 실행을 시작하는 데 사용할 수 있는 용량이 충분할 때까지 큐에 배치됩니다. 큐 길이는 프로젝트가 주문형인지 또는 예약을 사용하는지에 관계없이 리전별 프로젝트별로 대화형 쿼리 1,000개 및 일괄 쿼리 20,000개로 제한됩니다. 다음은 계산된 쿼리 동시 실행이 202개일 때 주문형 프로젝트의 동작을 보여주는 예시입니다.

202개의 동시 쿼리 다음에는 큐에 추가된 쿼리가 오고, 다음에는 오류를 반환하는 쿼리가 차례로 표시됩니다.

예약의 경우 각 쿼리에 최소한의 슬롯 수가 할당되도록 예약에서 동시에 실행될 수 있는 쿼리 수의 상한인 최대 동시 실행 목표를 설정할 수 있습니다. 주문형 프로젝트에는 최대 동시 실행 목표를 지정할 수 없습니다. 최대 동시 실행 목표가 항상 동적으로 계산됩니다.

큐 추가 동작

BigQuery는 단일 프로젝트가 예약의 모든 슬롯을 사용할 수 없도록 공정 예약을 적용합니다.

동시 실행 비중이 가장 적은 프로젝트의 쿼리가 먼저 큐에서 제외됩니다. 실행 중에 슬롯은 프로젝트 내의 작업 간에 분산되기 전에 프로젝트 간에 고르게 분산됩니다.

예를 들어 A와 B라는 두 프로젝트에 할당된 예약이 있다고 가정해 보겠습니다. BigQuery가 예약의 동시 실행을 5개로 계산합니다. 프로젝트 A에는 동시에 실행되는 쿼리 4개가 있고, 프로젝트 B에는 실행 중인 쿼리 1개가 있으며, 다른 쿼리는 큐에 추가됩니다. 프로젝트 B의 1개 쿼리는 비록 프로젝트 A의 쿼리 후에 제출되었다고 해도 먼저 큐에서 제외됩니다. 쿼리 실행이 시작된 후에는 공유 예약에서 공정한 비중의 슬롯을 받습니다.

주문형 프로젝트의 쿼리 작업은 제출된 순서대로 실행됩니다.

BigQuery는 프로젝트당 동시에 실행되는 최대 일괄 쿼리 수를 동적으로 결정합니다.

예약을 삭제하면 큐에 추가된 모든 쿼리가 타임아웃됩니다. 예약에 할당된 프로젝트가 다른 예약에 다시 할당되면 큐에 추가되었거나 실행 중인 모든 요청은 이전 예약에서 계속 그대로 진행되며 새 요청은 모두 새 예약으로 이동합니다. 예약에 할당된 프로젝트가 예약에서 삭제되면 실행 중인 쿼리는 예약에서 계속 실행되며 신규 요청 및 큐에 추가된 요청은 주문형 모델을 사용하여 실행됩니다. 실행 중이거나 큐에 추가된 개별 쿼리 작업을 선택적으로 취소할 수 있습니다.

큐 제한 시간 제어

대화형 쿼리 또는 일괄 쿼리의 큐 시간 제한을 제어하려면 ALTER PROJECT SET OPTIONS 또는 ALTER ORGANIZATION SET OPTIONS을 사용하여 프로젝트 또는 조직의 기본 구성에서 default_interactive_query_queue_timeout_ms 또는 default_batch_query_queue_timeout_ms 필드를 설정합니다.

프로젝트의 대화형 또는 일괄 쿼리에 대한 큐 제한 시간을 보려면 INFORMATION_SCHEMA.EFFECTIVE_PROJECT_OPTIONS를 쿼리합니다.

큐를 사용 중지하려면 큐 제한 시간을 -1로 설정합니다. 최대 쿼리 동시 실행 수에 도달하면 ADMISSION_DENIED 오류가 발생하면서 추가 쿼리가 실패합니다.

최대 동시 실행 목표 설정

예약을 만들 때 최대 동시 실행 목표를 수동으로 설정할 수 있습니다. 기본적으로 최대 동시 실행 목표는 0개입니다. 즉, BigQuery는 사용 가능한 리소스를 기준으로 동시 실행 수를 동적으로 결정합니다. 0이 아닌 목표를 설정하면 최대 동시 실행 목표가 예약에서 동시에 실행되는 쿼리 수의 상한을 지정하여 실행되는 각 쿼리에 사용 가능한 최소 슬롯 용량을 보장합니다.

최대 동시 실행 목표를 늘린다고 반드시 더 많은 쿼리가 동시에 실행되는 것은 아닙니다. 실제 동시 실행은 사용 가능한 컴퓨팅 리소스에 따라 달라지며, 예약에 슬롯을 더 추가하여 늘릴 수 있습니다.

필요한 역할

새 예약에서 동시 실행을 설정하는 데 필요한 권한을 얻으려면 관리자에게 약정 소유권을 유지하는 관리 프로젝트에 대한 BigQuery 리소스 편집자(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 리소스 편집자(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 Reservation 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시간 후에 타임아웃됩니다.
  • 주문형 프로젝트에서 실행되는 쿼리는 최대 동시 실행 목표를 설정할 수 없습니다.
  • Standard 버전 예약으로 실행되는 쿼리는 최대 동시 실행 목표를 설정할 수 없습니다. 버전에 대한 자세한 내용은 BigQuery 버전 소개를 참조하세요.

다음 단계