8.2.13 Azure Synapse Analytics Data Warehouse

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

8.2.13.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文の組合せを使用してマージ操作が実行されます。

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

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

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

8.2.13.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

8.2.13.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文のマージを参照してください。

8.2.13.2 構成

8.2.13.2.1 自動構成

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

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

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

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

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

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

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

表8-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.aggregate.operations.flush.interval オプション 整数 30000 flush intervalパラメータは、データがSynapseにマージされる頻度を決定します。値はミリ秒単位で設定されます。慎重に使用してください。値が大きいほど、大きいデータはReplicatプロセスのメモリーに格納される必要があります。

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

gg.operation.aggregator.validate.keyupdate オプション trueまたはfalse false trueに設定すると、操作アグリゲータはキー更新操作(optype 115)を検証し、キー値が変更されていない場合は通常の更新に訂正します。圧縮キー更新操作はマージ対象ではありません。

8.2.13.2.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=='
;

8.2.13.2.3 クラスパス構成

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

8.2.13.2.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イベント・ハンドラ依存性: unresolvable-reference.html#GUID-E62904D1-EBFD-4C84-B112-97D1F5D4BE6Fを参照して、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>
8.2.13.2.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/*

8.2.13.2.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に設定してステージング・ファイルを圧縮できます。

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

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

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

8.2.13.2.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

8.2.13.2.7 圧縮更新の処理

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

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

Oracle GoldenGate証跡には、圧縮更新レコードまたは非圧縮更新レコードを含めることができます。デフォルトの抽出構成では、圧縮更新が証跡に書き込まれます。

パラメータgg.compressed.updatetrueまたはfalseに設定して、圧縮/非圧縮更新レコードを指定できます。

8.2.13.2.7.1 非圧縮更新を含むMERGE文

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

ノート:

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

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

  • 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ターゲット表がハッシュ分散表ではないことを示します。ハッシュ分散を使用してターゲット表を作成する必要があります。