在独立模式下运行 Mainframe Connector

本页讨论了如何在 Cloud Run 上安装 Mainframe Connector、转码数据、将数据保存到 BigQuery 以及从 BigQuery 导出数据。

Mainframe Connector 5.13.0 版及更高版本支持在 Google Cloud上以独立作业的形式运行 Mainframe Connector。借助此功能,您可以将 Mainframe Connector 作为容器化批量作业运行,例如作为 Cloud Run 作业、Google Kubernetes Engine 作业或在 Docker 容器中运行。此选项有助于您避免在大型机上本地安装 Mainframe Connector,并让您更轻松地将大型机排队顺序存取方法 (QSAM) 文件解析集成到现有的提取、转换和加载 (ETL) 工作流中。

使用独立版 Mainframe Connector 时,您必须自行设置将 QSAM 文件加载到 Google Cloud 的 ETL 工作流。

准备工作

  • 在 Cloud Run 上部署 Mainframe Connector
  • 创建服务账号或确定要与 Mainframe Connector 搭配使用的现有服务账号。此服务账号必须具有访问 Cloud Storage 存储分区、BigQuery 数据集以及您要使用的任何其他 Google Cloud 资源的权限。
  • 确保您创建的服务账号已分配 Cloud Run Invoker 角色
  • 确保大型机数据已在 Google Cloud 上以 QSAM 文件形式提供。

在 Cloud Run 上以独立模式使用 Mainframe Connector 转码数据

Mainframe Connector 提供了两种在 Google Cloud上以独立作业形式运行 Mainframe Connector 的方式:

qsam 命令的优势

qsam 命令具有以下优势:

  • 支持复合数据类型,包括 OCCURS 子句(列表)、REDEFINES 子句和嵌套记录。如需详细了解这些数据类型,请参阅qsam 转码参考文档
  • 支持通过转码器配置文件配置转码流程。 此功能在将数据解码为 Google Cloud以及将数据编码回大型机时,可提供更高的灵活性。
  • 支持创建溢出数据集,这是一个转码错误表,可用于检查错误。
  • 支持多种输入和输出格式。 借助此功能,您可以将数据加载到各种数据仓库,也可以从各种数据仓库加载数据。

使用 qsam 命令以独立模式运行 Mainframe Connector

如需使用 qsam 命令以独立模式使用 Mainframe Connector 对数据进行转码,请按以下步骤操作:

  1. 创建一个 YAML 文件,其中包含用于执行以下操作的命令:

    • 读取数据集
    • 将其转码为支持的格式
    • 将其上传到 Cloud Storage

    输入数据集必须是记录长度固定或可变的 QSAM 文件。 您可以使用以下示例 YAML 文件来读取数据集、将其转码为 ORC 格式,然后将其上传到 Cloud Storage。

    在以下示例中,我们使用 Cloud Storage DataPath 来表示 INFILEOUTFILECOPYBOOKTRANSCODE_CONFIGURATION

    environmentVariables:
    - name: "INFILE"
      value: "INFILE"
    - name: "OUTFILE"
      value: "OUTFILE"
    - name: "COPYBOOK"
      value: "COPYBOOK"
    - name: "TRANSCODE_CONFIGURATION"
      value: "TRANSCODE_CONFIGURATION"
    - name: "LOG_PROJECT"
      value: "LOG_PROJECT"
    - name: "IBM_JAVA_OPTIONS"
      value: "-XX:+UseContainerSupport"
    
    command:
      qsam decode $INFILE $OUTFILE
      --copybook $COPYBOOK
      --transcode-configuration ${TRANSCODE_CONFIGURATION}
      --output-format orc
      --parallelism 8
      --chunk-size "512Mib"
    

    替换以下内容:

    • INFILE:输入文件的名称。
    • OUTFILE:输出文件的名称。
    • COPYBOOK_PATH:copybook DD 的路径。
    • TRANSCODE_CONFIGURATION_PATH:转码配置文件的路径。
    • LOG_PROJECT:日志项目的名称。

    以下是一个 YAML 文件示例:

    environmentVariables:
    - name: "INFILE"
      value: "gs://my_bucket/my/input.dat"
    - name: "OUTFILE"
      value: "gs://my_bucket/my/output.orc"
    - name: "COPYBOOK"
      value: "gs://my_bucket/my/copybook.cpy"
    - name: "TRANSCODE_CONFIGURATION"
      value: "gs://my_bucket/my/transcode-configuration-file.json"
    - name: "LOG_PROJECT"
      value: "the log project"
    - name: "IBM_JAVA_OPTIONS"
      value: "-XX:+UseContainerSupport"
    command:
      qsam decode $INFILE $OUTFILE
      --copybook $COPYBOOK
      --transcode-configuration ${TRANSCODE_CONFIGURATION}
      --output-format orc
      --parallelism 8
      --chunk-size "512Mib"
    
  2. 使用以下命令创建 job.yaml 文件。

    kind: Job
    metadata:
      name: JOB
    spec:
      template:
        spec:
          template:
            spec:
              containers:
              - image: IMAGE
                command:
                - bash
                - /opt/mainframe-connector/standalone.sh
                - --argsFrom
                - LOCATION_OF_THE_COMMAND_YAML_FILE
    

    替换以下内容:

    • JOB:Cloud Run 作业的名称。 作业名称不得超过 49 个字符,并且在每个区域和项目中必须是唯一的。
    • IMAGE:作业容器映像的网址,例如 us-docker.pkg.dev/cloudrun/container/job:latest
    • LOCATION_OF_THE_COMMAND_YAML_FILE:您在上一步中创建的 YAML 文件的位置。
  3. 使用以下命令部署新作业:

    gcloud run jobs replace job.yaml
    
  4. 使用以下命令运行作业:

    gcloud run jobs execute JOB_NAME

    JOB_NAME 替换为作业的名称。

