将在大型主机上本地转码的数据移至 Google Cloud

本页介绍如何在大型机上本地将大型机数据转码为 受支持的格式, 然后将内容移至 BigQuery。转码是将信息从一种编码表示形式转换为另一种编码表示形式的过程。本页介绍如何使用 Mainframe Connector 将大型机数据转码为优化的行式列式 (ORC),然后将数据保存到 Cloud Storage。

Mainframe Connector 提供了三种在大型机上本地转码大型机数据的方式。

qsamvsam 命令的优势

qsamvsam 命令具有以下优势:

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

准备工作

将 Mainframe Connector 安装 到要用作过程库 (PROCLIB) 的任何大型机分区数据集。

将本地转码的大型机数据移至 Google Cloud

如需在大型机上本地转码数据,然后将其移至 BigQuery,您必须执行以下任务:

  1. 读取和转码大型机上的数据集,并以 ORC 格式将其上传到 Cloud Storage (对于仅受 qsamvsam 命令支持的其他格式,请参阅 TranscodeFormat)。转码在 qsam decodevsam decodegsutil cp 操作期间完成(具体取决于您选择的命令),其中大型机扩展二进制编码的十进制交换码 (EBCDIC) 数据集在复制到 Cloud Storage 存储桶期间转换为 UTF-8 中的 ORC 格式。
  2. 将数据集加载到 BigQuery 表中。
  3. (可选)对 BigQuery 表执行 SQL 查询。
  4. (可选)将数据从 BigQuery 导出回大型机。

以下部分详细介绍了如何使用 qsamvsam 命令gsutil cp 命令将本地转码的大型机数据移至 Google Cloud 。

使用 qsamvsam 命令在本地转码

