9.2.15 Azure Synapse Analytics Data Warehouse

Microsoft Azure Synapse Analyticsは、データ統合、エンタープライズ・データ・ウェアハウジングおよびOracle GoldenGate for Distributed Applications and Analytics (GG for DAA)の分析を組み合せた、制限のない分析サービスです。

9.2.15.1 詳細な機能

Synapseへのレプリケーションでは、ステージとマージのデータ・フローが使用されます。

変更データはマイクロバッチの一時的な場所にステージングされ、最終的にターゲット表にマージされます。

Azure Data Lake Storage (ADLS) Gen 2は、変更データのステージング領域として使用されます。

Synapseイベント・ハンドラは、Parquetイベント・ハンドラの出力に接続されたダウンストリーム イベント ハンドラとして使用されます。

Parquetイベント・ハンドラは、ファイル・ライター・ハンドラによって生成されたファイルをADLS Gen2にロードします。

Synapseイベント・ハンドラは、SQL文を実行して、ADLS Gen2にステージングされた操作レコードをマージします。

SQL操作は、スループットを改善するためにバッチで実行されます。

Oracle GoldenGate for Distributed Applications and Analytics (GG for DAA)では、MERGE SQL文、またはDELETEINSERT SQL文の組合せを使用してマージ操作が実行されます。

9.2.15.1.1 データベース・ユーザー権限

レプリケーションに使用するデータベース・ユーザーには、次の権限が付与されている必要があります。

  • ターゲット表に対するINSERTUPDATEDELETEおよびTRUNCATE
  • CREATEおよびDROPシナプス外部ファイル形式。
  • CREATEおよびDROPシナプス外部データ・ソース。
  • CREATEおよびDROP Synapse外部表。

9.2.15.1.2 マージSQL文

Azure Synapse AnalyticsのマージSQL文は2022年後半に一般に使用可能になったため、Oracle GoldenGate for Distributed Applications and Analytics (GG for DAA)では、デフォルトでマージ文が使用されます。マージSQLを無効にするには、jvm.bootoptionsパラメータでJavaシステム・プロパティが設定されていることを確認します。

たとえば:
jvm.bootoptions=-Dsynapse.use.merge.sql=false

9.2.15.1.3 前提条件

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

  • 非圧縮UPDATEレコード: Oracle GoldenGateがマージ文を使用しないように構成されている場合(マージSQL文を参照)、Synapseに適用するために使用される証跡ファイルに非圧縮のUPDATE操作レコードが含まれている必要があります。これは、UPDATE操作には更新される行の完全なイメージが含まれることを意味します。UPDATEレコードに列がない場合は、圧縮されたUPDATE証跡レコードの検出時にReplicatがABENDします。
  • Oracle GoldenGateがマージ文を使用するように構成されている場合(マージSQL文を参照)、ターゲット表はハッシュ分散表である必要があります。
  • ターゲット表の存在: ターゲット表はSynapseデータベースに存在する必要があります。
  • Azureストレージ・アカウント: Azureストレージ・アカウントおよびコンテナが存在する必要があります。

    Azure SynapseワークスペースおよびAzureストレージ・アカウントは、同じAzureリージョンに配置することをお薦めします。

  • Oracle GoldenGateがマージ文を使用するように構成されている場合、Synapseマージ文ではIDENTITY列へのデータの挿入がサポートされていないため、ターゲット表はIDENTITY列を定義できません。SQL文のマージの詳細は、SQL文のマージを参照してください。

9.2.15.2 操作集計

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

9.2.15.2.1 インメモリー操作の集計

  • 操作レコードは、デフォルトではインメモリーで集計されます。
  • gg.aggregate.operations.flush.intervalプロパティは非推奨となり、サポートされなくなりました。GG for DAA 23aiでgg.aggregate.operations.flush.intervalが使用されている場合、Replicatは実行されますが、非推奨でありサポートされていないプロパティに関する警告がログ・ファイルに追加されます。

    集計の時間枠を制御するには、gg.handler.snowflake.fileRollIntervalプロパティを使用します。デフォルトでは、これは3分に設定されています。間隔が長いほど、待機時間が長くなります。また、メモリー使用量が増える場合があります。間隔が短いほど、Oracle GoldenGateおよびターゲット・データベースでのオーバーヘッドが増えます。

  • インメモリー操作集計には、追加のJVMメモリー構成が必要です。