如需详细了解如何创建和执行 Cloud Run 作业,请参阅创建新作业执行作业

使用 gsutil cp 命令以独立模式运行 Mainframe Connector

如需使用 gsutil cp 命令以独立模式使用 Mainframe Connector 对数据进行转码,请执行以下步骤:

  1. 创建一个 YAML 文件,其中包含用于执行以下操作的命令:

    • 读取数据集
    • 将其转码为 ORC
    • 将其上传到 Cloud Storage

    输入数据集必须是记录长度固定或可变的 QSAM 文件。 您可以使用以下示例 YAML 文件来读取数据集、将其转码为 ORC 格式,然后将其上传到 Cloud Storage。

    在以下示例中,从 INFILE 数据集读取数据,并从 COPYBOOK DD 读取记录布局。

    environmentVariables:
    - name: "INFILE"
      value: "INFILE"
    - name: "INFILE_DSN"
      value: "INFILE_DSN"
    - name: "GCSDSNURI"
      value: "INFILE_DSN_FILEPATH"
    - name: "COPYBOOK"
      value: "COPYBOOK_FILEPATH"
    - name: "LOG_PROJECT"
      value: "LOG_PROJECT"
    - name: "IBM_JAVA_OPTIONS"
      value: "-XX:+UseContainerSupport"
    command:
      gsutil cp gs://outputbucket/output
      --parallelism 8
      --maxChunkSize "512Mib"
      --parser_type=copybook
    

    替换以下内容:

    • INFILE:输入文件的名称。
    • INFILE_DSN:输入数据源名称 (DSN) 文件的名称。
    • INFILE_DSN_FILEPATH:输入 DSN 文件的路径。
    • COPYBOOK_FILEPATH:copybook DD 的路径。
    • LOG_PROJECT:日志项目的名称。

    以下是一个 YAML 文件示例:

      environmentVariables:
      - name: "INFILE"
        value: "input.dat"
      - name: "INFILE_DSN"
        value: "input.dat"
      - name: "GCSDSNURI"
        value: "gs://inputbucket/inputfolder"
      - name: "COPYBOOK"
        value: "gs://inputbucket/copybook.cpy"
      - name: "LOG_PROJECT"
        value: "the log project"
      - name: "IBM_JAVA_OPTIONS"
        value: "-XX:+UseContainerSupport"
      command:
        gsutil cp gs://outputbucket/output
        --parallelism 8
        --maxChunkSize "512Mib"
        --parser_type=copybook
    

    如需查看 Mainframe Connector 支持的环境变量的完整列表,请参阅环境变量

    如果您想记录此过程中执行的命令,可以启用加载统计信息

  2. 使用以下命令创建 job.yaml 文件。

    kind: Job
    metadata:
      name: JOB
    spec:
      template:
        spec:
          template:
            spec:
              containers:
              - image: IMAGE
                command:
                - bash
                - /opt/mainframe-connector/standalone.sh
                - --argsFrom
                - LOCATION_OF_THE_COMMAND_YAML_FILE
    

    替换以下内容:

    • JOB:Cloud Run 作业的名称。 作业名称不得超过 49 个字符,并且在每个区域和项目中必须是唯一的。
    • IMAGE:作业容器映像的网址,例如 us-docker.pkg.dev/cloudrun/container/job:latest
    • LOCATION_OF_THE_COMMAND_YAML_FILE:您在上一步中创建的 YAML 文件的位置。
  3. 使用以下命令部署新作业:

    gcloud run jobs replace job.yaml
    
  4. 使用以下命令运行作业:

    gcloud run jobs execute JOB_NAME

    JOB_NAME 替换为作业的名称。