如需使用 qsamvsam 命令在大型机上本地转码大型机数据,请按以下步骤操作:

  1. 创建一个作业,以读取大型机上的数据集并将其转码为 ORC 格式,如以下命令所示。从 INFILE 数据集中读取数据,并从 COPYBOOK DD中读取记录布局。

    您可以使用 --transcode-configuration 实参提供 转码器配置文件 ,以修改 Mainframe Connector 转码过程的默认行为。

    • 如果您的输入数据集是具有固定或可变记录长度的队列顺序访问方法 (QSAM) 文件,请使用以下命令:

      //STEP01 EXEC BQSH
      //INFILE DD DSN=<HLQ>.DATA.FILENAME,DISP=SHR
      //COPYBOOK DD DISP=SHR,DSN=<HLQ>.COPYBOOK.CPY
      //CONFIG DD DISP=SHR,DSN=<HLQ>.CONFIG.SETTINGS
      //STDIN DD *
      BUCKET=BUCKET_NAME
      qsam decode --copybook dd:COPYBOOK --transcode-configuration dd:CONFIG dd:INFILE gs://$BUCKET/tablename
      /*
      
    • 如果您的输入数据集是具有固定或可变记录长度的虚拟存储访问方法 (VSAM) 文件,请使用以下命令:

      //STEP01 EXEC BQSH
      //INFILE DD DSN=<HLQ>.DATA.FILENAME,DISP=SHR
      //COPYBOOK DD DISP=SHR,DSN=<HLQ>.COPYBOOK.CPY
      //CONFIG DD DISP=SHR,DSN=<HLQ>.CONFIG.SETTINGS
      //STDIN DD *
      BUCKET=BUCKET_NAME
      vsam decode --copybook dd:COPYBOOK --transcode-configuration dd:CONFIG dd:INFILE gs://$BUCKET/tablename
      /*
      

    BUCKET_NAME 替换为要将大型机数据复制到的 Cloud Storage 存储桶的名称。

    为避免在每个作业控制语言 (JCL) 过程中指定项目 ID 和存储桶名称等变量,您可以将它们添加到 BQSH PROCLIB 中,并在多个 JCL 过程中将其作为环境变量引用。 此方法还有助于在生产环境和非生产环境之间实现无缝过渡,因为特定于环境的变量是在环境的 BQSH PROCLIB 中设置的。

    在此示例中,DD DataPath 用于指定 copybook、输入和转码配置的路径。如需了解其他选项,请参阅 DataPath

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

  2. 创建并提交一个 BigQuery 加载作业,该作业将 ORC 文件分区从 tablename.orc 加载到 MY_DATASET.MY_TABLE 中,如下所示。

    Example JCL
    //STEP02 EXEC BQSH
    //STDIN DD *
    BUCKET=BUCKET_NAME
    PROJECT=PROJECT_NAME
    bq load --project_id=$PROJECT \
      myproject:MY_DATASET.MY_TABLE \
      gs://$BUCKET/tablename.orc/*
    /*
    

    替换以下内容:

    • BUCKET_NAME:包含要加载到 BigQuery 的 ORC 文件的 Cloud Storage 存储桶的名称。
    • PROJECT_NAME:要在其中执行查询的项目的名称。
  3. (可选)创建并提交一个 BigQuery 查询作业,该作业从 QUERY DD 文件执行 SQL 读取。通常,查询将是 MERGESELECT INTO DML 语句,这将导致 BigQuery 表的转换。 请注意,Mainframe Connector 会记录作业指标,但不会将查询结果写入文件。

    您可以通过多种方式查询 BigQuery:内联、使用 DD 的单独数据集或使用 DSN 的单独数据集。

    Example JCL
    //STEP03 EXEC BQSH
    //QUERY DD DSN=<HLQ>.QUERY.FILENAME,DISP=SHR
    //STDIN DD *
    PROJECT=PROJECT_NAME
    LOCATION=LOCATION
    bq query --project_id=$PROJECT \
    --location=$LOCATION/*
    /*
    

    替换以下内容:

    • PROJECT_NAME:要在其中执行查询的项目的名称。
    • LOCATION:执行查询的位置。我们建议您在靠近数据的位置执行查询。
  4. (可选)创建并提交一个导出作业,该作业从 QUERY DD 文件执行 SQL 读取,并将生成的数据集作为二进制文件导出到大型机。

    您可以使用 --transcode-configuration 实参提供 转码器配置文件,以修改 Mainframe Connector 转码过程的默认行为。

    //STEP04 EXEC BQSH
    //OUTFILE DD DSN=<HLQ>.DATA.FILENAME,DISP=SHR
    //COPYBOOK DD DISP=SHR,DSN=<HLQ>.COPYBOOK.CPY
    //CONFIG DD DISP=SHR,DSN=<HLQ>.CONFIG.SETTINGS
    //QUERY DD DSN=<HLQ>.QUERY.FILENAME,DISP=SHR
    //STDIN DD *
    
    PROJECT=PROJECT_NAME
    qsam encode \
      dd:QUERY
      dd:OUTFILE
      --copybook dd:COPYBOOK
      --transcode-configuration dd:CONFIG
      --input-format=BIGQUERY \
      --input-parameter project_id=PROJECT_NAME \
      --input-parameter location=LOCATION/*
    /*
    

    替换以下内容:

    • PROJECT_NAME:要在其中执行查询的项目的名称。
    • LOCATION:执行查询的位置。我们建议您在靠近数据的位置执行查询。

    数据将导出到 OUTFILE DD 数据集。记录布局由 COPYBOOK DD 描述。如需了解 copybook、outfile 和 转码配置路径的其他选项,请参阅 DataPath

使用 gsutil cp 命令在本地转码

如需使用 gsutil cp 命令在大型机上本地转码大型机数据,请按以下步骤操作:

  1. 创建一个作业,以读取大型机上的数据集并将其转码为 ORC 格式,如以下命令所示。从 INFILE 数据集中读取数据,并从 COPYBOOK DD中读取记录布局。

    输入数据集必须是具有固定或可变记录长度的队列顺序访问方法 (QSAM) 文件。

    //STEP01 EXEC BQSH
    //INFILE DD DSN=<HLQ>.DATA.FILENAME,DISP=SHR
    //COPYBOOK DD DISP=SHR,DSN=<HLQ>.COPYBOOK.FILENAME
    //STDIN DD *
    BUCKET=BUCKET_NAME
    gsutil cp --replace gs://$BUCKET/tablename.orc
    /*
    

    BUCKET_NAME 替换为要将大型机数据复制到的 Cloud Storage 存储桶的名称。

    为避免在每个 JCL 过程中指定项目 ID 和存储桶名称等变量,您可以将它们添加到 BQSH PROCLIB 中,并在多个 JCL 过程中将其作为环境变量引用。此方法还有助于在生产环境和非生产环境之间实现无缝过渡,因为特定于环境的变量是在环境的 BQSH PROCLIB 中设置的。如需查看 Mainframe Connector 支持的环境变量的完整列表,请参阅 环境变量

    在此示例中,标准输入 (STDIN) 作为流内数据提供给 STDIN DD。或者,您可以使用数据源名称 (DSN) 提供此输入,这样可以更轻松地管理符号替换。

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

  2. 创建并提交一个 BigQuery 加载作业,该作业将 ORC 文件分区从 tablename.orc 加载到 MY_DATASET.MY_TABLE 中,如下所示。

    Example JCL
    //STEP02 EXEC BQSH
    //STDIN DD *
    BUCKET=BUCKET_NAME
    PROJECT=PROJECT_NAME
    bq load --project_id=$PROJECT \
      myproject:MY_DATASET.MY_TABLE \
      gs://$BUCKET/tablename.orc/*
    /*
    

    替换以下内容:

    • BUCKET_NAME:包含要加载到 BigQuery 的 ORC 文件的 Cloud Storage 存储桶的名称。
    • PROJECT_NAME:要在其中执行查询的项目的名称。
  3. (可选)创建并提交一个 BigQuery 查询作业,该作业从 QUERY DD 文件执行 SQL 读取。通常,查询将是 MERGESELECT INTO DML 语句,这将导致 BigQuery 表的转换。 请注意,Mainframe Connector 会记录作业指标,但不会将查询结果写入文件。

    您可以通过多种方式查询 BigQuery:内联、使用 DD 的单独数据集或使用 DSN 的单独数据集。

    Example JCL
    //STEP03 EXEC BQSH
    //QUERY DD DSN=<HLQ>.QUERY.FILENAME,DISP=SHR
    //STDIN DD *
    PROJECT=PROJECT_NAME
    LOCATION=LOCATION
    bq query --project_id=$PROJECT \
    --location=$LOCATION/*
    /*
    

    替换以下内容:

    • PROJECT_NAME:要在其中执行查询的项目的名称。
    • LOCATION:执行查询的位置。我们建议您在靠近数据的位置执行查询。
  4. (可选)创建并提交一个导出作业,该作业从 QUERY DD 文件执行 SQL 读取,并将生成的数据集作为二进制文件导出到大型机。

    Example JCL
    //STEP04 EXEC BQSH
    //OUTFILE DD DSN=<HLQ>.DATA.FILENAME,DISP=SHR
    //COPYBOOK DD DISP=SHR,DSN=<HLQ>.COPYBOOK.FILENAME
    //QUERY DD DSN=<HLQ>.QUERY.FILENAME,DISP=SHR
    //STDIN DD *
    PROJECT=PROJECT_NAME
    DATASET_ID=DATASET_ID
    DESTINATION_TABLE=DESTINATION_TABLE
    bq export --project_id=$PROJECT \
      --dataset_id=$DATASET_ID \
      --destination_table=$DESTINATION_TABLE \
      --location="US" \
      --remoteHost <mainframe-connector-url>.a.run.app \
      --remotePort 443
    /*
    

    替换以下内容:

    • PROJECT_NAME:要在其中执行查询的项目的名称。
    • DATASET_ID:包含要导出的表的 BigQuery 数据集 ID。
    • DESTINATION_TABLE:要导出的 BigQuery 表。

    数据将导出到 OUTFILE DD 数据集。记录布局由 COPYBOOK DD 描述。