2 BigQueryハンドラの使用

Google BigQueryハンドラの使用方法について学習します。このハンドラは、チェンジ・データ・キャプチャのデータをソース証跡ファイルからGoogle BigQueryにストリーミングします。

BigQueryは、Google Storageと連携して機能する超大規模データセットの対話型分析を可能にするRESTful Webサービスです。https://cloud.google.com/bigquery/を参照してください。

2.1 機能の詳細

2.1.1 データ型

BigQueryハンドラは標準のSQLデータ型に対応しており、そのデータ型のほとんどがBigQueryハンドラでサポートされています。証跡ファイルの列値から、BigQueryハンドラでBigQuery列タイプを表す対応するJavaタイプへのデータ型変換が必要です。

次のデータ型がサポートされます。

STRING
BYTES
INTEGER
FLOAT
NUMERIC
BOOLEAN
TIMESTAMP
DATE
TIME
DATETIME

BigQueryハンドラでは、ARRAYSTRUCTなどの複合データ型がサポートされていません。

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表に挿入します。

  • pkUpdatepkUpdateHandlingプロパティが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に設定します。

  • pkUpdatepkUpdateHandlingプロパティが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に接続します。

これらのクライアント・ライブラリは、次のMaven座標を使用して配置されています。
  • グループ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"に表を複製します

2.2.2 BigQueryハンドラ構成の理解

BigQueryハンドラの構成可能な値は次のとおりです。これらのプロパティは、Javaアダプタ・プロパティ・ファイルにあります(Replicatプロパティ・ファイルにはありません)。

BigQueryハンドラの選択を有効にするには、まずgg.handler.name.type=bigqueryを指定してハンドラ・タイプを構成してから、次に示す他のBigQueryプロパティを構成する必要があります。

プロパティ 必須/オプション 有効な値 デフォルト 説明

gg.handlerlist

必須

任意の文字列

なし

BigQueryハンドラの名前を指定します。BigQueryハンドラ名は、この表にリストしたプロパティ名の一部になります。

gg.handler.name.type=bigquery

必須

bigquery

なし

BigQueryハンドラを選択し、チェンジ・データ・キャプチャをGoogle BigQueryにストリーミングします。

gg.handler.name.credentialsFile

オプション

資格証明ファイルの相対パスまたは絶対パス

なし

Google BigQueryから認証用にダウンロードされた資格証明ファイル。資格証明ファイルへのパスを指定しない場合は、環境変数として設定する必要があります。ハンドラ認証の構成を参照してください。

gg.handler.name.projectId

必須

任意の文字列

なし

Google BigQuery内のプロジェクトの名前。ハンドラには、Google BigQueryストアに接続するためのプロジェクトIDが必要です。

gg.handler.name.batchSize

オプション

任意の数値

500

1つのバッチにまとめられる最大操作数。これは、すべてのターゲット表バッチに適用されます。

gg.handler.name.batchFlushFrequency

オプション

任意の数値

1000

次の操作のバッチを実行するまでに待機する最大時間(ミリ秒)。これは、すべてのターゲット表バッチに適用されます。

gg.handler.name.skipInvalidRows

オプション

true | false

false

無効な行が存在する場合でも、リクエストの有効な行をすべて挿入するかどうかを設定します。設定されていない場合、無効な行が含まれると、挿入リクエスト全体が失敗します。

gg.handler.name.ignoreUnknownValues

オプション

true | false

false

スキーマと一致しない値が含まれる行を受け入れるかどうかを設定します。設定されていない場合、不明な値を持つ行は無効とみなされます。

gg.handler.name.connectionTimeout

オプション

正の整数

20000

ハンドラがGoogle BigQueryとの接続を確立するまで待機する最大時間(ミリ秒)。

gg.handler.name.readTimeout

オプション

正の整数

30000

ハンドラが確立した接続からデータを読み取るまで待機する最大時間(ミリ秒)。

gg.handler.name.metaColumnsTemplate

オプション

有効な文字列

なし

含めるmetaColumnsを指定する有効な文字列。auditLogModetrueに設定した場合、監査ログに挿入される行の操作タイプを表示するようにmetaColumnsTemplateプロパティを設定することが重要です。「メタ列出力の設定」を参照してください。

gg.handler.name.auditLogMode

オプション

true | false

false

trueに設定すると、ハンドラは各レコードを主キーなしでターゲットに書き込みます。すべて挿入として処理されます。

falseに設定すると、着信レコードが同じ主キーを持っている場合、ハンドラはそれらをターゲット表にマージしようとします。このプロパティには主キーが必要です。証跡ソース・レコードには、正しくマージするために完全なイメージ更新が必要です。

gg.handler.name.pkUpdateHandling

オプション

abend | delete-insert

abend

ハンドラが、主キーを変更する更新操作をどのように処理するかを設定します。主キー操作により、BigQueryハンドラで問題が起きることがあるので、特に慎重を期する必要があります。

  • abend - プロセスが異常終了することを示します。

  • delete-insert - プロセスで操作が削除および挿入として扱われることを示します。このプロパティが正しく機能するには、完全な操作前イメージが必要です。操作前と操作後の完全な行イメージがない場合、挿入データは不完全になります。このオプションをお薦めします。

gg.handler.name.adjustScale オプション

true | false

false BigQuery数値データ型では、9桁の最大スケールがサポートされます。フィールドがBigQuery数値データ型にマップされている場合、スケールが9桁を超えると失敗します。BigQuery数値データ型にマップされたフィールドを9桁のスケールに丸めるには、このプロパティをtrueに設定します。このプロパティを有効にすると、スケールが9桁を超えるソース・データ値の精度が失われます。
gg.handler.name.includeDeletedColumn オプション

true | false

false 出力にdeletedというブール列を含めるには、trueに設定します。この列の値は、挿入操作および更新操作の場合はfalseに、削除操作の場合はtrueに設定されます。
gg.handler.name.enableAlter オプション true | false false trueに設定すると、ターゲット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}

2.2.4 ハンドラ認証の構成

Google BigQueryからダウンロードしたJSONファイルの資格証明を使用してBigQueryハンドラ認証を構成する必要があります。

資格証明ファイルをダウンロードします。

  1. cloud.google.comでGoogleアカウントにログインします。

  2. 「Console」をクリックし、プロジェクトを選択できるダッシュボードに移動します。

  3. ナビゲーション・メニューから、「APIs & Services」をクリックし、「Credentials」を選択します。

  4. 「Create Credentials」メニューから、「Service account key」を選択します。

  5. JSONキー・タイプを選択して、システムのJSON資格証明ファイルをダウンロードします。

資格証明ファイルを取得すると、次の2つの方法のいずれかでハンドラを認証できます。

  • gg.handler.name.credentialsFile構成プロパティを使用して、プロパティ・ファイルに資格証明ファイルへのパスを指定します。

    資格証明ファイルのパスには、ワイルドカードが付加されていないパスを使用してください。資格証明ファイルへのパスに*ワイルドカードを含めると、ファイルは認識されません。

    または

  • GOOGLE_APPLICATION_CREDENTIALS環境変数をシステムに設定します。たとえば:

    export GOOGLE_APPLICATION_CREDENTIALS = credentials.json

    次に、Oracle GoldenGateマネージャ・プロセスを再起動します。