2 BigQueryハンドラの使用
Google BigQueryハンドラの使用方法について学習します。このハンドラは、チェンジ・データ・キャプチャのデータをソース証跡ファイルからGoogle BigQueryにストリーミングします。
BigQueryは、Google Storageと連携して機能する超大規模データセットの対話型分析を可能にするRESTful Webサービスです。https://cloud.google.com/bigquery/を参照してください。
- 機能の詳細
- BigQueryハンドラの設定および実行
Google BigQueryハンドラは、Java BigQueryクライアント・ライブラリを使用してBig Queryに接続します。
2.1 機能の詳細
親トピック: BigQueryハンドラの使用
2.1.1 データ型
BigQueryハンドラは標準のSQLデータ型に対応しており、そのデータ型のほとんどがBigQueryハンドラでサポートされています。証跡ファイルの列値から、BigQueryハンドラでBigQuery列タイプを表す対応するJavaタイプへのデータ型変換が必要です。
次のデータ型がサポートされます。
STRING
BYTES
INTEGER
FLOAT
NUMERIC
BOOLEAN
TIMESTAMP
DATE
TIME
DATETIME
BigQueryハンドラでは、ARRAY
やSTRUCT
などの複合データ型がサポートされていません。
親トピック: 機能の詳細
2.1.2 操作モード
BigQueryハンドラは、次の2つのモードのいずれかで構成できます。
-
Audit Log Mode = true
gg.handler.name.auditLogMode=true
監査ログ・モードをtrueにして実行されるようにハンドラを構成した場合は、データは一意の行識別キーなしでGoogle BigQueryにプッシュされます。その結果、Google BigQueryでは同じ行に対する異なる操作をマージできません。たとえば、1つの挿入操作、2つの更新操作、および1つの削除操作が行われた1つのソース行は、BigQueryでは4つの行(操作ごとに1つ)として表示されます。
また、BigQueryデータ・セットに表示される監査ログの順序は確定的ではありません。
これらの制限を解決するには、ハンドラのメタ列テンプレートでoptypeおよびpostionを指定する必要があります。これにより、Google BigQueryの表用のスキーマに同じ名前の列が2つ追加されます。たとえば:
gg.handler.bigquery.metaColumnsTemplate = ${optype}, ${position}
optype
は、監査ログの行の操作タイプを特定するために重要です。証跡ファイルで処理される操作の順に監査ログを表示するには、Google BigQueryの表を問い合せるときにORDER BY句で使用できる位置を指定します。たとえば:
SELECT * FROM [projectId:datasetId.tableId] ORDER BY position
-
auditLogMode = false
-
gg.handler.name.auditLogMode=false
監査ログ・モードを
false
にして実行されるようにハンドラを構成した場合は、データは、一意の行識別キーを使用してGoogle BigQueryにプッシュされます。Google BigQueryでは、同じ行に対する様々な操作をマージできます。ただし、この動作は複雑です。Google BigQueryでは、指定された行に対する操作をマージする間のみ、重複が排除されます。そのため、その結果は、やや非決定的である場合があります。証跡ソースには、正しくマージするためにレコードの完全なイメージが必要です。
例1
1つの挿入操作がBigQueryに送信されます。重複が排除される期間が経過する前に、同じ行に対する1つの更新操作がBigQueryに送信されます。その更新操作について結果として生成されるのは、BigQueryでは1行です。
例2
1つの挿入操作がBigQueryに送信されます。重複が排除される期間が経過した後、同じ行に対する1つの更新操作がBigQueryに送信されます。結果として、BigQueryで、その挿入操作と更新操作の両方が表示されます。
これは、BigQuery SDKを使用した場合の実証された動作であり、不具合ではなく特性ですが、この動作には多くのユーザーが混乱します。重複が排除される期間の長さとして実証されているのは、1分以上です。ただし、オラクル社のテスト実施では、この期間が非常に長いということが示されています。したがって、指定された1行に対するすべての操作が非常に短期間で実行されることが確実でないかぎり、BigQueryで、指定された1行に対して複数のエントリが存在する可能性があります。そのため、指定された1行の最新の状態を判断できるように、optypeおよびpositionを指定してメタ列を構成することもユーザーにとって重要となります。監査ログ・モードの詳細は、BigQueryへのデータのストリーミングというGoogle BigQueryドキュメントを参照してください。
親トピック: 機能の詳細
2.1.3 操作処理のサポート
BigQueryハンドラは、同期APIを使用してGoogle BigQueryに操作をプッシュします。BigQueryでは、挿入、更新および削除操作が、従来のRDBMSとは異なる方法で処理されます。
次に、挿入、更新および削除操作が操作モードに応じてハンドラでどのように解釈されるかについて説明します。
-
auditLogMode = true
-
-
insert
-optype
を挿入操作として、レコードをBigQuery表に挿入します。 -
update
-optype
を更新操作として、レコードをBigQuery表に挿入します。 -
delete
-optype
を削除操作として、レコードをBigQuery表に挿入します。 -
pkUpdate
—pkUpdateHandling
プロパティがdelete-insert
として構成されている場合、ハンドラは削除操作の後に挿入操作を送信します。これらの行はいずれもBigQuery表の同じ位置を持つので、主キー操作として識別され、別個の削除操作と挿入操作として識別されません。
-
-
auditLogMode = false
-
-
insert
- Google BigQueryに行がまだ存在しない場合、挿入操作はinsert
として処理されます。Google BigQueryに行がすでに存在する場合、挿入操作はupdate
として処理されます。ハンドラは、削除済列をfalse
に設定します。 -
update
- Google BigQueryに行が存在しない場合、更新操作はinsert
として処理されます。Google BigQueryに行がすでに存在する場合、更新操作はupdate
として処理されます。ハンドラは、削除済列をfalse
に設定します。 -
delete
- Google BigQueryに行が存在しない場合、削除操作は無効です。Google BigQueryに行が存在する場合、削除操作はdelete
として処理されます。ハンドラは、削除済列をtrue
に設定します。 -
pkUpdate
—pkUpdateHandling
プロパティがdelete-insert
として構成されている場合、ハンドラは主キーが更新される行について削除済列をtrue
に設定ます。その後に、この行について新しい主キーおよびfalse
に設定された削除済列が指定された別の挿入操作が続きます。
-
監査ログ・モードを切り替えると、Google BigQueryは既存の表のスキーマを変更できないためにBigQueryハンドラは強制的に異常終了するので、監査ログ・モードは切り替えないでください。既存の表は、監査ログ・モードを切り替える前に削除する必要があります。
ノート:
BigQueryハンドラでは、truncate
操作がサポートされていません。truncate
操作が発生すると異常終了します。
親トピック: 機能の詳細
2.1.4 プロキシ設定
プロキシ・サーバーを使用してBigQueryに接続するには、次のようにプロパティ・ファイルでプロキシ・ホストおよびプロキシ・ポートを構成する必要があります。
javawriter.bootoptions= -Dhttps.proxyHost=proxy_host_name
-Dhttps.proxyPort=proxy_port_number
親トピック: 機能の詳細
2.2 BigQueryハンドラの設定および実行
Google BigQueryハンドラは、Java BigQueryクライアント・ライブラリを使用してBig Queryに接続します。
- グループID: com.google.cloud
- アーティファクトID: google-cloud-bigquery
- バージョン: 1.111.1
BigQuery Clientライブラリは、Oracle GoldenGate for Big Dataに付属しません。またGoogleでは、BigQueryクライアント・ライブラリをダウンロードするためのリンクが削除されている可能性があります。BigQueryクライアント・ライブラリは、Mavenおよび前述のMaven座標を使用してダウンロードできます。ただし、Mavenの扱いに習熟していることが必要です。Google BigQueryクライアント・ライブラリをダウンロードできない場合、Oracle Supportに連絡してください。Google BigQuery依存性を参照してください。
2.2.1 BigQueryのスキーマ・マッピング
Replicatのmap文で指定された表スキーマ名は、BigQueryデータセット名にマップされます。たとえば: map QASOURCE.*, target "dataset_US".*;
このmap文は、BigQueryデータセット"dataset_US"に表を複製します
親トピック: BigQueryハンドラの設定および実行
2.2.2 BigQueryハンドラ構成の理解
BigQueryハンドラの構成可能な値は次のとおりです。これらのプロパティは、Javaアダプタ・プロパティ・ファイルにあります(Replicatプロパティ・ファイルにはありません)。
BigQueryハンドラの選択を有効にするには、まずgg.handler.name.type=bigquery
を指定してハンドラ・タイプを構成してから、次に示す他のBigQueryプロパティを構成する必要があります。
プロパティ | 必須/オプション | 有効な値 | デフォルト | 説明 |
---|---|---|---|---|
|
必須 |
任意の文字列 |
なし |
BigQueryハンドラの名前を指定します。BigQueryハンドラ名は、この表にリストしたプロパティ名の一部になります。 |
|
必須 |
|
なし |
BigQueryハンドラを選択し、チェンジ・データ・キャプチャをGoogle BigQueryにストリーミングします。 |
|
オプション |
資格証明ファイルの相対パスまたは絶対パス |
なし |
Google BigQueryから認証用にダウンロードされた資格証明ファイル。資格証明ファイルへのパスを指定しない場合は、環境変数として設定する必要があります。ハンドラ認証の構成を参照してください。 |
|
必須 |
任意の文字列 |
なし |
Google BigQuery内のプロジェクトの名前。ハンドラには、Google BigQueryストアに接続するためのプロジェクトIDが必要です。 |
|
オプション |
任意の数値 |
|
1つのバッチにまとめられる最大操作数。これは、すべてのターゲット表バッチに適用されます。 |
|
オプション |
任意の数値 |
|
次の操作のバッチを実行するまでに待機する最大時間(ミリ秒)。これは、すべてのターゲット表バッチに適用されます。 |
|
オプション |
|
|
無効な行が存在する場合でも、リクエストの有効な行をすべて挿入するかどうかを設定します。設定されていない場合、無効な行が含まれると、挿入リクエスト全体が失敗します。 |
gg.handler. name. ignoreUnknownValues |
オプション |
|
|
スキーマと一致しない値が含まれる行を受け入れるかどうかを設定します。設定されていない場合、不明な値を持つ行は無効とみなされます。 |
gg.handler. name. connectionTimeout |
オプション |
正の整数 |
|
ハンドラがGoogle BigQueryとの接続を確立するまで待機する最大時間(ミリ秒)。 |
gg.handler. name. readTimeout |
オプション |
正の整数 |
|
ハンドラが確立した接続からデータを読み取るまで待機する最大時間(ミリ秒)。 |
|
オプション |
有効な文字列 |
なし |
含める |
gg.handler. name. auditLogMode |
オプション |
|
|
|
gg.handler. name. pkUpdateHandling |
オプション |
|
|
ハンドラが、主キーを変更する更新操作をどのように処理するかを設定します。主キー操作により、BigQueryハンドラで問題が起きることがあるので、特に慎重を期する必要があります。
|
gg.handler.name.adjustScale |
オプション |
|
false |
BigQuery数値データ型では、9桁の最大スケールがサポートされます。フィールドがBigQuery数値データ型にマップされている場合、スケールが9桁を超えると失敗します。BigQuery数値データ型にマップされたフィールドを9桁のスケールに丸めるには、このプロパティをtrue に設定します。このプロパティを有効にすると、スケールが9桁を超えるソース・データ値の精度が失われます。
|
gg.handler.name.includeDeletedColumn |
オプション |
|
false |
出力にdeletedというブール列を含めるには、true に設定します。この列の値は、挿入操作および更新操作の場合はfalse に、削除操作の場合はtrue に設定されます。
|
gg.handler.name.enableAlter |
オプション | true | false |
false |
true に設定すると、ターゲットBigQuery表の変更が有効になります。これにより、BigQueryハンドラはソースで構成されていて現時点ではターゲットBigQuery表に存在しない列またはメタ列を追加できるようになります。
|
親トピック: BigQueryハンドラの設定および実行
2.2.3 サンプル構成の確認
次に、BigQueryハンドラのサンプル構成を示します。
gg.handlerlist = bigquery #The handler properties gg.handler.bigquery.type = bigquery gg.handler.bigquery.projectId = festive-athlete-201315 gg.handler.bigquery.credentialsFile = credentials.json gg.handler.bigquery.auditLogMode = true gg.handler.bigquery.pkUpdateHandling = delete-insert gg.handler.bigquery.metaColumnsTemplate =${optype}, ${position}
親トピック: BigQueryハンドラの設定および実行
2.2.4 ハンドラ認証の構成
Google BigQueryからダウンロードしたJSONファイルの資格証明を使用してBigQueryハンドラ認証を構成する必要があります。
資格証明ファイルをダウンロードします。
-
cloud.google.comでGoogleアカウントにログインします。
-
「Console」をクリックし、プロジェクトを選択できるダッシュボードに移動します。
-
ナビゲーション・メニューから、「APIs & Services」をクリックし、「Credentials」を選択します。
-
「Create Credentials」メニューから、「Service account key」を選択します。
-
JSONキー・タイプを選択して、システムのJSON資格証明ファイルをダウンロードします。
資格証明ファイルを取得すると、次の2つの方法のいずれかでハンドラを認証できます。
-
gg.handler.name.credentialsFile
構成プロパティを使用して、プロパティ・ファイルに資格証明ファイルへのパスを指定します。資格証明ファイルのパスには、ワイルドカードが付加されていないパスを使用してください。資格証明ファイルへのパスに
*
ワイルドカードを含めると、ファイルは認識されません。または
-
GOOGLE_APPLICATION_CREDENTIALS
環境変数をシステムに設定します。たとえば:export GOOGLE_APPLICATION_CREDENTIALS = credentials.json
次に、Oracle GoldenGateマネージャ・プロセスを再起動します。
親トピック: BigQueryハンドラの設定および実行