32 データ・ウェアハウス・レプリケーションのステージおよびマージ

データ・ウェアハウス・ターゲットは、通常、超並列処理(MPP)をサポートしています。単一のデータ操作言語(DML)操作のコストは、バッチDMLの実行のコストと同等です。

そのため、スループットが向上するように、Oracle GoldenGate証跡の変更データを一時ステージング場所でマイクロ・バッチにステージングして、ステージングされたデータ・レコードがそれぞれのデータ・ウェアハウスのマージSQL文を使用してデータ・ウェアハウス・ターゲット表にマージされるようにすることができます。この項では、ステージングとマージを使用して、ソース・データベースからターゲット・データ・ウェアハウスに変更データ・レコードをレプリケートする方法について概説します。このソリューションでは、コマンド・イベント・ハンドラを使用してカスタムbashシェル・スクリプトを呼び出します。

この章では、コマンド・イベント・ハンドラ機能で実行できることの例を示します。

32.1 ステージおよびマージのステップ

32.1.1 ステージ

このステップでは、Oracle GoldenGate証跡ファイルの変更データ・レコードがステージングの場所にプッシュされます。ステージングの場所は、通常、OCI、AWS S3、Azure Data Lake、Google Cloud Storageなどのクラウド・オブジェクト・ストアになります。

これは、ファイル・ライター・ハンドラとOracle GoldenGate for Big Dataオブジェクト・ストアのいずれかのイベント・ハンドラを使用して実行できます。

32.1.2 マージ

このステップでは、オブジェクト・ストア内の変更データ・ファイルが、データ・ウェアハウスで定義された外部表として表示されます。外部ステージング表のデータは、ターゲット表にマージされます。

マージSQLでは、ステージング表として外部表が使用されます。マージとは、スループットの向上につながるバッチ操作のことです。

32.1.3 ハンドラの構成

ファイル・ライター(FW)ハンドラは、GoldenGate証跡ファイルからの変更データが格納されるローカル・ステージング・ファイルを生成するように構成する必要があります。

FWハンドラは、ステージング・ファイルをステージングの場所にアップロードできるオブジェクト・ストアのイベント・ハンドラに連鎖されている必要があります。

ステージングの場所は、通常、クラウド・オブジェクト・ストア(AWS S3やAzure Data Lakeなど)になります。

オブジェクト・ストア・イベント・ハンドラの出力は、カスタム・スクリプトを起動してターゲット・データ・ウェアハウスでマージSQL文を実行できるコマンド・イベント・ハンドラに連鎖されます。

32.1.4 ファイル・ライター・ハンドラ

ファイル・ライター(FW)ハンドラは、通常、構成gg.handler.{name}.partitionByTable=trueを使用することで表によってパーティション化されたファイルを生成するように構成します。

ほとんどの場合、FWハンドラはAvro Object Container Format (OCF)フォーマッタを使用するように構成します。

出力ファイル形式は、特定のデータ・ウェアハウス・ターゲットに基づいて変更することがあります。

32.1.5 操作集計

集計操作は、同じ行に対する複数の操作をしきい値に基づいて単一の出力操作に集計(マージ/圧縮)するプロセスです。

操作集計は、構成gg.aggregate.operations=trueを使用して、ステージおよびマージ・レプリケーションに使用できるようにする必要があります。

32.1.6 オブジェクト・ストア・イベント・ハンドラ

ファイル・ライター・ハンドラは、オブジェクト・ストア・イベント・ハンドラに連鎖されている必要があります。Oracle GoldenGate for BigDataは、ほとんどのクラウド・オブジェクト・ストア(OCI、AWS S3、Azure Data Lakeなど)へのファイルのアップロードをサポートしています。

32.1.7 JDBCメタデータ・プロバイダ

データ・ウェアハウスでJDBC接続がサポートされている場合は、JDBCメタデータ・プロバイダを有効にする必要があります。

32.1.8コマンド・イベント・ハンドラのマージ・スクリプト

