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
文、またはDELETE
とINSERT
SQL文の組合せを使用してマージ操作が実行されます。
9.2.15.1.1 データベース・ユーザー権限
レプリケーションに使用するデータベース・ユーザーには、次の権限が付与されている必要があります。
- ターゲット表に対する
INSERT
、UPDATE
、DELETE
および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.update
をtrue
またはfalse
に設定して、圧縮更新レコードまたは非圧縮更新レコードを指定できます。
デフォルトの抽出構成では、圧縮更新が証跡に書き込まれます。パラメータgg.compressed.update
をtrue
または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」を参照してください。
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.update がfalse に設定されている場合のみ適用されます。
|
親トピック: 自動構成
9.2.15.4.2 Synapseデータベース資格証明
- Azure Web SQLコンソール(
https://web.azuresynapse.net/en-us/
)を使用して、それぞれのSynapse SQL専用プールに接続します。 - DBマスター・キーがまだ存在しない場合は、自分のパスワードを使用して作成します。
- データベース・スコープの資格証明を作成します。この資格証明により、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>
<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.putSQLAutoCompress
をtrue
に設定してステージング・ファイルを圧縮できます。
親トピック: 構成
9.2.15.4.5 ラージ・オブジェクト(LOB)のパフォーマンス
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ターゲット表がハッシュ分散表ではないことを示します。ハッシュ分散を使用してターゲット表を作成する必要があります。