9.2.15.2.2 SQLを使用した操作集計

  • SQL集計を使用するには、証跡ファイルに非圧縮UPDATE操作レコードが含まれている必要があります。つまり、UPDATE操作には、更新する行の完全なイメージが含まれていることを意味します。
  • SQLを使用した操作集計では、証跡ファイルに非圧縮更新レコードが含まれている場合、スループットが向上します。
  • Replicatは、gg.aggregate.operations.using.sql=trueを設定することで、SQL文を使用して操作を集計できます。
  • ファイル・ライターgg.handler.synapse.fileRollIntervalプロパティを使用してマージ間隔の頻度をチューニングできます。このデフォルト値は3m (3分)に設定されています。
  • SQLを使用した操作集計では、追加のJVMメモリー構成は必要ありません。

9.2.15.3 圧縮更新の処理

圧縮更新レコードには、キー列および変更された列の値が含まれています。

非圧縮更新レコードには、すべての列の値が含まれています。

Oracle GoldenGate証跡には、圧縮更新レコードまたは非圧縮更新レコードを含めることができます。デフォルトの抽出構成では、圧縮更新が証跡に書き込まれます。パラメータgg.compressed.updatetrueまたはfalseに設定して、圧縮更新レコードまたは非圧縮更新レコードを指定できます。

デフォルトの抽出構成では、圧縮更新が証跡に書き込まれます。パラメータgg.compressed.updatetrueまたはfalseに設定して、圧縮/非圧縮更新レコードを指定できます。

9.2.15.3.1 非圧縮更新を含むMERGE文

場合によっては、証跡に非圧縮更新レコードが含まれている場合、gg.compressed.update=falseを設定することで、パフォーマンスを向上させるためにMERGE SQL文を最適化できます。

MERGE SQL文のかわりにDELETE+INSERT SQL文を使用する場合は、gg.eventhandler.synapse.deleteInsert=trueを設定します。

9.2.15.4 構成

9.2.15.4.1 自動構成

Synapseレプリケーションには、ファイル・ライター・ハンドラ、Parquetイベント・ハンドラ、Synapseイベント・ハンドラなどの複数のコンポーネントの構成が含まれます。

自動構成機能は、ユーザー構成が最小限になるようにこれらのコンポーネントを自動構成するのに役立ちます。

自動構成によって変更されたプロパティもハンドラのログ・ファイルに記録されます。

自動構成をSynapseターゲットに複製できるようにするには、次のようにパラメータを設定する必要があります: gg.target=synapse

Synapseターゲットに複製する場合、Parquetイベント・ハンドラ名およびSynapseイベント・ハンドラ名のカスタマイズは許されません。

9.2.15.4.1.1 ファイル・ライター・ハンドラの構成
ファイル・ライター・ハンドラ名は、値synapseに事前設定されています。次に、ファイル・ライター・ハンドラのプロパティを編集する例を示します。
gg.handler.synapse.pathMappingTemplate=./dirout
9.2.15.4.1.2 Parquetイベント・ハンドラ構成

Parquetイベント・ハンドラ名は、値parquetに事前設定されています。Parquetイベント・ハンドラは、HDFSに書き込むように自動構成されています。Azure Data Lake Storage(ADLS) Gen2アカウントの対応するコンテナにデータ・ファイルを書き込むように、hadoop構成ファイルcore-site.xmlを構成する必要があります。「HadoopクライアントおよびABFSを使用したAzure Data Lake Gen2」を参照してください。

次に、Parquetイベント・ハンドラのプロパティを編集する例を示します。
gg.eventhandler.parquet.finalizeAction=delete
9.2.15.4.1.3 Synapseイベント・ハンドラ構成

Synapseイベント・ハンドラ名は、値synapseに事前設定されています。

表9-12 Synapseイベント・ハンドラ構成

