仮想テープ ライブラリを使用して、Google Cloud に移動したメインフレーム データをコード変換する

メインフレーム上でローカルにデータのコード変換を行うのは CPU 使用率の高いプロセスであり、100 万命令/秒(MIPS)の高い消費につながります。これを回避するには、Cloud Run を使用して、メインフレーム データを Google Cloud 上でリモートで移動してコード変換します。これにより、メインフレームがビジネス クリティカルなタスクに解放され、MIPS の消費量も削減されます。

非常に大量のデータ(1 日あたり約 500 GB 以上)をメインフレームから Google Cloud に移動し、この作業にメインフレームを使用したくない場合は、クラウド対応の Virtual Tape Library(VTL)ソリューションを使用して、データを Cloud Storage バケットに転送できます。その後、Cloud Run を使用してバケット内のデータをコード変換し、BigQuery に移動できます。

このページでは、Cloud Storage バケットにコピーされたメインフレーム データを読み取り、拡張バイナリ コーディング 10 進交換コード(EBCDIC)データセットから UTF-8 の ORC 形式にコード変換し、そのデータセットを BigQuery テーブルに読み込む方法について説明します。

次の図は、VTL ソリューションを使用してメインフレーム データを Cloud Storage バケットに移動し、Cloud Run を使用してデータを ORC 形式にコード変換してから、コンテンツを BigQuery に移動する方法を示しています。

VTL を使用してメインフレーム データをリモートでコード変換する
VTL を使用してメインフレーム データをリモートでコード変換する

始める前に

  • 要件に適した VTL ソリューションを選択し、メインフレームのデータを Cloud Storage バケットに移動して、.dat として保存します。アップロードした .dat ファイルに x-goog-meta-lrecl という名前のメタデータキーを追加していること、およびメタデータの鍵長が元のファイルのレコードの長さ(例: 80)と等しいことを確認してください。
  • メインフレームで、GCSDSNURI 環境変数を、Cloud Storage バケットのメインフレーム データに使用した接頭辞に設定します。
    export GCSDSNURI="gs://BUCKET/PREFIX"
    
    次のように置き換えます。
    • BUCKET: Cloud Storage バケットの名前。
    • PREFIX: バケットで使用する接頭辞。
  • サービス アカウントを作成するか、Mainframe Connector で使用する既存のサービス アカウントを指定します。このサービス アカウントには、Cloud Storage バケット、BigQuery データセットなど、使用するその他の Google Cloud リソースにアクセスするための権限が必要です。
  • 作成したサービス アカウントに Cloud Run 起動元ロールが割り当てられていることを確認します。

Cloud Storage バケットにアップロードされたメインフレーム データをコード変換する

VTL を使用してメインフレーム データを Google Cloud に移動し、リモートでコード変換するには、次の作業を行う必要があります。

  1. Terraform を使用して、Mainframe Connector のリモート サービスをデプロイします。Mainframe Connector のリモート サービスは、リモート コード変換を行う Cloud Run をベースとしています。Mainframe Connector リモート サービスの複数のインスタンスをデプロイする場合は、Mainframe Connector の複数のインスタンスをデプロイするをご覧ください。
  2. Cloud Storage バケットに存在するデータを読み取り、ORC 形式にコード変換します。コード変換オペレーションにより、メインフレームの EBCDIC データセットが UTF-8 の ORC 形式に変換されます。
  3. データセットを BigQuery テーブルに読み込みます。
  4. (省略可)BigQuery テーブルに対して SQL クエリを実行します。
  5. (省略可)BigQuery から Cloud Storage のバイナリ ファイルにデータをエクスポートします。