コマンド・イベント・ハンドラは、bashシェル・スクリプトを起動するように構成します。Oracleは、ステージング・ファイルの変更データがターゲット表にマージされるようにするSQL文を実行できるbashシェル・スクリプトを提供しています。

このシェル・スクリプトは、Replicatプロセスの開始前に、必要な構成に従ってカスタマイズしておく必要があります。

32.1.9 ステージおよびマージのサンプル構成

各データ・ウェアハウスに対して動作する構成は、ディレクトリAdapterExamples/big-data/data-warehouse-utils/<target>/の下にあります。

このディレクトリの内容は次のとおりです。
  • Replicatパラメータ(.prm)ファイル。
  • FWハンドラとすべてのイベント・ハンドラ構成を格納するReplicatプロパティ・ファイル。
  • マージ・スクリプトで使用されるサンプル表に応じたDDLファイル。
  • 特定のデータ・ウェアハウス用のマージ・スクリプト。このスクリプトには、DDLファイルで定義されているサンプル表を使用してテストしたSQL文が含まれています。

32.1.10 マージ・スクリプトの変数

通常、変数はOracle提供のスクリプトの冒頭に示されています。先頭が#TODO:の行には、スクリプト内の変数に必要な変更についての説明文があります。

:
#TODO: Edit this. Provide the replicat group name.
repName=RBD

#TODO: Edit this. Ensure each replicat uses a unique prefix.
stagingTablePrefix=${repName}_STAGE_

#TODO: Edit the AWS S3 bucket name.
bucket=<AWS S3 bucket name>

#TODO: Edit this variable as needed.
s3Location="'s3://${bucket}/${dir}/'"

#TODO: Edit AWS credentials awsKeyId and awsSecretKey
awsKeyId=<AWS Access Key Id>
awsSecretKey=<AWS Secret key>

変数のrepNamestagingTablePrefixは、すべてのデータ・ウェアハウス・ターゲットに関連します。

32.1.11 マージ・スクリプトのSQL文

シェル・スクリプトのSQL文にはカスタマイズが必要です。先頭が#TODO:の行には、SQL文に必要な変更についての説明文があります。

ほとんどの場合、SQL文の識別子は二重引用符"で囲む必要があります。二重引用符は、スクリプト内ではバックスラッシュを使用してエスケープする必要があります。たとえば: \"

Oracleは、サンプルDDLファイルで定義されている事前定義済の列セットを含む単一の表に対して動作するSQL文のサンプルを提供しています。このスクリプトでは、if-elseコード・ブロックの一部として、独自の表のための新しいセクションを追加する必要があります。

:
if [ "${tableName}" == "DBO.TCUSTORD" ]
then
  #TODO: Edit all the column names of the staging and target tables.
  # The merge SQL example here is configured for the example table defined in the DDL file.
  # Oracle provided SQL statements

# TODO: Add similar SQL queries for each table.
elif [ "${tableName}" == "DBO.ANOTHER_TABLE" ]
then
  
#Edit SQLs for this table.
fi

32.1.12 マージ・スクリプトの関数

このスクリプトは、次のシェル関数が含まれるようにコーディングされています。

  • main
  • validateParams
  • process
  • processTruncate
  • processDML
  • dropExternalTable
  • createExternalTable
  • merge

スクリプトには、それぞれの関数の目的を推測できるようにするコード・コメントがあります。

マージ・スクリプトのmain関数

関数mainは、スクリプトのエントリ・ポイントです。ステージングされた変更済データ・ファイルの処理は、ここから始まります。

この関数は、validateParamsおよびprocessという2つの関数を呼び出します。

このスクリプトへの入力パラメータは、関数validateParamsで検証されます。

検証が成功すると、process関数で処理が再開されます。

マージ・スクリプトのprocess関数

この関数は、ステージング済変更データ・ファイル内の操作レコードを処理して、processTruncateまたはprocessDMLを必要に応じて起動します。

切捨て操作レコードは、関数processTruncateで処理されます。InsertUpdateおよびDelete操作のレコードは、関数processDMLで処理されます。

マージ・スクリプトのmerge関数