プロパティ 必須/オプション 有効な値 デフォルト 説明
gg.eventhandler.synapse.connectionURL 必須
jdbc:sqlserver://<synapse-
workspace>.sql.azuresynapse.net:1433;database=
<db-name>;encrypt=true;
trustServerCertificate=false;
hostNameInCertificate=*.sql.azuresynapse.net;
loginTimeout=300;
なし Synapseに接続するためのJDBC URL。
gg.eventhandler.synapse.UserName 必須 データベース・ユーザー名。 なし SynapseワークスペースのSynapseデータベース・ユーザー。ユーザー名はSynapseワークスペース名で修飾する必要があります。たとえば、sqladminuser@synapseworkspaceです。
gg.eventhandler.synapse.Password 必須 サポートされているデータベース文字列。 なし Synapseデータベース・パスワード。
gg.eventhandler.synapse.credential 必須 資格証明名。 なし Azure Data Lake Gen2ファイルにアクセスするためのSynapseのデータベース資格証明名。資格証明を作成するステップは、Synapseデータベース資格証明を参照してください。
gg.eventhandler.synapse.maxConnnections オプション 整数値 10 このパラメータは、ターゲットSynapseデータベースへの同時JDBCデータベース接続の数を制御するために使用します。
gg.eventhandler.synapse.dropStagingTablesOnShutdown オプション trueまたはfalse false trueに設定すると、GoldenGateによって作成された一時ステージング表は、Replicatの正常な停止時に削除されます。
gg.maxInlineLobSize オプション 整数値 16000 このパラメータを使用して、ラージ・オブジェクト(LOB)列の最大インライン・サイズをバイト単位で設定できます。詳細は、ラージ・オブジェクト(LOB)のパフォーマンスを参照してください。
gg.handler.synapse.fileRollInterval オプション デフォルトの測定単位はミリ秒です。ms、s、m、hを、それぞれミリ秒、秒、分または時間を表すように指定できます。有効な値は、10000、10000ms、10s、10m、1.5hなどです。0以下の値を指定すると、ファイルのローリング・オン時間がオフになります。 3m (3分) このパラメータにより、データがSynapseにマージされる頻度を決めます。この値が大きいほど、Replicatプロセスのメモリーに格納する必要があるデータが多くなるため、注意して使用してください。

ノート:

このパラメータは慎重に使用してください。そのデフォルト値(3m)を増やすと、Replicatの内部メモリーに格納されるデータの量が増えます。これにより、メモリー不足エラーが発生し、メモリー不足になるとReplicatが停止する可能性があります。

ノート:

23aiリリース以降では、gg.aggregate.operations.flush.intervalプロパティは非推奨となり、サポートされなくなりました。詳細は、「インメモリー操作の集計」を参照してください
gg.compressed.update オプション trueまたはfalse true trueを設定すると、ソース証跡ファイルに圧縮更新操作が含まれていることを示します。trueに設定すると、ソース証跡ファイルには、非圧縮更新操作が含まれることが想定されます。
gg.eventhandler.synapse.connectionRetryIntervalSeconds オプション 整数値 30 接続再試行間の遅延(秒単位)を指定します。
gg.eventhandler.synapse.connectionRetries オプション 整数値 3 ターゲット・データ・ウェアハウスへの接続が再試行される回数を指定します。
gg.validate.keyupdate オプション trueまたはfalse false trueに設定した場合は、Replicatによってキー更新操作(optype 115)が検証され、キー値が変更されていない場合は通常の更新に訂正されます。圧縮キー更新操作はマージ対象ではありません。
gg.eventhandler.synapse.deleteInsert オプション trueまたはfalse false trueに設定した場合は、Replicatによって、SQLのMERGE文ではなくSQLのDELETE+INSERT文を使用してレコードがマージされます。

ノート:

gg.compressed.updatefalseに設定されている場合のみ適用されます。

9.2.15.4.2 Synapseデータベース資格証明