如需详细了解如何创建和执行 Cloud Run 作业,请参阅创建新作业执行作业

将 BigQuery 表导出到大型机数据集

您可以创建一个 YAML 文件,该文件从 QUERY DD 文件执行 SQL 读取,并将生成的数据集导出到 Cloud Storage 作为二进制文件,从而将 BigQuery 表导出到大型机数据集,如下所示。

创建和执行 Cloud Run 作业的步骤与在 Cloud Run 上以独立模式使用 Mainframe Connector 转码数据部分中介绍的步骤相同。唯一的区别在于 YAML 文件中提到的指令。Mainframe Connector 提供两种导出 BigQuery 表的方式:

  • 使用 qsam 命令(版本 5.16.0 及更高版本)
  • 使用 bq export 命令

使用 qsam 命令

environmentVariables:
  - name: "QUERY"
    value: "QUERY_PATH"
  - name: "OUTFILE"
    value: "OUTFILE"
  - name: "COPYBOOK"
    value: "COPYBOOK_PATH"
  - name: "TRANSCODE_CONFIGURATION"
    value: "TRANSCODE_CONFIGURATION_PATH"
  - name: "PROJECT_ID"
    value: "PROJECT_ID"
  - name: "LOCATION"
    value: "LOCATION"
  - name: "LOG_PROJECT"
    value: "LOG_PROJECT"
  - name: "IBM_JAVA_OPTIONS"
    value: "-XX:+UseContainerSupport"
command:
qsam encode \
  $QUERY
  $OUTFILE
  --copybook ${COPYBOOK_PATH}
  --transcode-configuration ${TRANSCODE_CONFIGURATION_PATH}
  --input-format=BIGQUERY \
  --input-parameter project_id=${PROJECT_ID} \
  --input-parameter location=${LOCATION}

替换以下内容:

  • QUERY_PATH:要执行的 SQL 查询。查询结果将编码为二进制文件。
  • OUTFILE:将包含输出二进制文件的 Cloud Storage 存储桶。
  • COPYBOOK_PATH:copybook DD 的路径。
  • TRANSCODE_CONFIGURATION_PATH:转码器配置文件的路径。
  • LOG_PROJECT:日志项目的名称。
  • PROJECT_ID:您要在其中执行查询的项目 ID。
  • LOCATION:将执行查询的单区域或多区域。我们建议您在靠近数据的位置运行查询。默认值为“美国”。

以下是一个 YAML 文件示例:

environmentVariables:
- name: "QUERY"
  value: "gs://my_bucket/my/input.sql"
- name: "OUTFILE"
  value: "gs://my_bucket/my/output.orc"
- name: "COPYBOOK"
  value: "gs://my_bucket/my/copybook.cpy"
- name: "TRANSCODE_CONFIGURATION"
  value: "gs://my_bucket/my/transcode-configuration-file.json"
- name: "PROJECT_ID"
  value: "my-project"
- name: "LOCATION"
  value: "US"
- name: "LOG_PROJECT"
  value: "my-log-project"
- name: "IBM_JAVA_OPTIONS"
  value: "-XX:+UseContainerSupport"
  command:
  qsam encode \
    $QUERY
    $OUTFILE
    --copybook ${COPYBOOK_PATH}
    --transcode-configuration ${TRANSCODE_CONFIGURATION_PATH}
    --input-format=BIGQUERY \
    --input-parameter project_id=${PROJECT_ID} \
    --input-parameter location=${LOCATION}

使用 bq export 命令

environmentVariables:
- name: "COPYBOOK"
  value: "COPYBOOK_FILEPATH"
- name: "LOG_PROJECT"
  value: "LOG_PROJECT"
- name: "IBM_JAVA_OPTIONS"
  value: "-XX:+UseContainerSupport"
command:
  bq export --project_id="PROJECT_NAME" --location="LOCATION" --sql="select * from project.dataset.table" --bucket="BUCKET"

替换以下内容:

  • COPYBOOK_FILEPATH:copybook DD 的路径。
  • LOG_PROJECT:日志项目的名称。
  • PROJECT_NAME:您要在其中执行查询的项目的名称。
  • LOCATION:执行查询的位置。我们建议您在靠近数据的位置执行查询。
  • BUCKET:将包含输出二进制文件的 Cloud Storage URI。

以下是一个 YAML 文件示例:

environmentVariables:
- name: "COPYBOOK"
  value: "gs://inputbucket/copybook.cpy"
- name: "LOG_PROJECT"
  value: "my-log-project"
- name: "IBM_JAVA_OPTIONS"
  value: "-XX:+UseContainerSupport"
command:
  bq export --project_id="my-project" --run_mode="gcsoutput" --location=US --sql="select * from project.dataset.table" --bucket="gs://outputbucket/data.dat"