GCP 工作流超出内存限制

问题描述

我正在尝试使用 Google Cloud Workflows 对 BigQuery 数据集执行 sql 查询。 我的管道将执行几个主要以以下形式的连续查询

create or replace table project_x.dataset_y.table_z as 
     select * from project_x.dataset_y.view_z

其中查询 n 的视图正在读取查询 n-1 的结果表。 为了解决这种依赖性的问题,我使用了这个问题末尾的代码。问题是即使只有一个查询,我的工作流程也会返回错误

{"message":"ResourceLimitError: Memory usage limit exceeded","tags":["ResourceLimitError"]}

在控制台上,查询只需不到 1 分钟即可完成。 任何想法我的工作流程如何使用比它应该更多的内存?什么是最好的修复方法

工作流程代码

main:
  steps:
    - initialize:
        assign:
          - project: "project_x"
          - dataset: "dataset_y"
    - query_n:
        call: BQJobsQuery
        args:
          project: ${project}
          sqlQuery: ${"Create or Replace table `dataset_y.table_z`
                          as select * from `dataset_y.view_z`;"}
        result: bq_response
    - get_job_status:
        call: getJobFinalStatus
        args:
          project: ${project}
          job_id: ${bq_response.jobReference.jobId}
        result: job_status_response

    - returned_result:
        return: ${job_status_response}

BQJobsQuery:
  params: [project,sqlQuery]
  steps:
    - runQuery:
        try:
          call: http.post
          args:
            url: ${"https://bigquery.googleapis.com/bigquery/v2/projects/"+project+"/queries"}
            auth:
              type: OAuth2
            body:
              useLegacysql: false
              query: ${sqlQuery}
          result: queryResult
        except:
          as: e
          steps:
            - UnhandledException:
                raise: ${e}
    - queryCompleted:
        return: ${queryResult.body}

getJobFinalStatus:
    params: [project,job_id]
    steps:
      - sleep:
          call: sys.sleep
          args:
            seconds: 5
      - getJobCurrentStatus:
          call: http.get
          args:
            url: ${"https://bigquery.googleapis.com/bigquery/v2/projects/"+project+"/jobs/"+job_id}
            auth:
              type: OAuth2
          result: jobStatusRes
      - isJobFinished:
          switch:
            - condition: ${jobStatusRes.body.status.state == "RUNNING"}
              next: sleep
      - jobFinished:
          return: ${jobStatusRes.body}

解决方法

variables is limited to 64Kb 的总大小。我不知道 BigQuery 查询响应的长度,但我想您已经突破了这个限制。

已经有一个公开的问题来增加 GCP 工作流上变量的内存限制。您可以在此 issue tracker 上关注其进度。应该快点发布了!敬请期待!

,

请注意,每次将值分配给“结果”时,它都会添加到变量的总大小中,因此如果您以后不需要结果,则可以省略它。 此外,您可以为不再需要的变量赋值为 null,这样可以为其他变量释放空间。