関数processDMLによって起動される関数mergeには、各表に対して実行されるマージSQL文が含まれています。

マージSQLのON句で使用するキー列は、カスタマイズする必要があります。

null値が含まれるキー列を処理するために、ON句ではデータ・ウェアハウス固有のNVL関数を使用します。次に、単一キー列"C01Key"の例を示します。
ON ((NVL(CAST(TARGET.\"C01Key\" AS VARCHAR(4000)),'${uuid}')=NVL(CAST(STAGE.\"C01Key\" AS VARCHAR(4000)),'${uuid}')))`

merge文のupdate句およびinsert句の列名も、すべての表ごとにカスタマイズする必要があります。

マージ・スクリプトのcreateExternalTable関数

関数processDMLによって呼び出されるcreateExternalTable関数は、それぞれのオブジェクト・ストア・ファイル内のファイルに裏付けられた外部表を作成します。

この関数では、すべてのターゲット表の列が含まれるように、すべてのターゲット表ごとに外部表のDDL SQL文をカスタマイズする必要があります。

外部表の定義は、ターゲット表の列に加えて、3つのメタ列optypepositionおよびfieldmaskで構成されます。

メタ列のデータ型は変更しないでください。メタ列の位置をDDL文で変更しないでください。

32.1.13 前提条件

  • コマンド・ハンドラのマージ・スクリプトは、Oracle GoldenGate for BigDataリリース19.1.0.0.8以降で使用できます。
  • GoldenGate for Big Dataがインストールされているマシンには、SQL問合せを実行するための各データ・ウェアハウスのコマンドライン・プログラムをインストールする必要があります。

32.1.14 制限事項

主キーの更新操作は、削除と挿入のペアに分割されます。Oracle GoldenGate証跡ファイルに、それぞれの表のすべての列の列値が含まれていない場合、欠落している列はターゲット表でnullに更新されます。

32.2 スノーフレークのステージおよびマージ

スノーフレークとは、サーバーレス・データ・ウェアハウスのことです。スノーフレークでは、AWS、GCPまたはAzureのどのクラウド・プロバイダでも計算ノードを実行できます。スノーフレークの外部表は、オブジェクト・ストア・ファイルの読取りに使用できます。

スノーフレークでは、オブジェクト・ストア(AWS S3、Azure Data LakeまたはGoogle Cloud Storageのいずれか)からのデータ・ファイルの読取りが可能です。

このトピックでは、スノーフレーク・コマンド・イベント・ハンドラで実行できることの例を示します。

32.2.1 構成

Oracle GoldenGate BigDataインストールのディレクトリAdapterExamples/big-data/data-warehouse-utils/snowflake/には、ステージおよびマージを使用したスノーフレーク・レプリケーションに必要なすべての構成およびスクリプトが含まれています。

次のファイルがあります。
  • sf.prm: Replicatパラメータ・ファイル。
  • sf.props: AWS S3にデータをステージングし、コマンド・イベント・ハンドラを実行するReplicatプロパティ・ファイル。
  • sf.sh: AWS S3にステージングされたデータを読み取り、データをスノーフレーク・ターゲット表にマージするbashシェル・スクリプト。
  • sf-az.props: Azure Data Lake Gen 2にデータをステージングし、コマンド・イベント・ハンドラを実行するReplicatプロパティ・ファイル。
  • sf-az.sh: Azure Data Lake Gen 2にステージングされたデータを読み取り、データをスノーフレーク・ターゲット表にマージするbashシェル・スクリプト。
  • sf-DDL.sql: スクリプトのsf.shおよびsf-az.shで使用するサンプル・ターゲット表のDDL文。
プロパティ・ファイルのsf.propsおよびsf-az.props内にある#TODO:コメントで示されたプロパティを編集します。

bashシェル・スクリプト関数のcreateExternalTable()およびmerge()には、目的のターゲット表に応じてカスタマイズする必要のあるSQL文が含まれています。

32.3 AWSのスノーフレーク

このトピックでは、AWSのスノーフレークで実行できることの例を示します。

32.3.1 データ・フロー

  • ファイル・ライター(FW)ハンドラは、Avro Object Container Format (OCF)でファイルを生成するように構成されます。
  • Avro OCFファイルは、GoldenGate S3イベント・ハンドラを使用してS3バケットにアップロードされます。
  • コマンド・イベント・ハンドラは、sf.shスクリプトにS3オブジェクト・ストア・ファイルのメタデータを渡します。

32.3.2 マージ・スクリプトの変数

次の変数は必要に応じて変更します。

#TODO: Edit this. Provide the replicat group name.
repName=RBD

#TODO: Edit this. Ensure each replicat uses a unique prefix.
stagingTablePrefix=${repName}_STAGE_

#TODO: Edit the AWS S3 bucket name.
bucket=<AWS S3 bucket name>

#TODO: Edit this variable as needed.
s3Location="'s3://${bucket}/${dir}/'"#TODO: Edit AWS credentials awsKeyId and awsSecretKey
awsKeyId=<AWS Access Key Id>
awsSecretKey=<AWS Secret key>

#TODO: Edit the Snowflake account name, database, username and password in the function executeQuery()
    sfAccount=<account>
    sfRegion=<region>
    sfDatabase=<database>
    sfUser=<user>
    sfPassword=<password>

32.4 Azureのスノーフレーク

このトピックでは、Azureのスノーフレークで実行できることの例を示します。

32.4.1 データ・フロー

  • ファイル・ライター(FW)ハンドラは、Avro Object Container Format (OCF)でファイルを生成するように構成されます。
  • Avro OCFファイルは、HDFSイベント・ハンドラを使用してAzureストレージ・アカウント(Azure Data Lake Gen 2)のコンテナにアップロードされます。

  • コマンド・イベント・ハンドラは、sf-az.shスクリプトにAzure Data Lake Gen 2オブジェクト・ストア・ファイルのメタデータを渡します。

32.4.2 マージ・スクリプトの変数

次の変数は必要に応じて変更します。

#TODO: Edit this. Provide the replicat group name.
repName=RBD

#TODO: Edit this. Ensure each replicat uses a unique prefix.
stagingTablePrefix=${repName}_STAGE_

#TODO: Edit the Azure Storage account.
azureStorageAccount=<Azure Storage account>
#TODO: Edit the Azure Container.
azureContainer=<Azure Container name>

#TODO: Edit Snowflake storage integration to access Azure Data Lake.#TODO: Instructions to create storage integration is documented here: https://docs.snowflake.com/en/user-guide/data-load-azure-config.html#option-1-configuring-a-snowflake-storage-integration
storageIntegration=<Snowflake Storage integration>

#TODO: Edit the Snowflake account name, database, username and password in the function executeQuery()
    sfAccount=<account>
    sfRegion=<region>
    sfDatabase=<database>
    sfUser=<user>
    sfPassword=<password>

32.4.3 前提条件

このマージ・スクリプトは、Oracle GoldenGate for BigData Replicatがインストールされているマシンにsnowsqlコマンドライン・プログラムがインストールされていることを必要とします。

32.5 Google BigQueryのステージおよびマージ

BigQueryは、Google Cloudの完全に管理されたペタバイト規模のコスト効率に優れた分析データ・ウェアハウスであり、大量のデータをほぼリアルタイムで分析できます。

このトピックでは、Google BigQueryで実行できることの例を示します。

32.5.1 データ・フロー

  • ファイル・ライター(FW)ハンドラは、Avro Object Container Format (OCF)でファイルを生成するように構成されます。
  • コマンド・イベント・ハンドラは、スクリプトbq.shにローカルAvro OCFファイルのメタデータを渡します。

32.5.2 構成

Oracle GoldenGate BigDataインストールのディレクトリAdapterExamples/big-data/data-warehouse-utils/bigquery/には、ステージおよびマージを使用したレプリケーションに必要なすべての構成およびスクリプトが含まれています。

次のファイルがあります。
  • bq.prm: Replicatパラメータ・ファイル。
  • bq.props: Avro OCF形式のローカル・ファイルを生成し、コマンド・イベント・ハンドラを実行するReplicatプロパティ・ファイル。
  • bq.sh: Google Cloud Storage (GCS)にファイルをアップロードし、BigQueryのターゲット表にGCSの変更データをマージするbashシェル・スクリプト。
  • bq-ddl.sql: スクリプトbq.shで使用されるサンプル・ターゲット表が含まれているDDL文。

bashシェル・スクリプト関数mergeIntoBQ()には、目的のターゲット表に応じたカスタマイズが必要になるSQL文が含まれています。

32.5.3 マージ・スクリプトの変数

次の変数は必要に応じて変更します。

#TODO: Edit the replicat group name.
repName=BQ

#TODO: Edit this. Ensure each replicat uses a unique prefix.
stagingTablePrefix=${repName}_STAGE_

#TODO: Edit the GCS bucket name.
bucket=sanav_bucket_us

32.5.4 前提条件

このマージ・スクリプトbq.shは、Oracle GoldenGate for BigData ReplicatがインストールされているマシンにGoogle Cloudコマンドライン・プログラムのgsutilおよびbqがインストールされていることを必要とします。

32.6 Hiveのステージおよびマージ

Hiveは、Hadoop上に構築されたデータ・ウェアハウス・インフラストラクチャです。これには、簡単なデータETLを使用可能にするツール、データに構造を応用するメカニズム、およびHadoopファイルに格納されている大規模なデータ・セットの問合せおよび分析機能が用意されています。

このトピックでは、Hiveコマンド・イベント・ハンドラで実行できることの例を示します。

32.6.1 データ・フロー

  • ファイル・ライター(FW)ハンドラは、Avro Object Container Format (OCF)でファイルを生成するように構成されます。
  • HDFSイベント・ハンドラは、Avro OCFファイルをHadoopにプッシュするために使用します。
  • コマンド・イベント・ハンドラは、hive.shスクリプトにHadoopファイルのメタデータを渡します。

32.6.2 構成

Oracle GoldenGate BigDataインストールのディレクトリAdapterExamples/big-data/data-warehouse-utils/hive/には、Hiveへのステージおよびマージを使用したレプリケーションに必要なすべての構成およびスクリプトが含まれています。

次のファイルがあります。
  • hive.prm: Replicatパラメータ・ファイル。
  • hive.props: Hadoopにデータをステージングし、コマンド・イベント・ハンドラを実行するReplicatプロパティ・ファイル。
  • hive.sh: Hadoopにステージングされたデータを読み取り、データをHiveターゲット表にマージするbashシェル・スクリプト。
  • hive-ddl.sql: スクリプトhive.shで使用されるサンプル・ターゲット表が含まれているDDL文。

プロパティ・ファイルのhive.props内にある#TODO:コメントで示されたプロパティを編集します。

bashシェル・スクリプト関数merge()には、目的のターゲット表に応じたカスタマイズが必要になるSQL文が含まれています。

32.6.3 マージ・スクリプトの変数

変数は必要に応じて変更します。

#TODO: Modify the location of the OGGBD dirdef directory where the Avro schema files exist.
avroSchemaDir=/opt/ogg/dirdef

#TODO: Edit the JDBC URL to connect to hive.
hiveJdbcUrl=jdbc:hive2://localhost:10000/default
#TODO: Edit the JDBC user to connect to hive.
hiveJdbcUser=APP
#TODO: Edit the JDBC password to connect to hive.
hiveJdbcPassword=mine

#TODO: Edit the replicat group name.
repName=HIVE

#TODO: Edit this. Ensure each replicat uses a unique prefix.
stagingTablePrefix=${repName}_STAGE_

32.6.4 前提条件

前提条件は次のとおりです。

  • このマージ・スクリプトhive.shは、Oracle GoldenGate for BigData Replicatがインストールされているマシンにコマンドライン・プログラムbeelineがインストールされていることを必要とします。
  • カスタム・スクリプトhive.shでは、merge SQL文が使用されます。

    Hive Query言語 (Hive QL)には、mergeのサポートがHiveバージョン2.2で導入されました。