SynapseがAzure Data Lake Gen2ストレージ・アカウントのデータ・ファイルにアクセスできるようにするには、次のステップに従ってデータベース資格証明を作成します:
  1. Azure Web SQLコンソール(https://web.azuresynapse.net/en-us/)を使用して、それぞれのSynapse SQL専用プールに接続します。
  2. DBマスター・キーがまだ存在しない場合は、自分のパスワードを使用して作成します。
  3. データベース・スコープの資格証明を作成します。この資格証明により、Oracle GoldenGateのReplicatプロセスがAzureストレージ・アカウントにアクセスできます。

    この資格証明の作成時に、Azureストレージ・アカウント名およびアクセス・キーを指定します。

    ストレージ・アカウントのアクセス・キーは、Azureクラウド・コンソールから取得できます。

たとえば:
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Your own password' ;
CREATE DATABASE SCOPED CREDENTIAL OGGBD_ADLS_credential
WITH
-- IDENTITY = '<storage_account_name>' ,
  IDENTITY = 'sanavaccountuseast' ,
-- SECRET = '<storage_account_key>'
  SECRET = 'c8C0yR-this-is-a-fake-access-key-Gc9c5mENOJ1mLyxlO1vSRDlRG0/Ke+tbAvi6xe73HAAhLtdMFZRA=='
;

9.2.15.4.3 クラスパス構成

Synapseイベント・ハンドラは、アップストリームのファイル・ライター・ハンドラとParquetイベント・ハンドラに依存します。

9.2.15.4.3.1 依存性
  • Microsoft SQLServer JDBCドライバ: JDBCドライバは、次の座標を使用してMaven Centralからダウンロードできます。
      <dependency>
                    <groupId>com.microsoft.sqlserver</groupId>
                    <artifactId>mssql-jdbc</artifactId>
                    <version>8.4.1.jre8</version>
                    <scope>provided</scope>
                </dependency>
    
または、JDBCドライバはスクリプト<OGGDIR>/DependencyDownloader/synapse.shを使用してダウンロードすることもできます。
  • Parquetイベント・ハンドラ依存性: Parquetイベント・ハンドラ構成を参照して、Parquet依存性を含めるようにクラスパスを構成します。

  • Hadoop依存性: Hadoop依存性は、依存性ダウンローダ <OGGDIR>/DependencyDownloader/hadoop.shを使用してダウンロードできます
  • Azure Storage依存性: Azure Storage依存性は、次の座標を使用してMavenからダウンロードできます。
<dependencies>
    <dependency>
      <groupId>com.azure</groupId>
      <artifactId>azure-storage-blob</artifactId>
      <version>12.13.0</version>
    </dependency>
    <dependency>
      <groupId>com.azure</groupId>
      <artifactId>azure-identity</artifactId>
      <version>1.3.3</version>
    </dependency>
</dependencies>
9.2.15.4.3.2 クラスパス
gg.classpath configurationパラメータを編集して、Parquetイベント・ハンドラ、Synapse JDBC、Azure Storageおよびhadoopの依存性へのパスを含めます。
たとえば:
gg.classpath=/path/to/parquet-deps/*:/path/to/abs-deps/*:path/to/synapse-deps/mssql-jdbc-8.4.1.jre8.jar:/path/to/hadoop-deps/*

9.2.15.4.4 INSERTALLRECORDSのサポート

ステージングおよびマージ・ターゲットでは、INSERTALLRECORDSパラメータがサポートされます。

『Oracle GoldenGateリファレンス』INSERTALLRECORDSを参照してください。Replicatパラメータ・ファイル(.prm)でINSERTALLRECORDSパラメータを設定します。Replicatパラメータ・ファイル(.prm)でINSERTALLRECORDSパラメータを設定します

このプロパティを設定すると、Replicatプロセスに、操作データをターゲット表にロードするための一括挿入操作を使用するように指示されます。一括挿入のバッチ・サイズは、ファイル・ライター・プロパティgg.handler.synapse.maxFileSizeを使用してチューニングできます。デフォルト値は1GBに設定されています。一括挿入の頻度は、ファイル・ライター・プロパティgg.handler.synapse.fileRollIntervalを使用してチューニングでき、デフォルト値は3m (3分)に設定されています。

ノート:

  • Synapse内部ステージを使用する場合、gg.handler.synapse.putSQLAutoCompresstrueに設定してステージング・ファイルを圧縮できます。

9.2.15.4.5 ラージ・オブジェクト(LOB)のパフォーマンス

ラージ・オブジェクト(LOB)列が存在すると、Replicatの適用パフォーマンスに影響する可能性があります。インラインしきい値gg.maxInlineLobSizeを超えるLOB列の変更はバッチ処理に適さず、そのような操作は遅くなります。

コンピュート・マシンに十分なRAMがある場合は、このパラメータを増やして処理を高速化できます。

9.2.15.4.6 エンドツーエンドの構成

FWハンドラ、ParquetおよびSynapseイベント・ハンドラの自動構成を使用するエンド-エンド構成の例を次に示します。

このサンプル・プロパティ・ファイルは、ディレクトリAdapterExamples/big-data/synapse/synapse.propsにもあります。

# Azure Synapse Analytics Data Warehouse Template
# Configuration to load GoldenGate trail operation records into Azure Synapse Analytics by chaining
# File writer handler -> Parquet Event handler -> Synapse Event handler.
# Note: Recommended to only edit the configuration marked as  TODO

gg.target=synapse

#The Parquet Event Handler
No properties are required for the Parquet Event handler.
#gg.eventhandler.parquet.finalizeAction=delete

ADLS Gen 2 stage (Using Azure Blob SDK). 
#Azure Blob Event handler 
#TODO: Edit the Azure Blob Storage container name
gg.eventhandler.abs.bucketMappingTemplate=<abs-container-name> 
#TODO: Edit the Azure storage.account name. gg.eventhandler.abs.accountName=<storage-account-name> 
#TODO: Edit the Azure storage account key.
gg.eventhandler.abs.accountKey=<storage-account-key>

#The Synapse Event Handler
#TODO: Edit JDBC ConnectionUrl
gg.eventhandler.synapse.connectionURL=jdbc:sqlserver://<synapse-workspace>.sql.azuresynapse.net:1433;database=<db-name>;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.sql.azuresynapse.net;loginTimeout=300;
#TODO: Edit JDBC user name
gg.eventhandler.synapse.UserName=<db user name>@<synapse-workspace>
#TODO: Edit JDBC password
gg.eventhandler.synapse.Password=<db password>
#TODO: Edit Credential to access Azure storage.
gg.eventhandler.synapse.credential=OGGBD_ADLS_credential
#TODO: Edit the classpath to include dependencies for Parquet Event Handler, ABS Event handler and the Synapse JDBC driver.
gg.classpath=/path/to/parquet-deps/:/path/to/abs-deps/:path/to/synapse-deps/mssql-jdbc-8.4.1.jre8.jar:/path/to/hadoop-deps/*
#TODO: Provide sufficient memory (at least 8GB).
jvm.bootoptions=-Xmx8g -Xms8g -DSYNAPSE_STAGE=parquet,abs

9.2.15.5 トラブルシューティングと診断

  • Synapseへの接続の問題:
    • JDBC接続URL、ユーザー名およびパスワードを検証してください。
    • http/httpsプロキシが有効かどうか確認します。Synapseはhttp(s)プロキシ経由の接続をサポートしていません。
  • DDLがターゲット表に適用されない: Oracle GoldenGate for Distributed Applications and Analytics (GG for DAA)ではDDLレプリケーションはサポートされていません。
  • ターゲット表の存在: Replicatプロセスを開始する前に、Synapseターゲット表が存在している必要があります。ターゲット表がない場合、Replicatプロセスは異常終了(ABEND)します。
  • SQLエラー: SQLの実行中にエラーが発生した場合、そのSQL文全体がバインド・パラメータ値とともにGG for DAAハンドラのログ・ファイルに記録されます。
  • コンポーネントの共存: Replicatプロセスが実行されているマシンの場所/リージョン、Azure Data Lake Storageコンテナ・リージョン、およびSynapseリージョンは、適用プロセスの全体的なスループットに影響を与えます。データ・フローは次のとおりです: Oracle GoldenGate -> Azure Data Lake Gen 2 -> Synapse。最高のスループットを得るには、コンポーネントをできるだけ近くに配置する必要があります。
  • 証跡ファイルの部分的なLOBレコードによるReplicatの異常終了(ABEND): GG for DAAのSynapse適用では、部分LOBのレプリケーションはサポートされていません。Extractパラメータ・ファイルでTRANLOGOPTIONS FETCHPARTIALLOBオプションを使用して、Oracle統合取得によって証跡ファイルを再生成する必要があります。
  • エラー:com.microsoft.sqlserver.jdbc.SQLServerException: Conversion failed when converting date and/or time from character string:

    これは、ソースの日時列とターゲットの日時列に互換性がない場合に発生します。

    たとえば、ソース列がタイムスタンプ・タイプで、ターゲット列がSynapse時間の場合です。

  • Synapseの表名または列名に二重引用符が含まれている場合、GG for DAAのReplicatが異常終了(ABEND)します。
  • エラー: com.microsoft.sqlserver.jdbc.SQLServerException: HdfsBridge::recordReaderFillBuffer。これは、Azure Data Lakeファイルによりバックアップされた外部表のデータが読取り不可であることを示します。Oracleサポートに連絡してください。
  • ターゲット表のIDENTITY列: Synapse MERGE文は、IDENTITY列へのデータの挿入をサポートしていません。したがって、jvm.bootoptions=-Dsynapse.use.merge.sql=trueを使用してMERGE文が有効になっている場合、Replicatは次のエラー・メッセージでABENDします。
    例外:
    com.microsoft.sqlserver.jdbc.SQLServerException: Cannot update identity column 'ORDER_ID'
  • エラー: com.microsoft.sqlserver.jdbc.SQLServerException: Merge statements with a WHEN NOT MATCHED [BY TARGET] clause must target a hash distributed table:

    これは、マージSQL文がオンであり、Synapseターゲット表がハッシュ分散表ではないことを示します。ハッシュ分散を使用してターゲット表を作成する必要があります。