これらのタスクを実行する手順は次のとおりです。

  1. Mainframe Connector のデプロイ用の tar ファイルをダウンロードします。

  2. デプロイ用の tar ファイル内のファイルを抽出します。

    tar -xvf ./deployment.tar
    

    main.tf ファイルと vars.tf ファイルがデプロイ用の tar ファイルから抽出されます。

  3. vars.tf ファイルの変数を確認し、編集します。ほとんどの変数にはすでにデフォルト値があります。ただし、次の値を設定する必要があります。設定する必要がある必須変数は projectconnector_service_account_email だけです。

    • project: Mainframe Connector をインストールする Google Cloud プロジェクト。
    • connector_service_account_email: Mainframe Connector を使用して実行するオペレーションのすべての権限を持つサービス アカウント。

    connector_service_ingress 変数と connector_service_vpc_access 変数を使用してネットワーク構成を設定することもできます。

  4. Cloud Storage のバケット接頭辞を引数として指定して terraform init コマンドを実行します。Cloud Storage バケットと接頭辞を使用すると、デプロイ状態をバケットに保存するのに役立ちます。Mainframe Connector をアップグレードするときに、同じバケットと接頭辞を再利用することもできます。

    terraform init \
    -backend-config bucket=DEPLOYMENT_STATE_BUCKET \
    -backend-config prefix=BUCKET_PREFIX
    

    以下を置き換えます。

    • DEPLOYMENT_STATE_BUCKET: Cloud Storage バケットの名前。
    • BUCKET_PREFIX: Cloud Storage バケットで使用する接頭辞。
  5. .tfvars ファイルを作成して、Mainframe Connector のデプロイ時に Terraform が使用する変数を定義します。

  6. .tfvars ファイルを開き、次の変数を Key-Value ペアとして定義します。

    • instance_id: Mainframe Connector の複数のインスタンスがある場合や、異なるサービス アカウントを使用する場合は、異なるワークロードを分離するために instance_id を定義します。
    • project: Mainframe Connector をデプロイするプロジェクト。
    • connector_service_ingress: Ingress タイプ。
    • additional_labels: デプロイをテストする場合の追加ラベル。
    • connector_service_account_email: Mainframe Connector のサービス アカウント メール ID。

    変更を保存し、ファイルを閉じます。

  7. Mainframe Connector をデプロイします。

    terraform apply -var-file=VARIABLE_FILE_NAME
    

    VARIABLE_FILE_NAME を前の手順で作成した変数ファイルに置き換えます。

  8. (省略可)Mainframe Connector がデプロイされ実行されているかどうかを確認するには、[Cloud Run] ページに移動して [サービス] タブを選択します。デプロイが表に一覧表示されます。

    Cloud Run に移動します

  9. メインフレームで、Cloud Storage バケットの .dat ファイルからデータを読み取り、次のように ORC 形式にコード変換するジョブを作成します。

    Mainframe Connector でサポートされている環境変数の一覧については、環境変数をご覧ください。

    //STEP01 EXEC BQSH
    //COPYBOOK DD DISP=SHR,DSN=<HLQ>.COPYBOOK.FILENAME
    //STDIN DD *
    gsutil cp --replace gs://mybucket/tablename.orc \
    --inDsn INPUT_FILENAME \
    --remoteHost <mainframe-connector-url>.a.run.app \
    --remotePort 443 \
    --project_id PROJECT_NAME
    /*
    

    以下を置き換えます。

    • PROJECT_NAME: クエリを実行するプロジェクトの名前。
    • INPUT_FILENAME: Cloud Storage バケットにアップロードした .dat ファイルの名前。

    このプロセスで実行されたコマンドをログに記録するには、負荷統計情報を有効にすることができます。

  10. (省略可)QUERY DD ファイルから SQL 読み取りを実行する BigQuery クエリジョブを作成して送信します。 通常、クエリは MERGE または SELECT 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: クエリが実行されるロケーション。データに近いロケーションでクエリを実行することをおすすめします。
  11. (省略可)QUERY DD ファイルから SQL 読み取りを実行し、結果のデータセットをバイナリ ファイルとして Cloud Storage にエクスポートするエクスポート ジョブを作成して送信します。

    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
    BUCKET=BUCKET
    bq export --project_id=$PROJECT \
      --dataset_id=$DATASET_ID \
      --destination_table=$DESTINATION_TABLE \
      --location="US" \
      --bucket=$BUCKET \
      --remoteHost <mainframe-connector-url>.a.run.app \
      --remotePort 443
    /*
    

    以下を置き換えます。

    • PROJECT_NAME: クエリを実行するプロジェクトの名前。
    • DATASET_ID: エクスポートするテーブルを含む BigQuery データセット ID。
    • DESTINATION_TABLE: エクスポートする BigQuery テーブル。
    • BUCKET: 出力バイナリ ファイルを含む Cloud Storage バケット。