17 プラガブル・フォーマッタの使用
プラガブル・フォーマッタを使用して、Oracle GoldenGate証跡ファイルの操作をフォーマット済のメッセージに変換する方法を説明します。変換されたメッセージは、Oracle GoldenGate for Big Dataのいずれかのハンドラによってビッグ・データ・ターゲットに送信できます。
トピック:
17.1 Avroフォーマッタの使用
Apache Avroは、オープン・ソースのデータ・シリアライズ/デシリアライズ・フレームワークの1つです。シリアライズされたデータの柔軟性と簡潔さ、シリアライズ/デシリアライズのパフォーマンスの高さで知られています。Apache Avroは、ビッグ・データ・アプリケーションでよく使われています。
トピック:
17.1.1 Avro行フォーマッタ
Avro行フォーマッタは、ソース証跡ファイルの操作データを、Avroバイナリ配列形式のメッセージにフォーマットします。挿入、更新、削除および切捨ての各操作は、個々のAvroメッセージとしてフォーマットされます。ソース証跡ファイルには、操作データの操作前と操作後のイメージが含まれます。Avro行フォーマッタは、その操作前イメージと操作後イメージのデータを取得して、データをAvroバイナリ形式の操作データにフォーマットします。
Avro行フォーマッタは、ソース証跡ファイルの操作データから行データを表す形式に操作をフォーマットします。この形式は、Avroメッセージがデータ変更操作をモデル化するため、Avro操作フォーマッタの出力より簡潔です。
Avro行フォーマッタは、AvroデータをHDFSにストリーミングするときに適した選択肢です。Hiveは、HDFSのデータ・ファイルをAvro形式でサポートします。
この項の内容は次のとおりです。
親トピック: Avroフォーマッタの使用
17.1.1.1 操作メタデータのフォーマットの詳細
Avro行フォーマッタによって生成されるAvroメッセージには、各メッセージの先頭に次の7つのメタデータ・フィールドがあります。
表17-1 Avroフォーマッタのメタデータ
値 | 説明 |
---|---|
|
完全修飾の表。形式: |
|
ソース証跡ファイルのデータベース操作のタイプ。デフォルト値は、挿入を表す |
|
ソース証跡ファイルの操作のタイムスタンプ。このタイムスタンプはソース証跡から取得されるため、固定です。証跡ファイルを再生すると、同じ操作に対して同じタイムスタンプになります。 |
|
フォーマッタが現在の操作レコードを処理した時刻。このタイムスタンプはISO-8601形式に従い、精度はミリ秒までです。証跡ファイルを再生しても、同じ操作に対して同じタイムスタンプにはなりません。 |
|
連結された連番およびソース証跡ファイルのRBA番号。この証跡のポジションにより、操作からソース証跡ファイルをたどることができます。この連番は、ソース証跡ファイルの番号です。RBA番号は、証跡ファイルのオフセットです。 |
|
ソース表の主キーの列名を保持する配列変数。 |
|
ソース証跡ファイルからのトークン・キー値ペアを保持するマップ変数。 |
親トピック: Avro行フォーマッタ
17.1.1.2 操作データのフォーマットの詳細
操作データは操作メタデータの後に続きます。このデータは、列名で識別される個々のフィールドとして表されます。
ソース証跡ファイルからの操作の列値は、列に値がある、列値がnullである、列値がないの3つの状態のいずれかです。Avro属性はこのうちの2つの状態(列に値がある、列値がnullである)のみをサポートします。列値がない状態は、null値と同様に処理されます。Avro行フォーマッタを使用する際には、ソース証跡ファイルのすべての列に対する完全イメージ・データを提供するために、Oracle GoldenGateキャプチャ・プロセスを構成することをお薦めします。
Avro行フォーマッタのデフォルト設定では、ソース証跡ファイルのデータ型を、対応するAvroデータ型にマップします。Avroでサポートされるデータ型は限定的であるため、ソース列はAvroのLONG、DOUBLE、FLOAT、BINARYまたはSTRINGデータ型にマップします。また、すべてのデータを文字列として処理するようにデータ型マッピングを構成することもできます。
親トピック: Avro行フォーマッタ
17.1.1.3 Avro行メッセージの例
Avroメッセージはバイナリなので、人間が読める形式ではありません。次のサンプル・メッセージは、JSON形式のメッセージを示しています。
17.1.1.3.1 挿入メッセージの例
{"table": "GG.TCUSTORD", "op_type": "I", "op_ts": "2013-06-02 22:14:36.000000", "current_ts": "2015-09-18T10:13:11.172000", "pos": "00000000000000001444", "primary_keys": ["CUST_CODE", "ORDER_DATE", "PRODUCT_CODE", "ORDER_ID"], "tokens": {"R": "AADPkvAAEAAEqL2AAA"}, "CUST_CODE": "WILL", "ORDER_DATE": "1994-09-30:15:33:00", "PRODUCT_CODE": "CAR", "ORDER_ID": "144", "PRODUCT_PRICE": 17520.0, "PRODUCT_AMOUNT": 3.0, "TRANSACTION_ID": "100"}
親トピック: Avro行メッセージの例
17.1.1.3.2 更新メッセージの例
{"table": "GG.TCUSTORD", "op_type": "U", "op_ts": "2013-06-02 22:14:41.000000", "current_ts": "2015-09-18T10:13:11.492000", "pos": "00000000000000002891", "primary_keys": ["CUST_CODE", "ORDER_DATE", "PRODUCT_CODE", "ORDER_ID"], "tokens": {"R": "AADPkvAAEAAEqLzAAA"}, "CUST_CODE": "BILL", "ORDER_DATE": "1995-12-31:15:00:00", "PRODUCT_CODE": "CAR", "ORDER_ID": "765", "PRODUCT_PRICE": 14000.0, "PRODUCT_AMOUNT": 3.0, "TRANSACTION_ID": "100"}
親トピック: Avro行メッセージの例
17.1.1.3.3 削除メッセージの例
{"table": "GG.TCUSTORD", "op_type": "D", "op_ts": "2013-06-02 22:14:41.000000", "current_ts": "2015-09-18T10:13:11.512000", "pos": "00000000000000004338", "primary_keys": ["CUST_CODE", "ORDER_DATE", "PRODUCT_CODE", "ORDER_ID"], "tokens": {"L": "206080450", "6": "9.0.80330", "R": "AADPkvAAEAAEqLzAAC"}, "CUST_CODE": "DAVE", "ORDER_DATE": "1993-11-03:07:51:35", "PRODUCT_CODE": "PLANE", "ORDER_ID": "600", "PRODUCT_PRICE": null, "PRODUCT_AMOUNT": null, "TRANSACTION_ID": null}
親トピック: Avro行メッセージの例
17.1.1.3.4 切捨てメッセージの例
{"table": "GG.TCUSTORD", "op_type": "T", "op_ts": "2013-06-02 22:14:41.000000", "current_ts": "2015-09-18T10:13:11.514000", "pos": "00000000000000004515", "primary_keys": ["CUST_CODE", "ORDER_DATE", "PRODUCT_CODE", "ORDER_ID"], "tokens": {"R": "AADPkvAAEAAEqL2AAB"}, "CUST_CODE": null, "ORDER_DATE": null, "PRODUCT_CODE": null, "ORDER_ID": null, "PRODUCT_PRICE": null, "PRODUCT_AMOUNT": null, "TRANSACTION_ID": null}
親トピック: Avro行メッセージの例
17.1.1.4 Avroスキーマ
Avroは、スキーマの表現にJSONを使用します。Avroスキーマは、生成されるAvroメッセージの形式を定義し、Avroメッセージのシリアライズとデシリアライズに必要です。スキーマは、最初に表に対する操作が発生した時点でジャストインタイム方式で生成されます。生成されるAvroスキーマは表定義に固有であるため、処理される操作で発生する表ごとに個別のAvroスキーマが生成されます。デフォルトでは、AvroスキーマはGoldenGate_Home
/dirdef
ディレクトリに書き込まれますが、書き込む場所は設定を変更できます。Avroスキーマのファイル名は、Fully_Qualified_Table_Name
.avsc
という命名規則に従います。
前の項の参照例に示したAvro行フォーマッタのサンプルのAvroスキーマは、次のとおりです。
{ "type" : "record", "name" : "TCUSTORD", "namespace" : "GG", "fields" : [ { "name" : "table", "type" : "string" }, { "name" : "op_type", "type" : "string" }, { "name" : "op_ts", "type" : "string" }, { "name" : "current_ts", "type" : "string" }, { "name" : "pos", "type" : "string" }, { "name" : "primary_keys", "type" : { "type" : "array", "items" : "string" } }, { "name" : "tokens", "type" : { "type" : "map", "values" : "string" }, "default" : { } }, { "name" : "CUST_CODE", "type" : [ "null", "string" ], "default" : null }, { "name" : "ORDER_DATE", "type" : [ "null", "string" ], "default" : null }, { "name" : "PRODUCT_CODE", "type" : [ "null", "string" ], "default" : null }, { "name" : "ORDER_ID", "type" : [ "null", "string" ], "default" : null }, { "name" : "PRODUCT_PRICE", "type" : [ "null", "double" ], "default" : null }, { "name" : "PRODUCT_AMOUNT", "type" : [ "null", "double" ], "default" : null }, { "name" : "TRANSACTION_ID", "type" : [ "null", "string" ], "default" : null } ] }
親トピック: Avro行フォーマッタ
17.1.1.5 Avro行の構成プロパティ
表17-2 Avro行の構成プロパティ
プロパティ | オプション / 必須 | 有効な値 | デフォルト | 説明 |
---|---|---|---|---|
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、挿入操作を示す指標です。 |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、更新操作を示す指標です。 |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、削除操作を示す指標です。 |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、切捨て操作を示す指標です。 |
|
オプション |
Javaでサポートされる任意の有効なエンコーディング名または別名。 |
UTF-8 (JSONのデフォルト) |
生成されるJSON Avroスキーマの出力エンコーディングを制御します。JSONのデフォルトはUTF-8です。Avroメッセージはバイナリで、独自の内部形式でエンコーディングをサポートしています。 |
|
オプション |
|
|
生成されるAvroメッセージの出力の型付けを制御します。falseに設定すると、フォーマッタはOracle GoldenGateの型を、対応するAVROの型にマップしようと試みます。trueに設定すると、すべてのデータは生成されるAvroメッセージとスキーマで文字列として扱われます。 |
|
オプション |
|
|
フォーマッタが、主キーを変更する更新操作をどのように処理するかを指定します。Avro行フォーマッタの主キーを操作する場合は、慎重に検討する必要があります。
|
|
オプション |
任意の文字列 |
値なし |
各Avroメッセージの後に区切り文字を挿入します。これはベスト・プラクティスではありませんが、特定のケースでは、データ・ストリームを解析し、そのストリームから個々のAvroメッセージを抽出することがあります。Avroメッセージには出現しそうにない一意の区切り文字を選択してください。このプロパティは |
|
オプション |
|
|
Avroスキーマは、常に、 |
|
オプション |
|
|
汎用のAvroラッパー・メッセージで、ソース証跡ファイルからの操作に対してAvroメッセージをラップします。詳細は、「汎用のラッパー機能」を参照してください。 |
|
オプション |
有効で存在する人気のファイル・システム・パス。 |
|
生成されるAvroスキーマの出力場所。 |
|
オプション |
Javaでサポートされる任意の有効なエンコーディング名または別名。 |
|
スキーマが出力されるHDFS内のディレクトリ。メタデータ変更により、関連付けられた表の次の操作中にスキーマが上書きされます。スキーマは、ローカル・ファイル・システム |
|
オプション |
|
|
現在のタイムスタンプの形式。デフォルトはISO 8601形式です。false に設定すると、現在のタイムスタンプの日付と時刻の間のT が削除され、かわりにスペースが出力されます。
|
|
オプション |
|
|
各ソース・フィールドに{column_name}_isMissing ブール・フィールドを含めるには、true に設定します。このフィールドを使用すると、null値がソース証跡ファイルでnullである(値はfalse )か、ソース証跡ファイルにない(値はtrue )かを、ダウンストリーム・アプリケーションが区別できるようになります。
|
|
オプション |
|
|
Avro |
|
オプション |
0から38までの任意の整数値。 |
なし |
Avro |
|
オプション |
|
|
ソースの |
親トピック: Avro行フォーマッタ
17.1.1.6 サンプル構成の確認
Javaアダプタ・プロパティ・ファイルのAvro行フォーマッタのサンプル構成を次に示します。
gg.handler.hdfs.format=avro_row gg.handler.hdfs.format.insertOpKey=I gg.handler.hdfs.format.updateOpKey=U gg.handler.hdfs.format.deleteOpKey=D gg.handler.hdfs.format.truncateOpKey=T gg.handler.hdfs.format.encoding=UTF-8 gg.handler.hdfs.format.pkUpdateHandling=abend gg.handler.hafs.format.wrapMessageInGenericAvroMessage=false
親トピック: Avro行フォーマッタ
17.1.1.7 メタデータ変更イベント
複製されるデータベースとアップストリームのOracle GoldenGateレプリケーション・プロセスでメタデータ変更イベントを伝播できる場合、メタデータが変更されたときにAvro行フォーマッタはアクションを実行できます。Avroメッセージは対応するスキーマに緊密に依存しているため、Avroフォーマットを使用する場合、メタデータの変更は重要です。
メタデータ変更イベント後に表操作が発生するとすぐに更新されたAvroスキーマが生成されます。メタデータ変更イベントの影響を理解して、ダウンストリーム・ターゲットを新しいAvroスキーマに変更する必要があります。AvroメッセージがAvroスキーマに密に依存している場合、互換性の問題が生じることがあります。スキーマ変更の前に生成されるAvroメッセージを、新たに生成されたAvroスキーマでデシリアライズすることはできません。
逆に、スキーマ変更の後で生成されるAvroメッセージを、前に生成されたAvroスキーマでデシリアライズすることもできません。ベスト・プラクティスとして、メッセージの生成に使用されたのと同じバージョンのAvroスキーマを使用するようにしてください。詳細は、Apache Avroのドキュメントを参照してください。
親トピック: Avro行フォーマッタ
17.1.1.8 特別な考慮事項
この項では、次の特別な考慮事項について説明します。
親トピック: Avro行フォーマッタ
17.1.1.8.1 トラブルシューティング
Avroはバイナリ形式なので、人間が読める形式ではありません。Avroメッセージはバイナリ形式なので、問題が発生した場合にデバッグが容易ではないため、Avro行フォーマッタでは問題のデバッグに役立つ特別な機能が用意されています。log4j
Javaロギング・レベルをTRACE
に設定すると、Avroメッセージがデシリアライズされ、ログ・ファイルにJSONオブジェクトとして表示されるため、作成されたAvroメッセージの構造および内容を確認できます。TRACE
は、パフォーマンスに大きくマイナスの影響を及ぼすため、本番環境では有効にしないでください。内容をトラブルシューティングするために、人間が読める内容を生成するフォーマッタの使用を検討することが必要な場合があります。XMLまたはJSONフォーマッタはどちらも人間が読める形式で内容を生成します。
親トピック: 特別な考慮事項
17.1.1.8.2 主キーの更新
ビッグ・データ統合での主キーの更新操作には、特別な考慮と計画が必要です。主キーの更新では、ソース・データベース内の特定の行の1つ以上の主キーを変更します。データはビッグ・データ・アプリケーションに追加されるため、主キーの更新操作は、特別な処理がない更新というより新しい挿入に似ています。次のプロパティを使用して、主キーを処理するようにAvro行フォーマッタを構成できます。
表17-3 構成可能な動作
値 | 説明 |
---|---|
|
フォーマッタが終了します。この動作はデフォルトの動作です。 |
|
この構成では、主キーの更新が他の更新操作と同じように処理されます。この構成を使用するのは、主キーがビッグ・データ・システムの行データの選択基準として使用されていないことを保証できる場合のみです。 |
|
主キーの更新は、操作前イメージのデータを使用する削除と、操作後イメージのデータを使用する挿入という特殊なケースとして処理されます。この構成は、ビッグ・データ・アプリケーションで主キー更新の影響をより正確にモデル化する場合があります。ただし、この構成を選択する場合は、ソース・データベースでのレプリケーションで完全なサプリメンタル・ロギングを有効にすることが重要です。完全なサプリメンタル・ロギングを有効にしない場合、削除操作は正常に処理されますが、挿入操作では、ビッグ・データ・アプリケーションで行データの完全な形式のすべての列のデータがすべては含まれません。 |
親トピック: 特別な考慮事項
17.1.1.8.3 汎用のラッパー機能
Avroメッセージは自己記述型ではないため、メッセージの受信者は、メッセージに対応するスキーマのことを知っていないと、メッセージをデシリアライズできません。Avroメッセージはバイナリであり、メッセージの内容を調べてメッセージ・タイプを確定する一貫した、または信頼できる方法はありません。したがって、Kafkaのような1つのデータ・ストリームにメッセージをインタレースするときに、Avroは厄介です。
Avroフォーマッタには、汎用のAvroメッセージでAvroメッセージをラップする特別な機能があります。この機能を有効にするには、次の構成プロパティを設定します。
gg.handler.name.format.wrapMessageInGenericAvroMessage=true
汎用のメッセージとは、出力されるAvroメッセージすべてに共通するAvroペイロード・メッセージをラップするAvroメッセージです。汎用メッセージのスキーマは、generic_wrapper.avsc
という名前で、出力スキーマ・ディレクトリに書き込まれます。このメッセージには、次の3つのフィールドがあります。
-
table_name
:完全修飾のソース表名。 -
schema_fingerprint
: ラップされたメッセージのAvroスキーマのフィンガープリント。フィンガープリントは、AvroSchemaNormalization.parsingFingerprint64(schema)
コールを使用して生成されます。 -
payload
: ラップされるAvroメッセージ。
Avroフォーマッタの汎用ラッパー・スキーマは、次のとおりです。
{ "type" : "record", "name" : "generic_wrapper", "namespace" : "oracle.goldengate", "fields" : [ { "name" : "table_name", "type" : "string" }, { "name" : "schema_fingerprint", "type" : "long" }, { "name" : "payload", "type" : "bytes" } ] }
親トピック: 特別な考慮事項
17.1.2 Avro操作フォーマッタ
Avro操作フォーマッタは、ソース証跡ファイルの操作データを、Avroバイナリ配列形式のメッセージにフォーマットします。挿入、更新、削除および切捨ての各操作は、個々のAvroメッセージとしてフォーマットされます。ソース証跡ファイルには、操作データの操作前と操作後のイメージが含まれます。Avro操作フォーマッタは、このデータをAvroバイナリ形式の操作データにフォーマットします。
この形式は、Avroメッセージが行データをモデル化するAvro行フォーマッタの出力より詳細です。
この項の内容は次のとおりです。
- 操作メタデータのフォーマットの詳細
- 操作データのフォーマットの詳細
- Avro操作メッセージの例
- Avroスキーマ
- Avro操作フォーマッタの構成プロパティ
- サンプル構成の確認
- メタデータ変更イベント
- 特別な考慮事項
親トピック: Avroフォーマッタの使用
17.1.2.1 操作メタデータのフォーマットの詳細
Avro操作フォーマッタによって生成されるAvroメッセージには、各Avroメッセージの先頭に次のメタデータ・フィールドがあります。
表17-4 Avroメッセージとそのメタデータ
フィールド | 説明 |
---|---|
|
完全修飾の表名。形式は次のとおりです。
|
|
ソース証跡ファイルのデータベース操作のタイプ。デフォルト値は、挿入を表す |
|
ソース証跡ファイルの操作のタイムスタンプ。このタイムスタンプはソース証跡から取得されるため、固定です。証跡ファイルを再生すると、同じ操作に対して同じタイムスタンプになります。 |
|
フォーマッタが現在の操作レコードを処理した時刻。このタイムスタンプはISO-8601形式に従い、精度はミリ秒までです。証跡ファイルを再生しても、同じ操作に対して同じタイムスタンプにはなりません。 |
|
連結された連番およびソース証跡ファイルのRBA番号。証跡のポジションは、操作からソース証跡ファイルをたどるトレーサビリティ情報になります。この連番は、ソース証跡ファイルの番号です。RBA番号は、証跡ファイルのオフセットです。 |
|
ソース表の主キーの列名を保持する配列変数。 |
|
ソース証跡ファイルからのトークン・キー値ペアを保持するマップ変数。 |
親トピック: Avro操作フォーマッタ
17.1.2.2 操作データのフォーマットの詳細
この操作データは、列名で識別される個々のフィールドとして表されます。
ソース証跡ファイルからの操作の列値は、列に値がある、列値がnullである、列値がないの3つの状態のいずれかです。Avro属性はこのうちの2つの状態(列に値がある、列値がnullである)のみをサポートします。Avro操作フォーマッタには、列値が欠落しているかどうかを示すために、列ごとに追加のブール・フィールドCOLUMN_NAME
_isMissing
があります。COLUMN_NAME
フィールドをCOLUMN_NAME
_isMissing
フィールドとともに使用すると、3つすべての状態を定義できます。
-
状態1: 列に値がある
COLUMN_NAME
フィールドに値があるCOLUMN_NAME
_isMissing
フィールドがfalse -
状態2: 列値がnullである
COLUMN_NAME
フィールドの値がnullCOLUMN_NAME
_isMissing
フィールドがfalse -
状態3: 列値がない
COLUMN_NAME
フィールドの値がnullCOLUMN_NAME
_isMissing
フィールドがtrue
デフォルトでは、Avro行フォーマッタは、ソース証跡ファイルのデータ型を、対応するAvroデータ型にマップします。Avroでサポートされるデータ型は少ないため、この機能は通常、ソース証跡ファイルの数値フィールドを、数値として型付けされるメンバーにマップします。また、このデータ型マッピングを、すべてのデータを文字列として処理するように構成することもできます。
親トピック: Avro操作フォーマッタ
17.1.2.3 Avro操作メッセージの例
Avroメッセージはバイナリなので、人間が読める形式ではありません。次の各トピックでは、JSON形式のAvroメッセージの例を示しています。
17.1.2.3.1 挿入メッセージの例
{"table": "GG.TCUSTORD", "op_type": "I", "op_ts": "2013-06-02 22:14:36.000000", "current_ts": "2015-09-18T10:17:49.570000", "pos": "00000000000000001444", "primary_keys": ["CUST_CODE", "ORDER_DATE", "PRODUCT_CODE", "ORDER_ID"], "tokens": {"R": "AADPkvAAEAAEqL2AAA"}, "before": null, "after": { "CUST_CODE": "WILL", "CUST_CODE_isMissing": false, "ORDER_DATE": "1994-09-30:15:33:00", "ORDER_DATE_isMissing": false, "PRODUCT_CODE": "CAR", "PRODUCT_CODE_isMissing": false, "ORDER_ID": "144", "ORDER_ID_isMissing": false, "PRODUCT_PRICE": 17520.0, "PRODUCT_PRICE_isMissing": false, "PRODUCT_AMOUNT": 3.0, "PRODUCT_AMOUNT_isMissing": false, "TRANSACTION_ID": "100", "TRANSACTION_ID_isMissing": false}}
親トピック: Avro操作メッセージの例
17.1.2.3.2 更新メッセージの例
{"table": "GG.TCUSTORD", "op_type": "U", "op_ts": "2013-06-02 22:14:41.000000", "current_ts": "2015-09-18T10:17:49.880000", "pos": "00000000000000002891", "primary_keys": ["CUST_CODE", "ORDER_DATE", "PRODUCT_CODE", "ORDER_ID"], "tokens": {"R": "AADPkvAAEAAEqLzAAA"}, "before": { "CUST_CODE": "BILL", "CUST_CODE_isMissing": false, "ORDER_DATE": "1995-12-31:15:00:00", "ORDER_DATE_isMissing": false, "PRODUCT_CODE": "CAR", "PRODUCT_CODE_isMissing": false, "ORDER_ID": "765", "ORDER_ID_isMissing": false, "PRODUCT_PRICE": 15000.0, "PRODUCT_PRICE_isMissing": false, "PRODUCT_AMOUNT": 3.0, "PRODUCT_AMOUNT_isMissing": false, "TRANSACTION_ID": "100", "TRANSACTION_ID_isMissing": false}, "after": { "CUST_CODE": "BILL", "CUST_CODE_isMissing": false, "ORDER_DATE": "1995-12-31:15:00:00", "ORDER_DATE_isMissing": false, "PRODUCT_CODE": "CAR", "PRODUCT_CODE_isMissing": false, "ORDER_ID": "765", "ORDER_ID_isMissing": false, "PRODUCT_PRICE": 14000.0, "PRODUCT_PRICE_isMissing": false, "PRODUCT_AMOUNT": 3.0, "PRODUCT_AMOUNT_isMissing": false, "TRANSACTION_ID": "100", "TRANSACTION_ID_isMissing": false}}
親トピック: Avro操作メッセージの例
17.1.2.3.3 削除メッセージの例
{"table": "GG.TCUSTORD", "op_type": "D", "op_ts": "2013-06-02 22:14:41.000000", "current_ts": "2015-09-18T10:17:49.899000", "pos": "00000000000000004338", "primary_keys": ["CUST_CODE", "ORDER_DATE", "PRODUCT_CODE", "ORDER_ID"], "tokens": {"L": "206080450", "6": "9.0.80330", "R": "AADPkvAAEAAEqLzAAC"}, "before": { "CUST_CODE": "DAVE", "CUST_CODE_isMissing": false, "ORDER_DATE": "1993-11-03:07:51:35", "ORDER_DATE_isMissing": false, "PRODUCT_CODE": "PLANE", "PRODUCT_CODE_isMissing": false, "ORDER_ID": "600", "ORDER_ID_isMissing": false, "PRODUCT_PRICE": null, "PRODUCT_PRICE_isMissing": true, "PRODUCT_AMOUNT": null, "PRODUCT_AMOUNT_isMissing": true, "TRANSACTION_ID": null, "TRANSACTION_ID_isMissing": true}, "after": null}
親トピック: Avro操作メッセージの例
17.1.2.3.4 切捨てメッセージの例
{"table": "GG.TCUSTORD", "op_type": "T", "op_ts": "2013-06-02 22:14:41.000000", "current_ts": "2015-09-18T10:17:49.900000", "pos": "00000000000000004515", "primary_keys": ["CUST_CODE", "ORDER_DATE", "PRODUCT_CODE", "ORDER_ID"], "tokens": {"R": "AADPkvAAEAAEqL2AAB"}, "before": null, "after": null}
親トピック: Avro操作メッセージの例
17.1.2.4 Avroスキーマ
AvroスキーマはJSONとして表されます。Avroスキーマは、生成されるAvroメッセージの形式を定義し、Avroメッセージのシリアライズとデシリアライズに必要です。Avroスキーマは、最初に表に対する操作が発生した時点でジャストインタイム方式で生成されます。Avroスキーマは表定義に固有であるため、処理される操作で発生する表ごとに個別のAvroスキーマが生成されます。デフォルトでは、AvroスキーマはGoldenGate_Home
/dirdef
ディレクトリに書き込まれますが、書き込む場所は設定を変更できます。Avroスキーマのファイル名は、Fully_Qualified_Table_Name.avsc
という命名規則に従います。
前の項のサンプルに示したAvro操作フォーマッタのAvroスキーマのサンプルは、次のとおりです。
{ "type" : "record", "name" : "TCUSTORD", "namespace" : "GG", "fields" : [ { "name" : "table", "type" : "string" }, { "name" : "op_type", "type" : "string" }, { "name" : "op_ts", "type" : "string" }, { "name" : "current_ts", "type" : "string" }, { "name" : "pos", "type" : "string" }, { "name" : "primary_keys", "type" : { "type" : "array", "items" : "string" } }, { "name" : "tokens", "type" : { "type" : "map", "values" : "string" }, "default" : { } }, { "name" : "before", "type" : [ "null", { "type" : "record", "name" : "columns", "fields" : [ { "name" : "CUST_CODE", "type" : [ "null", "string" ], "default" : null }, { "name" : "CUST_CODE_isMissing", "type" : "boolean" }, { "name" : "ORDER_DATE", "type" : [ "null", "string" ], "default" : null }, { "name" : "ORDER_DATE_isMissing", "type" : "boolean" }, { "name" : "PRODUCT_CODE", "type" : [ "null", "string" ], "default" : null }, { "name" : "PRODUCT_CODE_isMissing", "type" : "boolean" }, { "name" : "ORDER_ID", "type" : [ "null", "string" ], "default" : null }, { "name" : "ORDER_ID_isMissing", "type" : "boolean" }, { "name" : "PRODUCT_PRICE", "type" : [ "null", "double" ], "default" : null }, { "name" : "PRODUCT_PRICE_isMissing", "type" : "boolean" }, { "name" : "PRODUCT_AMOUNT", "type" : [ "null", "double" ], "default" : null }, { "name" : "PRODUCT_AMOUNT_isMissing", "type" : "boolean" }, { "name" : "TRANSACTION_ID", "type" : [ "null", "string" ], "default" : null }, { "name" : "TRANSACTION_ID_isMissing", "type" : "boolean" } ] } ], "default" : null }, { "name" : "after", "type" : [ "null", "columns" ], "default" : null } ] }
親トピック: Avro操作フォーマッタ
17.1.2.5 Avro操作フォーマッタの構成プロパティ
表17-5 構成プロパティ
プロパティ | オプションY/N | 有効な値 | デフォルト | 説明 |
---|---|---|---|---|
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、挿入操作を示す指標です |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、更新操作を示す指標です。 |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、削除操作を示す指標です。 |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、切捨て操作を示す指標です。 |
|
オプション |
Javaでサポートされる任意の有効なエンコーディング名または別名 |
UTF-8 (JSONのデフォルト) |
生成されるJSON Avroスキーマの出力エンコーディングを制御します。JSONのデフォルトはUTF-8です。Avroメッセージはバイナリで、独自の内部形式でエンコーディングをサポートしています。 |
|
オプション |
|
|
生成されるAvroメッセージの出力の型付けを制御します。 |
|
オプション |
任意の文字列 |
値なし |
各Avroメッセージの後に区切り文字を挿入します。これはベスト・プラクティスではありませんが、特定のケースでは、データ・ストリームを解析し、そのストリームから個々のAvroメッセージを抽出するために、このプロパティが役立つことがあります。Avroメッセージには出現しそうにない一意の区切り文字を選択してください。このプロパティは |
|
オプション |
有効で存在する人気のファイル・システム・パス。 |
|
生成されるAvroスキーマの出力場所。 |
|
オプション |
|
|
汎用のAvroラッパー・メッセージで、ソース証跡ファイルからの操作に対してAvroメッセージをラップします。詳細は、「汎用のラッパー機能」を参照してください。 |
|
オプション |
|
|
現在のタイムスタンプの形式。デフォルトでは、ISO 8601をfalse に設定すると、現在のタイムスタンプの日付と時刻の間のT が削除され、かわりにスペースが出力されます。
|
|
オプション |
|
|
各ソース・フィールドに |
|
オプション |
0から38までの任意の整数値。 |
なし |
Avro |
|
オプション |
|
|
ソースの |
|
オプション |
|
|
Avro |
親トピック: Avro操作フォーマッタ
17.1.2.6 サンプル構成の確認
Javaアダプタproperg.handlerties
ファイルのAvro操作フォーマッタのサンプル構成を次に示します。
gg.hdfs.format=avro_op gg.handler.hdfs.format.insertOpKey=I gg.handler.hdfs.format.updateOpKey=U gg.handler.hdfs.format.deleteOpKey=D gg.handler.hdfs.format.truncateOpKey=T gg.handler.hdfs.format.encoding=UTF-8 gg.handler.hdfs.format.wrapMessageInGenericAvroMessage=false
親トピック: Avro操作フォーマッタ
17.1.2.7 メタデータ変更イベント
複製されるデータベースとアップストリームのOracle GoldenGateレプリケーション・プロセスでメタデータ変更イベントを伝播できる場合、メタデータが変更されたときにAvro操作フォーマッタはアクションを実行できます。Avroメッセージは対応するスキーマに緊密に依存しているため、Avroフォーマットを使用する場合、メタデータの変更は重要です。
メタデータ変更イベント後に表操作が発生するとすぐに更新されたAvroスキーマが生成されます。
メタデータ変更イベントの影響を理解して、ダウンストリーム・ターゲットを新しいAvroスキーマに変更する必要があります。AvroメッセージがAvroスキーマに密に依存している場合、互換性の問題が生じることがあります。スキーマ変更の前に生成されるAvroメッセージを、新たに生成されたAvroスキーマでデシリアライズすることはできません。逆に、スキーマ変更の後で生成されるAvroメッセージを、前に生成されたAvroスキーマでデシリアライズすることもできません。ベスト・プラクティスとして、メッセージの生成に使用されたのと同じバージョンのAvroスキーマを使用するようにしてください
詳細は、Apache Avroのドキュメントを参照してください。
親トピック: Avro操作フォーマッタ
17.1.2.8 特別な考慮事項
この項では、次の特別な考慮事項について説明します。
17.1.2.8.1 トラブルシューティング
Avroはバイナリ形式なので、人間が読める形式ではありません。ただし、log4j
Javaロギング・レベルをTRACE
に設定すると、Avroメッセージがデシリアライズされ、ログ・ファイルにJSONオブジェクトとして表示されるため、作成されたAvroメッセージの構造および内容を確認できます。TRACE
は、パフォーマンスに大きい影響を及ぼすため、本番環境では有効にしないでください。
親トピック: 特別な考慮事項
17.1.2.8.2 主キーの更新
Avro操作フォーマッタは、更新操作の操作前イメージと操作後イメージの完全なデータを使用してメッセージを作成します。したがって、Avro操作フォーマッタでは、主キーの更新について特別な処理は必要ありません。
親トピック: 特別な考慮事項
17.1.2.8.3 汎用のラッパー・メッセージ
Avroメッセージは自己記述型ではないため、メッセージの受信者は、メッセージに対応するスキーマのことを知っていないと、メッセージをデシリアライズできません。Avroメッセージはバイナリであり、メッセージの内容を調べてメッセージ・タイプを確定する一貫した、または信頼できる方法はありません。したがって、Kafkaのような1つのデータ・ストリームにメッセージをインタレースするときに、Avroは厄介です。
Avroフォーマッタには、汎用のAvroメッセージでAvroメッセージをラップする特別な機能があります。この機能を有効にするには、次の構成プロパティを設定します。
gg.handler.name.format.wrapMessageInGenericAvroMessage=true
汎用のメッセージとは、出力されるAvroメッセージすべてに共通するAvroペイロード・メッセージをラップするAvroメッセージです。汎用メッセージのスキーマは、generic_wrapper.avsc
という名前で、出力スキーマ・ディレクトリに書き込まれます。このメッセージには、次の3つのフィールドがあります。
-
table_name
: 完全修飾のソース表名。 -
schema_fingerprint
: メッセージを生成するAvroスキーマのフィンガープリント。フィンガープリントは、org.apache.avro.SchemaNormalization
クラスのparsingFingerprint64(Schema s)
メソッドを使用して生成されます。 -
payload
: ラップされるAvroメッセージ。
Avroフォーマッタの汎用ラッパー・スキーマは、次のとおりです。
{ "type" : "record", "name" : "generic_wrapper", "namespace" : "oracle.goldengate", "fields" : [ { "name" : "table_name", "type" : "string" }, { "name" : "schema_fingerprint", "type" : "long" }, { "name" : "payload", "type" : "bytes" } ] }
親トピック: 特別な考慮事項
17.1.3 Avroオブジェクト・コンテナ・ファイル・フォーマッタ
Oracle GoldenGate for Big Dataは、Avroオブジェクト・コンテナ・ファイル(OCF)形式でHDFSに書き込むことができます。Avro OCFは、スキーマ展開を他の形式よりも効率的に処理します。また、Avro OCFフォーマッタでは圧縮および圧縮解除もサポートされ、ディスク領域をより効率的に使用できます。
HDFSハンドラはAvroフォーマッタと統合されており、Avro OCF形式でHDFSにファイルを書き込みます。Avro OCF形式は、HiveではHDFSでAvroデータを読み取るために必要です。Avro OCF形式の詳細は、Avro仕様に記載されています。http://avro.apache.org/docs/current/spec.html#Object+Container+Filesを参照してください。
データをAvro OCF形式でストリーミングし、Hiveで表定義を生成し、メタデータ変更イベントが発生した場合はHiveで表定義を更新するようHDFSハンドラを構成できます。
17.1.3.1 Avro OCFフォーマッタの構成プロパティ
プロパティ | オプション / 必須 | 有効な値 | デフォルト | 説明 |
---|---|---|---|---|
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、挿入操作を示す指標です。 |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、更新操作を示す指標です。 |
|
オプション |
任意の文字列 |
|
出力レコードに切り捨てられ、切捨て操作を示す指標です。 |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、切捨て操作を示す指標です。 |
|
オプション |
Javaでサポートされる任意の有効なエンコーディング名または別名。 |
|
生成されるJSON Avroスキーマの出力エンコーディングを制御します。JSONのデフォルトはUTF-8です。Avroメッセージはバイナリで、独自の内部形式でエンコーディングをサポートしています。 |
|
オプション |
|
|
生成されるAvroメッセージの出力の型付けを制御します。 |
|
オプション |
|
|
フォーマッタが、主キーを変更する更新操作をどのように処理するかを制御します。主キーを操作するとAvro行フォーマッタで問題が起きることがあるので、ユーザーは特に慎重を期する必要があります。
|
|
オプション |
|
|
Avroのシリアライズのためにスキーマを生成する必要があるため、 |
|
オプション |
有効で存在する人気のファイル・システム・パス |
|
生成されたAvroスキーマが保存されるローカル・ファイル・システムのディレクトリ。このプロパティは、Avroスキーマが書き込まれるHDFSの場所を制御しません。この場所はHDFSハンドラ・プロパティで制御されます。 |
|
オプション |
|
|
デフォルトでは、このプロパティの値はtrueで、現在のタイムスタンプの形式はISO8601です。 |
|
オプション |
|
|
|
親トピック: Avroオブジェクト・コンテナ・ファイル・フォーマッタ
17.1.4 メタ列出力の設定
メタ列出力を制御するすべてのAvroフォーマッタのメタ列テンプレート・プロパティの構成可能な値は次のとおりです。
表17-6 メタ列テンプレート・プロパティ
プロパティ | 必須/オプション | 有効な値 | デフォルト | 説明 |
---|---|---|---|---|
gg.handler.name.format.metaColumnsTemplate |
オプション |
トランザクション・インジケータの
静的値の場合は| ${static} 。静的値を伝播します。したがって、${static.MYVALUE} はMYVALUE を生成フィールドに伝播します。
|
なし |
現在のメタ列情報を簡単な方法で構成でき、使用する明示的な必要性が排除されます。 insertOpKey | updateOpKey | deleteOpKey | truncateOpKey | includeTableName | includeOpTimestamp | includeOpType | includePosition | includeCurrentTimestamp, useIso8601Format これは、テンプレートを表す1つ以上のテンプレート化された値で構成されているカンマ区切りの文字列です。 |
メタ列のキーワードの説明
-
${keyword[fieldName].argument}
-
キーワードは、メタ列構文に基づいて固定されます。オプションで、大カッコの間にフィールド名を指定できます。フィールド名を指定しない場合は、デフォルトのフィールド名が使用されます。
メタ列の値を解決するには、引数が必要です。
-
${alltokens}
-
すべてのOracle GoldenGateトークン。
-
${token}
-
特定のOracle GoldenGateトークンの値。トークン・キーは、ピリオド(
.
)演算子を使用してトークンの後に続ける必要があります。次に例を示します。${token.MYTOKEN}
-
${sys}
-
システム環境変数。変数名は、ピリオド(
.
)演算子を使用してsys
の後に続ける必要があります。次に例を示します。${sys.MYVAR}
-
${env}
-
Oracle GoldenGate環境変数。変数名は、ピリオド(
.
)演算子を使用してenv
の後に続ける必要があります。次に例を示します。${env.someVariable}
-
${javaprop}
-
Java JVM変数。変数名は、ピリオド(
.
)演算子を使用してjavaprop
の後に続ける必要があります。次に例を示します。${javaprop.MYVAR}
-
${optype}
-
操作タイプ。
-
${position}
-
レコードの位置。
-
${timestamp}
-
レコードのタイムスタンプ。
-
${catalog}
-
カタログ名。
-
${schema}
-
スキーマ名。
-
${table}
-
表名。
-
${objectname}
-
完全修飾の表名。
-
${csn}
-
ソースのコミット順序番号
-
${xid}
-
ソース・トランザクションID。
-
${currenttimestamp}
-
現在のタイムスタンプ。
-
${opseqno}
-
トランザクション内のレコード順序番号。
-
${timestampmicro}
-
レコードのタイムスタンプ(マイクロ秒/エポック後)。
-
${currenttimestampmicro}
-
現在のタイムスタンプ(マイクロ秒/エポック後)。
-
${txind}
-
ソース証跡ファイルのトランザクション・インジケータです。トランザクションの値は、最初の操作の場合は
B
、中間の操作の場合はM
、最後の操作の場合はE
、操作1つのみの場合はW
です。フィルタリング操作または調整適用を使用すると、このフィールドの有用性が無効になります。 -
${static}
-
静的値を含むフィールドを出力に挿入する場合に使用します。必要な値は引数です。必要な値が
abc
である場合の構文は、${static.abc}
または${static[FieldName].abc}
です。
親トピック: Avroフォーマッタの使用
17.2 区切りテキスト・フォーマッタの使用
区切りテキスト・フォーマッタは、行ベースのフォーマッタの一種です。ソース証跡ファイルから、データベース操作の内容を、区切りテキスト出力としてフォーマットします。ソース証跡からの挿入、更新、削除または切捨ての各操作は、区切られた個々のメッセージとしてフォーマットされます。区切りテキスト出力は、各表に対して固定数のフィールドがあり、フィールド区切り文字によって区切られ、最後が行区切り文字になります。フィールドは、位置が関係します。Hiveを含め、ビッグ・データ分析ツールの多くは、区切りテキストを含むHDFSファイルと適切に機能します。
ソース証跡ファイルからの操作の列値は、列に値がある、列値がnullである、列値がないの3つの状態のいずれかです。デフォルトでは、区切りテキストはこれらの列値状態を区切りテキスト出力に次のようにマップします。
-
列値がある: 列値が出力されます。
-
列値がnullである: デフォルトの出力値は
NULL
です。列値がnullの場合の出力は、設定を変更できます。 -
列値がない: デフォルトの出力値は空の文字列("")です。列値がない場合の出力は、設定を変更できます。
トピック:
- メッセージのフォーマットの詳細
- フォーマットしたメッセージの例
- 出力形式サマリーのログ
- 区切りテキスト・フォーマッタの構成プロパティ
- サンプル構成の確認
- メタデータ変更イベント
- メタ列出力の設定
- その他の考慮事項
親トピック: プラガブル・フォーマッタの使用
17.2.1 メッセージのフォーマットの詳細
デフォルトの出力形式は、区切り文字としてセミコロンを使用し、次のようになります。
最初は行のメタデータです。
operation_type;fully_qualified_table_name;operation_timestamp;current_timestamp;trail_position;tokens;
次が行データです。
column_1_value;column_n_value_then_line_delimeter
オプションで、列名を各列値の前に含めることができ、行データの出力形式が変更されます。
column_1_name;column_1_value;column_n_name;column_n_value_then_line_delimeter
フォーマットの詳細:
-
操作タイプ : ソース証跡ファイルのデータベース操作のタイプを示します。デフォルト値は挿入を表す
I
、更新を表すU
、削除を表すD
、切捨てを表すT
です。このフィールドの出力は、抑止できます。 -
完全修飾の表名: 完全修飾の表名はソース・データベース表で、カタログ名とスキーマ名が含まれます。完全修飾の表名の形式は、
catalog_name.schema_name.table_name
です。このフィールドの出力は抑止できます。 -
操作のタイムスタンプ : ソース・システムのコミット・レコードのタイムスタンプ。トランザクション(バッチ処理以外のトランザクション)のすべての操作は、操作タイムスタンプが同じになります。このタイムスタンプは固定で、証跡ファイルを再生する場合、操作のタイムスタンプは同じです。このフィールドの出力は抑止できます。
-
現在のタイムスタンプ : 区切りテキスト・フォーマッタが現在の操作レコードを処理した現在時刻のタイムスタンプ。このタイムスタンプはISO-8601形式に従い、精度はミリ秒までです。証跡ファイルを再生しても、同じ操作に対して同じタイムスタンプにはなりません。このフィールドの出力は抑止できます。
-
証跡のポジション: 連結された連番およびソース証跡ファイルのRBA番号。証跡のポジションにより、操作からソース証跡ファイルをたどることができます。この連番は、ソース証跡ファイルの番号です。RBA番号は、証跡ファイルのオフセットです。このフィールドの出力は抑止できます。
-
トークン : ソース証跡ファイルのトークン・キー値ペア。対応するハンドラの
includeTokens
構成プロパティが明示的にtrue
に設定されていない場合、区切りテキスト出力のこのフィールドの出力は表示されません。
親トピック: 区切りテキスト・フォーマッタの使用
17.2.2 フォーマットしたメッセージの例
次の各項では、区切りテキスト・フォーマッタのサンプル・メッセージを示します。メッセージを明確に表示するために、デフォルトのフィールド区切り文字がパイプ文字(|
)に変更されています。
17.2.2.1 挿入メッセージの例
I|GG.TCUSTORD|2013-06-02 22:14:36.000000|2015-09-18T13:23:01.612001|00000000000000001444|R=AADPkvAAEAAEqL2A AA|WILL|1994-09-30:15:33:00|CAR|144|17520.00|3|100
親トピック: フォーマットしたメッセージの例
17.2.2.2 更新メッセージの例
U|GG.TCUSTORD|2013-06-02 22:14:41.000000|2015-09-18T13:23:01.987000|00000000000000002891|R=AADPkvAAEAAEqLzA AA|BILL|1995-12-31:15:00:00|CAR|765|14000.00|3|100
親トピック: フォーマットしたメッセージの例
17.2.2.3 削除メッセージの例
D|GG.TCUSTORD|2013-06-02 22:14:41.000000|2015-09-18T13:23:02.000000|00000000000000004338|L=206080450,6=9.0. 80330,R=AADPkvAAEAAEqLzAAC|DAVE|1993-11-03:07:51:35|PLANE|600|||
親トピック: フォーマットしたメッセージの例
17.2.2.4 切捨てメッセージの例
T|GG.TCUSTORD|2013-06-02 22:14:41.000000|2015-09-18T13:23:02.001000|00000000000000004515|R=AADPkvAAEAAEqL2A AB|||||||
親トピック: フォーマットしたメッセージの例
17.2.3 出力形式サマリーのログ
INFO
レベルのロギングが有効になっている場合、Java log4j
のロギングでは、区切りテキスト出力形式のサマリーが記録されます。区切りフィールドのサマリーは、確認されたソース表ごとに記録され、その表に対する最初の操作が区切りテキスト・フォーマッタによって受け取られたときに発生します。区切りテキスト出力のフィールドに関するこうした詳細な説明は、初期設定を実行するときに役立つ場合があります。メタデータ変更イベントが発生した場合、区切りフィールドのサマリーが再生成され、その表に対する最初の後続操作で再度記録されます。
親トピック: 区切りテキスト・フォーマッタの使用
17.2.4 区切りテキスト・フォーマッタの構成プロパティ
表17-7 区切りテキスト・フォーマッタの構成プロパティ
プロパティ | オプション / 必須 | 有効な値 | デフォルト | 説明 |
---|---|---|---|---|
|
オプション |
|
|
列値に先行する区切りフィールドとして列名を書き込む出力を制御します。trueの場合、出力は次のようになります。
falseの場合、出力は次のようになります。
|
|
オプション |
|
|
値が |
|
オプション |
|
|
値が |
|
オプション |
|
|
値が |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、挿入操作を示す指標です。 |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、更新操作を示す指標です。 |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、削除操作を示す指標です。 |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、切捨て操作を示す指標です。 |
|
オプション |
Javaでサポートされる任意のエンコーディング名または別名。 |
Oracle GoldenGateプロセスをホストしているマシンのネイティブのシステム・エンコーディング。 |
出力される区切りテキストのエンコーディングを決定します。 |
|
オプション |
任意の文字列 |
|
区切りフィールド間に使用される区切り文字。この値は |
|
オプション |
任意の文字列 |
改行 (デフォルトのHive区切り文字) |
レコード間で使用される区切り文字。この値は |
|
オプション |
|
|
|
|
オプション |
任意の文字列 |
|
マップにおけるキーと値の間の区切り文字を指定します。Key1=value1。トークンはマップされた値です。構成値は |
|
オプション |
任意の文字列 |
|
マップにおけるキー値ペアの間の区切り文字を指定します。 |
|
オプション |
|
|
フォーマッタが、主キーを変更する更新操作をどのように処理するかを指定します。主キーを操作するとテキスト・フォーマッタで問題が起きることがあるので、ユーザーは特に慎重を期する必要があります。
|
|
オプション |
任意の文字列 |
NULL |
NULL値の場合に区切り出力に含まれる内容を指定します。構成値は |
|
オプション |
任意の文字列 |
|
値がない場合に区切りテキスト出力に含まれる内容を指定します。構成値は |
|
オプション |
|
|
trueの場合、ソース証跡ファイルからの操作ポジションの出力を抑止します。 |
|
オプション |
|
|
現在のタイムスタンプの形式を制御します。デフォルトはISO 8601形式です。 |
|
オプション |
|
|
|
|
オプション |
|
|
|
親トピック: 区切りテキスト・フォーマッタの使用
17.2.5 サンプル構成の確認
Javaアダプタ構成ファイルの区切りテキスト・フォーマッタのサンプル構成を次に示します。
gg.handler.hdfs.format.includeColumnNames=false gg.handler.hdfs.format.includeOpTimestamp=true gg.handler.hdfs.format.includeCurrentTimestamp=true gg.handler.hdfs.format.insertOpKey=I gg.handler.hdfs.format.updateOpKey=U gg.handler.hdfs.format.deleteOpKey=D gg.handler.hdfs.format.truncateOpKey=T gg.handler.hdfs.format.encoding=UTF-8 gg.handler.hdfs.format.fieldDelimiter=CDATA[\u0001] gg.handler.hdfs.format.lineDelimiter=CDATA[\n] gg.handler.hdfs.format.includeTableName=true gg.handler.hdfs.format.keyValueDelimiter=CDATA[=] gg.handler.hdfs.format.kevValuePairDelimiter=CDATA[,] gg.handler.hdfs.format.pkUpdateHandling=abend gg.handler.hdfs.format.nullValueRepresentation=NULL gg.handler.hdfs.format.missingValueRepresentation=CDATA[] gg.handler.hdfs.format.includePosition=true gg.handler.hdfs.format=delimitedtext
親トピック: 区切りテキスト・フォーマッタの使用
17.2.6 メタデータ変更イベント
Oracle GoldenGate for Big Dataでは、実行時にメタデータ変更イベントが処理されるようになりました。これは、複製されるデータベースとアップストリームのレプリケーション・プロセスでメタデータ変更イベントが伝播されると想定しています。区切りテキスト・フォーマッタは、変更を反映して出力形式を変更し、実行を続行します。
メタデータの変更はダウンストリーム・アプリケーションに影響を与える可能性があることに注意してください。区切りテキスト形式には、位置の関係を持つ固定数のフィールドが含まれます。ソース表での列の削除は、Oracle GoldenGateの実行時にシームレスに処理できますが、フィールドの合計数が変わることになるため、一部のフィールドの位置関係が変わる可能性があります。新しい列は最後に追加されると想定されるため、列(単数または複数)の追加は、メタデータ変更イベントの中でも影響が最も小さいと考えられます。メタデータ変更イベントを実行する前に、そのイベントの影響を考慮してください。メタデータ変更イベントが頻繁に発生する場合は、JSONやXMLなどの、より柔軟で自己記述型のフォーマットを検討することをお薦めします。
親トピック: 区切りテキスト・フォーマッタの使用
17.2.7 メタ列出力の設定
メタ列出力を制御する区切りテキスト・フォーマットのメタ列テンプレート・プロパティの構成可能な値は次のとおりです。
表17-8 メタ列テンプレート・プロパティ
プロパティ | 必須/オプション | 有効な値 | デフォルト | 説明 |
---|---|---|---|---|
gg.handler.name.format.metaColumnsTemplate |
オプション |
トランザクション・インジケータの
静的値の場合は| ${static} 。静的値を伝播します。したがって、${static.MYVALUE} はMYVALUE を生成フィールドに伝播します。
|
なし |
現在のメタ列情報を簡単な方法で構成でき、使用する明示的な必要性が排除されます。 insertOpKey | updateOpKey | deleteOpKey | truncateOpKey | includeTableName | includeOpTimestamp | includeOpType | includePosition | includeCurrentTimestamp, useIso8601Format これは、テンプレートを表す1つ以上のテンプレート化された値で構成されているカンマ区切りの文字列です。 |
メタ列のキーワードの説明
-
${keyword[fieldName].argument}
-
キーワードは、メタ列構文に基づいて固定されます。オプションで、大カッコの間にフィールド名を指定できます。フィールド名を指定しない場合は、デフォルトのフィールド名が使用されます。
メタ列の値を解決するには、引数が必要です。
-
${alltokens}
-
すべてのOracle GoldenGateトークン。
-
${token}
-
特定のOracle GoldenGateトークンの値。トークン・キーは、ピリオド(
.
)演算子を使用してトークンの後に続ける必要があります。次に例を示します。${token.MYTOKEN}
-
${sys}
-
システム環境変数。変数名は、ピリオド(
.
)演算子を使用してsys
の後に続ける必要があります。次に例を示します。${sys.MYVAR}
-
${env}
-
Oracle GoldenGate環境変数。変数名は、ピリオド(
.
)演算子を使用してenv
の後に続ける必要があります。次に例を示します。${env.someVariable}
-
${javaprop}
-
Java JVM変数。変数名は、ピリオド(
.
)演算子を使用してjavaprop
の後に続ける必要があります。次に例を示します。${javaprop.MYVAR}
-
${optype}
-
操作タイプ。
-
${position}
-
レコードの位置。
-
${timestamp}
-
レコードのタイムスタンプ。
-
${catalog}
-
カタログ名。
-
${schema}
-
スキーマ名。
-
${table}
-
表名。
-
${objectname}
-
完全修飾の表名。
-
${csn}
-
ソースのコミット順序番号
-
${xid}
-
ソース・トランザクションID。
-
${currenttimestamp}
-
現在のタイムスタンプ。
-
${opseqno}
-
トランザクション内のレコード順序番号。
-
${timestampmicro}
-
レコードのタイムスタンプ(マイクロ秒/エポック後)。
-
${currenttimestampmicro}
-
現在のタイムスタンプ(マイクロ秒/エポック後)。
-
${txind}
-
ソース証跡ファイルのトランザクション・インジケータです。トランザクションの値は、最初の操作の場合は
B
、中間の操作の場合はM
、最後の操作の場合はE
、操作1つのみの場合はW
です。フィルタリング操作または調整適用を使用すると、このフィールドの有用性が無効になります。 -
${static}
-
静的値を含むフィールドを出力に挿入する場合に使用します。必要な値は引数です。必要な値が
abc
である場合の構文は、${static.abc}
または${static[FieldName].abc}
です。
親トピック: 区切りテキスト・フォーマッタの使用
17.2.8 その他の考慮事項
フィールドおよび行区切り文字を選択するときは、十分に注意してください。データの内容に出現しない区切り文字を選択することが重要です。
空白と見なされる構成値の先行文字と後続文字は、Javaアダプタ構成によって削除されます。ただし、含めるまたは完全に空白と見なされる、フィールド区切り文字、行区切り文字、null値形式および欠落値形式を選択する必要がある場合があります。この場合、空白を維持するJavaアダプタ構成ファイルに特殊な構文を使用する必要があります。構成値に空白と見なされる先行文字または後続文字が含まれている場合にその空白を維持するには、CDATA[]
ラッパーで構成値をラップします。たとえば、\n
という構成値はCDATA[\n]
として構成します。
正規表現を使用して列値を検索してから、一致項目を指定した値に置き換えることができます。この検索および置換機能を区切りテキスト・フォーマッタとともに使用し、列値の内容とフィールドおよび行区切り文字の間に不一致がないことを確認できます。詳細は、「正規表現を使用した検索と置換」を参照してください。
ビッグ・データ・アプリケーションは、データの格納方法がRDBMSとは異なります。RDBMSで更新操作と削除操作を行うと、既存のデータが変更されます。ただし、ビッグ・データ・アプリケーションでは、データを変更するのではなく追加します。したがって、特定の行の現在の状態は、HDFSシステムにおけるその行に対する既存の操作がすべて統合された結果になります。これにより、次の各項で説明するような特別なシナリオが発生します。
親トピック: 区切りテキスト・フォーマッタの使用
17.2.8.1 主キーの更新
ビッグ・データ統合での主キーの更新操作には、特別な考慮と計画が必要です。主キーの更新では、ソース・データベースの特定の行の1つ以上の主キーを変更します。データはビッグ・データ・アプリケーションに追加されるため、主キーの更新操作は、特別な処理がない更新というより挿入に似ています。区切りテキスト・フォーマッタが主キーの更新を処理する方法を構成できます。設定変更が可能な動作は次のとおりです。
表17-9 構成可能な動作
値 | 説明 |
---|---|
|
デフォルトでは、主キーが更新されると、区切りテキスト・フォーマッタは終了します。 |
|
主キーの更新は、他の更新操作と同じように処理されます。この構成をかわりに使用するのは、主キーがビッグ・データ・システムから行データを選択する選択基準として使用されていないことを保証できる場合のみです。 |
|
主キーの更新は、操作前イメージのデータを使用する削除と、操作後イメージのデータを使用する挿入という特殊なケースとして処理されます。この構成は、ビッグ・データ・アプリケーションで主キー更新の影響をより正確にモデル化する場合があります。ただし、この構成を選択する場合は、ソース・データベースでのレプリケーションで完全なサプリメンタル・ロギングを有効にすることが重要です。完全なサプリメンタル・ロギングを有効にしない場合、削除操作は正常に処理されますが、挿入操作では、ビッグ・データ・アプリケーションで行データの完全な形式の列のデータがすべては含まれません。 |
親トピック: その他の考慮事項
17.2.8.2 データの統合
ビッグ・データ・アプリケーションは、基礎となるストレージにデータを追加します。分析ツールは通常、データ・ファイルを横断して、特定の行の操作をすべて1つの出力に統合するMapReduceプログラムを生成します。したがって、操作順序を指定することが重要です。区切りテキスト・フォーマッタには、これを行う多くのメタデータ・フィールドがあります。この要件を満たすには、操作のタイムスタンプでも十分です。また、現在のタイムスタンプは操作順序の指標として最適な場合があります。この状況では、証跡のポジションは、操作のタイムスタンプに関する判別基準のフィールドになります。最後に、現在のタイムスタンプもビッグ・データにおける操作の順序指標として最適です。
親トピック: その他の考慮事項
17.3 JSONフォーマッタの使用
JavaScript Object Notation (JSON)フォーマッタは、行ベースのフォーマットまたは操作ベースのフォーマットで、ソース証跡ファイルから操作を出力できます。ソース証跡ファイルから、操作データをJSONオブジェクトとしてフォーマットします。挿入、更新、削除および切捨ての各操作は、個々のJSONメッセージとしてフォーマットされます。
トピック:
- 操作メタデータのフォーマットの詳細
- 操作データのフォーマットの詳細
- 行データのフォーマットの詳細
- JSONメッセージの例
- JSONスキーマ
- JSONフォーマッタの構成プロパティ
- サンプル構成の確認
- メタデータ変更イベント
- メタ列出力の設定
- JSON主キーの更新
- Oracle Stream Analyticsの統合
親トピック: プラガブル・フォーマッタの使用
17.3.1 操作メタデータのフォーマットの詳細
JSONフォーマッタによって生成されるJSONオブジェクトには、各メッセージの先頭に次のメタデータ・フィールドがあります。
表17-10 JSONのメタデータ
値 | 説明 |
---|---|
|
完全修飾の表名を含みます。完全修飾の表名の形式は、 |
|
ソース証跡ファイルのデータベース操作のタイプを示します。デフォルト値は、挿入を表す |
|
ソース証跡ファイルの操作のタイムスタンプ。このタイムスタンプはソース証跡から取得されるため、固定です。証跡ファイルを再生すると、同じ操作に対して同じタイムスタンプになります。 |
|
区切りテキスト・フォーマッタが現在の操作レコードを処理した時刻。このタイムスタンプはISO-8601形式に従い、精度はミリ秒までです。証跡ファイルを再生しても、同じ操作に対して同じタイムスタンプにはなりません。 |
|
証跡ファイルのポジション。これには、連結された連番と、ソース証跡ファイルからのRBA番号が含まれます。証跡のポジションは、操作からソース証跡ファイルをたどるトレーサビリティ情報になります。この連番は、ソース証跡ファイルの番号です。RBA番号は、証跡ファイルのオフセットです。 |
|
ソース表の主キーの列名を保持する配列変数。 |
|
|
親トピック: JSONフォーマッタの使用
17.3.2 操作データのフォーマットの詳細
JSONメッセージは、操作メタデータ・フィールドから始まり、操作データ・フィールドが続きます。このデータは、オブジェクトであるbefore
およびafter
メンバーによって表されます。これらのオブジェクトには、キーが列名のメンバーおよび値が列値のメンバーが含まれます。
操作データは次のようにモデル化されます。
-
挿入: 操作後イメージのデータが含まれます。
-
更新: 操作前イメージと操作後イメージの両方のデータが含まれます。
-
削除: 操作前イメージのデータが含まれます。
ソース証跡ファイルからの操作の列値は、列に値がある、列値がnullである、列値がないの3つの状態のいずれかです。JSONフォーマッタは、これらの列値状態を、作成されたJSONオブジェクトに次のようにマップします。
-
列値がある: 列値が出力されます。次の例では、メンバー
STATE
に値があります。"after":{ "CUST_CODE":"BILL", "NAME":"BILL'S USED CARS", "CITY":"DENVER", "STATE":"CO" }
-
列値がnullである: デフォルトの出力値はJSON NULLです。次の例では、メンバー
STATE
はnullです。"after":{ "CUST_CODE":"BILL", "NAME":"BILL'S USED CARS", "CITY":"DENVER", "STATE":null }
-
列値がない: JSONには、列値がない場合は要素は含まれません。次の例では、メンバー
STATE
がありません。"after":{ "CUST_CODE":"BILL", "NAME":"BILL'S USED CARS", "CITY":"DENVER", }
JSONフォーマッタのデフォルト設定では、ソース証跡ファイルのデータ型を、対応するJSONデータ型にマップします。JSONでサポートされるデータ型は少ないため、この機能は通常、ソース証跡ファイルの数値フィールドを、数値として型付けされるメンバーにマップします。このデータ型マッピングは、すべてのデータを文字列として扱うように構成できます。
親トピック: JSONフォーマッタの使用
17.3.3 行データのフォーマットの詳細
JSONメッセージは、操作メタデータ・フィールドから始まり、操作データ・フィールドが続きます。行データのフォーマットの場合、これはJSONキー値ペアとしてのソース列名とソース列値です。このデータは、オブジェクトであるbefore
およびafter
メンバーによって表されます。これらのオブジェクトには、キーが列名のメンバーおよび値が列値のメンバーが含まれます。
行データは次のようにモデル化されます。
-
挿入: 操作後イメージのデータが含まれます。
-
更新: 操作後イメージのデータが含まれます。
-
削除: 操作前イメージのデータが含まれます。
ソース証跡ファイルからの操作の列値は、列に値がある、列値がnullである、列値がないの3つの状態のいずれかです。JSONフォーマッタは、これらの列値状態を、作成されたJSONオブジェクトに次のようにマップします。
-
列値がある: 列値が出力されます。次の例では、メンバー
STATE
に値があります。"CUST_CODE":"BILL", "NAME":"BILL'S USED CARS", "CITY":"DENVER", "STATE":"CO" }
-
列値がnullである: デフォルトの出力値はJSON NULLです。次の例では、メンバー
STATE
はnullです。"CUST_CODE":"BILL", "NAME":"BILL'S USED CARS", "CITY":"DENVER", "STATE":null }
-
列値がない: JSONには、列値がない場合は要素は含まれません。次の例では、メンバー
STATE
がありません。"CUST_CODE":"BILL", "NAME":"BILL'S USED CARS", "CITY":"DENVER", }
JSONフォーマッタのデフォルト設定では、ソース証跡ファイルのデータ型を、対応するJSONデータ型にマップします。JSONでサポートされるデータ型は少ないため、この機能は通常、ソース証跡ファイルの数値フィールドを、数値として型付けされるメンバーにマップします。このデータ型マッピングは、すべてのデータを文字列として扱うように構成できます。
親トピック: JSONフォーマッタの使用
17.3.4 JSONメッセージの例
次のトピックでは、挿入、更新、削除および切捨て操作に対してJSONフォーマッタによって作成されるJSONメッセージの例を示します。
17.3.4.1 操作モデル化JSONメッセージの例
挿入
{
"table":"QASOURCE.TCUSTORD",
"op_type":"I",
"op_ts":"2015-11-05 18:45:36.000000",
"current_ts":"2016-10-05T10:15:51.267000",
"pos":"00000000000000002928",
"after":{
"CUST_CODE":"WILL",
"ORDER_DATE":"1994-09-30:15:33:00",
"PRODUCT_CODE":"CAR",
"ORDER_ID":144,
"PRODUCT_PRICE":17520.00,
"PRODUCT_AMOUNT":3,
"TRANSACTION_ID":100
}
}
更新
{
"table":"QASOURCE.TCUSTORD",
"op_type":"U",
"op_ts":"2015-11-05 18:45:39.000000",
"current_ts":"2016-10-05T10:15:51.310002",
"pos":"00000000000000004300",
"before":{
"CUST_CODE":"BILL",
"ORDER_DATE":"1995-12-31:15:00:00",
"PRODUCT_CODE":"CAR",
"ORDER_ID":765,
"PRODUCT_PRICE":15000.00,
"PRODUCT_AMOUNT":3,
"TRANSACTION_ID":100
},
"after":{
"CUST_CODE":"BILL",
"ORDER_DATE":"1995-12-31:15:00:00",
"PRODUCT_CODE":"CAR",
"ORDER_ID":765,
"PRODUCT_PRICE":14000.00
}
}
削除
{
"table":"QASOURCE.TCUSTORD",
"op_type":"D",
"op_ts":"2015-11-05 18:45:39.000000",
"current_ts":"2016-10-05T10:15:51.312000",
"pos":"00000000000000005272",
"before":{
"CUST_CODE":"DAVE",
"ORDER_DATE":"1993-11-03:07:51:35",
"PRODUCT_CODE":"PLANE",
"ORDER_ID":600,
"PRODUCT_PRICE":135000.00,
"PRODUCT_AMOUNT":2,
"TRANSACTION_ID":200
}
}
切捨て
{
"table":"QASOURCE.TCUSTORD",
"op_type":"T",
"op_ts":"2015-11-05 18:45:39.000000",
"current_ts":"2016-10-05T10:15:51.312001",
"pos":"00000000000000005480",
}
親トピック: JSONメッセージの例
17.3.4.2 フラット化操作モデル化JSONメッセージの例
挿入
{
"table":"QASOURCE.TCUSTORD",
"op_type":"I",
"op_ts":"2015-11-05 18:45:36.000000",
"current_ts":"2016-10-05T10:34:47.956000",
"pos":"00000000000000002928",
"after.CUST_CODE":"WILL",
"after.ORDER_DATE":"1994-09-30:15:33:00",
"after.PRODUCT_CODE":"CAR",
"after.ORDER_ID":144,
"after.PRODUCT_PRICE":17520.00,
"after.PRODUCT_AMOUNT":3,
"after.TRANSACTION_ID":100
}
更新
{
"table":"QASOURCE.TCUSTORD",
"op_type":"U",
"op_ts":"2015-11-05 18:45:39.000000",
"current_ts":"2016-10-05T10:34:48.192000",
"pos":"00000000000000004300",
"before.CUST_CODE":"BILL",
"before.ORDER_DATE":"1995-12-31:15:00:00",
"before.PRODUCT_CODE":"CAR",
"before.ORDER_ID":765,
"before.PRODUCT_PRICE":15000.00,
"before.PRODUCT_AMOUNT":3,
"before.TRANSACTION_ID":100,
"after.CUST_CODE":"BILL",
"after.ORDER_DATE":"1995-12-31:15:00:00",
"after.PRODUCT_CODE":"CAR",
"after.ORDER_ID":765,
"after.PRODUCT_PRICE":14000.00
}
削除
{
"table":"QASOURCE.TCUSTORD",
"op_type":"D",
"op_ts":"2015-11-05 18:45:39.000000",
"current_ts":"2016-10-05T10:34:48.193000",
"pos":"00000000000000005272",
"before.CUST_CODE":"DAVE",
"before.ORDER_DATE":"1993-11-03:07:51:35",
"before.PRODUCT_CODE":"PLANE",
"before.ORDER_ID":600,
"before.PRODUCT_PRICE":135000.00,
"before.PRODUCT_AMOUNT":2,
"before.TRANSACTION_ID":200
}
切捨て
{
"table":"QASOURCE.TCUSTORD",
"op_type":"D",
"op_ts":"2015-11-05 18:45:39.000000",
"current_ts":"2016-10-05T10:34:48.193001",
"pos":"00000000000000005480",
"before.CUST_CODE":"JANE",
"before.ORDER_DATE":"1995-11-11:13:52:00",
"before.PRODUCT_CODE":"PLANE",
"before.ORDER_ID":256,
"before.PRODUCT_PRICE":133300.00,
"before.PRODUCT_AMOUNT":1,
"before.TRANSACTION_ID":100
}
親トピック: JSONメッセージの例
17.3.4.3 行モデル化JSONメッセージの例
挿入
{
"table":"QASOURCE.TCUSTORD",
"op_type":"I",
"op_ts":"2015-11-05 18:45:36.000000",
"current_ts":"2016-10-05T11:10:42.294000",
"pos":"00000000000000002928",
"CUST_CODE":"WILL",
"ORDER_DATE":"1994-09-30:15:33:00",
"PRODUCT_CODE":"CAR",
"ORDER_ID":144,
"PRODUCT_PRICE":17520.00,
"PRODUCT_AMOUNT":3,
"TRANSACTION_ID":100
}
更新
{
"table":"QASOURCE.TCUSTORD",
"op_type":"U",
"op_ts":"2015-11-05 18:45:39.000000",
"current_ts":"2016-10-05T11:10:42.350005",
"pos":"00000000000000004300",
"CUST_CODE":"BILL",
"ORDER_DATE":"1995-12-31:15:00:00",
"PRODUCT_CODE":"CAR",
"ORDER_ID":765,
"PRODUCT_PRICE":14000.00
}
削除
{
"table":"QASOURCE.TCUSTORD",
"op_type":"D",
"op_ts":"2015-11-05 18:45:39.000000",
"current_ts":"2016-10-05T11:10:42.351002",
"pos":"00000000000000005272",
"CUST_CODE":"DAVE",
"ORDER_DATE":"1993-11-03:07:51:35",
"PRODUCT_CODE":"PLANE",
"ORDER_ID":600,
"PRODUCT_PRICE":135000.00,
"PRODUCT_AMOUNT":2,
"TRANSACTION_ID":200
}
切捨て
{
"table":"QASOURCE.TCUSTORD",
"op_type":"T",
"op_ts":"2015-11-05 18:45:39.000000",
"current_ts":"2016-10-05T11:10:42.351003",
"pos":"00000000000000005480",
}
親トピック: JSONメッセージの例
17.3.4.4 主キー出力JSONメッセージの例
{ "table":"DDL_OGGSRC.TCUSTMER", "op_type":"I", "op_ts":"2015-10-26 03:00:06.000000", "current_ts":"2016-04-05T08:59:23.001000", "pos":"00000000000000006605", "primary_keys":[ "CUST_CODE" ], "after":{ "CUST_CODE":"WILL", "NAME":"BG SOFTWARE CO.", "CITY":"SEATTLE", "STATE":"WA" } }
親トピック: JSONメッセージの例
17.3.5 JSONスキーマ
デフォルトでは、JSONスキーマは発生するソース表ごとに生成されます。JSONスキーマは、その表に対する操作が発生した時点でジャスト・イン・タイム方式で生成されます。JSONスキーマは、JSONオブジェクトの解析に必須ではありません。ただし、多くのJSONパーサーがJSONスキーマを使用して、JSONオブジェクトの検証解析を実行します。また、JSONスキーマを確認すると、出力されるJSONオブジェクトのレイアウトを把握できます。デフォルトでは、JSONスキーマはGoldenGate_Home
/dirdef
ディレクトリに作成され、次の命名規則に従って名前が付けられます。
FULLY_QUALIFIED_TABLE_NAME
.schema.json
JSONスキーマの生成は抑止できます。
- 「操作モデル化JSONメッセージの例」でリストしたJSONオブジェクトのJSONスキーマの例を次に示します。
{ "$schema":"http://json-schema.org/draft-04/schema#", "title":"QASOURCE.TCUSTORD", "description":"JSON schema for table QASOURCE.TCUSTORD", "definitions":{ "row":{ "type":"object", "properties":{ "CUST_CODE":{ "type":[ "string", "null" ] }, "ORDER_DATE":{ "type":[ "string", "null" ] }, "PRODUCT_CODE":{ "type":[ "string", "null" ] }, "ORDER_ID":{ "type":[ "number", "null" ] }, "PRODUCT_PRICE":{ "type":[ "number", "null" ] }, "PRODUCT_AMOUNT":{ "type":[ "integer", "null" ] }, "TRANSACTION_ID":{ "type":[ "number", "null" ] } }, "additionalProperties":false }, "tokens":{ "type":"object", "description":"Token keys and values are free form key value pairs.", "properties":{ }, "additionalProperties":true } }, "type":"object", "properties":{ "table":{ "description":"The fully qualified table name", "type":"string" }, "op_type":{ "description":"The operation type", "type":"string" }, "op_ts":{ "description":"The operation timestamp", "type":"string" }, "current_ts":{ "description":"The current processing timestamp", "type":"string" }, "pos":{ "description":"The position of the operation in the data source", "type":"string" }, "primary_keys":{ "description":"Array of the primary key column names.", "type":"array", "items":{ "type":"string" }, "minItems":0, "uniqueItems":true }, "tokens":{ "$ref":"#/definitions/tokens" }, "before":{ "$ref":"#/definitions/row" }, "after":{ "$ref":"#/definitions/row" } }, "required":[ "table", "op_type", "op_ts", "current_ts", "pos" ], "additionalProperties":false }
- 「フラット化操作モデル化JSONメッセージの例」でリストしたJSONオブジェクトのJSONスキーマの例を次に示します。
{ "$schema":"http://json-schema.org/draft-04/schema#", "title":"QASOURCE.TCUSTORD", "description":"JSON schema for table QASOURCE.TCUSTORD", "definitions":{ "tokens":{ "type":"object", "description":"Token keys and values are free form key value pairs.", "properties":{ }, "additionalProperties":true } }, "type":"object", "properties":{ "table":{ "description":"The fully qualified table name", "type":"string" }, "op_type":{ "description":"The operation type", "type":"string" }, "op_ts":{ "description":"The operation timestamp", "type":"string" }, "current_ts":{ "description":"The current processing timestamp", "type":"string" }, "pos":{ "description":"The position of the operation in the data source", "type":"string" }, "primary_keys":{ "description":"Array of the primary key column names.", "type":"array", "items":{ "type":"string" }, "minItems":0, "uniqueItems":true }, "tokens":{ "$ref":"#/definitions/tokens" }, "before.CUST_CODE":{ "type":[ "string", "null" ] }, "before.ORDER_DATE":{ "type":[ "string", "null" ] }, "before.PRODUCT_CODE":{ "type":[ "string", "null" ] }, "before.ORDER_ID":{ "type":[ "number", "null" ] }, "before.PRODUCT_PRICE":{ "type":[ "number", "null" ] }, "before.PRODUCT_AMOUNT":{ "type":[ "integer", "null" ] }, "before.TRANSACTION_ID":{ "type":[ "number", "null" ] }, "after.CUST_CODE":{ "type":[ "string", "null" ] }, "after.ORDER_DATE":{ "type":[ "string", "null" ] }, "after.PRODUCT_CODE":{ "type":[ "string", "null" ] }, "after.ORDER_ID":{ "type":[ "number", "null" ] }, "after.PRODUCT_PRICE":{ "type":[ "number", "null" ] }, "after.PRODUCT_AMOUNT":{ "type":[ "integer", "null" ] }, "after.TRANSACTION_ID":{ "type":[ "number", "null" ] } }, "required":[ "table", "op_type", "op_ts", "current_ts", "pos" ], "additionalProperties":false }
- 「行モデル化JSONメッセージの例」でリストしたJSONオブジェクトのJSONスキーマの例を次に示します。
{ "$schema":"http://json-schema.org/draft-04/schema#", "title":"QASOURCE.TCUSTORD", "description":"JSON schema for table QASOURCE.TCUSTORD", "definitions":{ "tokens":{ "type":"object", "description":"Token keys and values are free form key value pairs.", "properties":{ }, "additionalProperties":true } }, "type":"object", "properties":{ "table":{ "description":"The fully qualified table name", "type":"string" }, "op_type":{ "description":"The operation type", "type":"string" }, "op_ts":{ "description":"The operation timestamp", "type":"string" }, "current_ts":{ "description":"The current processing timestamp", "type":"string" }, "pos":{ "description":"The position of the operation in the data source", "type":"string" }, "primary_keys":{ "description":"Array of the primary key column names.", "type":"array", "items":{ "type":"string" }, "minItems":0, "uniqueItems":true }, "tokens":{ "$ref":"#/definitions/tokens" }, "CUST_CODE":{ "type":[ "string", "null" ] }, "ORDER_DATE":{ "type":[ "string", "null" ] }, "PRODUCT_CODE":{ "type":[ "string", "null" ] }, "ORDER_ID":{ "type":[ "number", "null" ] }, "PRODUCT_PRICE":{ "type":[ "number", "null" ] }, "PRODUCT_AMOUNT":{ "type":[ "integer", "null" ] }, "TRANSACTION_ID":{ "type":[ "number", "null" ] } }, "required":[ "table", "op_type", "op_ts", "current_ts", "pos" ], "additionalProperties":false }
親トピック: JSONフォーマッタの使用
17.3.6 JSONフォーマッタの構成プロパティ
表17-11 JSONフォーマッタの構成プロパティ
プロパティ | 必須/オプション | 有効な値 | デフォルト | 説明 |
---|---|---|---|---|
|
オプション |
|
なし |
生成されるJSON出力メッセージが操作モデル化か行モデル化かを制御します。操作モデル化の場合は |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、挿入操作を示す指標です。 |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、更新操作を示す指標です。 |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、削除操作を示す指標です。 |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、切捨て操作を示す指標です。 |
|
オプション |
|
|
JSONデータの出力形式を制御します。trueの場合は、読みやすいようにデータに空白を追加してフォーマットします。falseの場合は、読み取るのが難しいコンパクトな出力が生成されます。 |
|
オプション |
任意の文字列 |
|
生成されるJSON間に区切り文字が挿入されるため、データの連続ストリームで簡単に解析できます。構成値は |
|
オプション |
|
|
生成されるJSONドキュメントに対して、JSONスキーマの生成を制御します。JSONスキーマは、表ごとに生成されます。JSONスキーマは、JSONドキュメントの解析に必須ではありません。ただし、JSONスキーマを使用すると、JSONドキュメントがどのように見えるかが示されるため、JSON解析の検証に使用できます。 |
|
オプション |
有効で存在する人気のファイル・システム・パス |
|
生成されるJSONスキーマの出力場所を制御します。 |
|
オプション |
|
|
生成されるJSONドキュメントの出力の型付けを制御します。falseの場合、フォーマッタはOracle GoldenGateの型を、対応するJSONの型にマップしようとします。trueの場合、すべてのデータは生成されるJSONとJSONスキーマで文字列として扱われます。 |
|
オプション |
Javaでサポートされる任意の有効なエンコーディング名または別名。 |
|
生成されるJSONスキーマおよびドキュメントの出力のエンコーディングを制御します。 |
|
オプション |
|
|
作成されたスキーマのバージョンを制御します。スキーマ・バージョン管理によって、新しいスキーマが作成されるたびにローカル・ファイル・システム上のスキーマ・ディレクトリにタイムスタンプ付きのスキーマが作成されます。trueに設定すると、スキーマ・バージョン管理が有効化されます。falseに設定すると、スキーマ・バージョン管理が無効化されます。 |
|
オプション |
|
|
現在のタイムスタンプの形式を制御します。デフォルトはISO 8601形式です。 |
|
オプション |
|
|
|
|
オプション |
|
|
ターゲット・エンティティへのフラット化JSONのフォーマット済データの送信を制御します。フラット化デリミタ・プロパティを機能させるには、 このプロパティは、操作フォーマット済JSON ( |
|
オプション |
JSONフィールド名の任意の有効な文字または文字列。 |
|
連結されたJSON要素名の区切り文字を制御します。このプロパティは、空白を維持する |
|
オプション |
JSONフィールド名の任意の有効な文字または文字列。 |
任意の有効なJSON属性名。 |
変更前の列値を含むJSON要素の名前を変更できるかどうかを設定できます。 このプロパティは、操作フォーマット済JSON ( |
|
オプション |
JSONフィールド名の任意の有効な文字または文字列。 |
任意の有効なJSON属性名。 |
変更後の列値を含むJSON要素の名前を変更できるかどうかを設定できます。 このプロパティは、操作フォーマット済JSON ( |
|
オプション |
|
|
フォーマッタが、主キーを変更する更新操作をどのように処理するかを指定します。主キーを操作するとJSONフォーマッタで問題が起きることがあるので、ユーザーは特に慎重を期する必要があります。このプロパティは、行モデル化JSON出力メッセージとあわせてのみ使用できます。 このプロパティは、行フォーマット済JSON (
|
gg.handler.name.format.omitNullValues |
オプション |
|
|
|
親トピック: JSONフォーマッタの使用
17.3.7 サンプル構成の確認
Javaアダプタ構成ファイルのJSONフォーマッタのサンプル構成を次に示します。
gg.handler.hdfs.format=json gg.handler.hdfs.format.insertOpKey=I gg.handler.hdfs.format.updateOpKey=U gg.handler.hdfs.format.deleteOpKey=D gg.handler.hdfs.format.truncateOpKey=T gg.handler.hdfs.format.prettyPrint=false gg.handler.hdfs.format.jsonDelimiter=CDATA[] gg.handler.hdfs.format.generateSchema=true gg.handler.hdfs.format.schemaDirectory=dirdef gg.handler.hdfs.format.treatAllColumnsAsStrings=false
親トピック: JSONフォーマッタの使用
17.3.8 メタデータ変更イベント
メタデータ変更イベントは、実行時に処理されます。表でメタデータが変更されると、次回その表に対する操作が発生したときにJSONスキーマが再生成されます。作成されるJSONメッセージの内容は、メタデータの変更に応じて変わります。たとえば、列が追加された場合、新しい列は、メタデータ変更イベント後に作成されたJSONメッセージに追加されます。
親トピック: JSONフォーマッタの使用
17.3.9 メタ列出力の設定
メタ列出力を制御する区切りテキスト・フォーマットのメタ列テンプレート・プロパティの構成可能な値は次のとおりです。
表17-12 メタ列テンプレート・プロパティ
プロパティ | 必須/オプション | 有効な値 | デフォルト | 説明 |
---|---|---|---|---|
gg.handler.name.format.metaColumnsTemplate |
オプション |
トランザクション・インジケータの
静的値の場合は| ${static} 。静的値を伝播します。したがって、${static.MYVALUE} はMYVALUE を生成フィールドに伝播します。
|
なし |
現在のメタ列情報を簡単な方法で構成でき、使用する明示的な必要性が排除されます。 insertOpKey | updateOpKey | deleteOpKey | truncateOpKey | includeTableName | includeOpTimestamp | includeOpType | includePosition | includeCurrentTimestamp, useIso8601Format これは、テンプレートを表す1つ以上のテンプレート化された値で構成されているカンマ区切りの文字列です。 |
メタ列のキーワードの説明
-
${keyword[fieldName].argument}
-
キーワードは、メタ列構文に基づいて固定されます。オプションで、大カッコの間にフィールド名を指定できます。フィールド名を指定しない場合は、デフォルトのフィールド名が使用されます。
メタ列の値を解決するには、引数が必要です。
-
${alltokens}
-
すべてのOracle GoldenGateトークン。
-
${token}
-
特定のOracle GoldenGateトークンの値。トークン・キーは、ピリオド(
.
)演算子を使用してトークンの後に続ける必要があります。次に例を示します。${token.MYTOKEN}
-
${sys}
-
システム環境変数。変数名は、ピリオド(
.
)演算子を使用してsys
の後に続ける必要があります。次に例を示します。${sys.MYVAR}
-
${env}
-
Oracle GoldenGate環境変数。変数名は、ピリオド(
.
)演算子を使用してenv
の後に続ける必要があります。次に例を示します。${env.someVariable}
-
${javaprop}
-
Java JVM変数。変数名は、ピリオド(
.
)演算子を使用してjavaprop
の後に続ける必要があります。次に例を示します。${javaprop.MYVAR}
-
${optype}
-
操作タイプ。
-
${position}
-
レコードの位置。
-
${timestamp}
-
レコードのタイムスタンプ。
-
${catalog}
-
カタログ名。
-
${schema}
-
スキーマ名。
-
${table}
-
表名。
-
${objectname}
-
完全修飾の表名。
-
${csn}
-
ソースのコミット順序番号
-
${xid}
-
ソース・トランザクションID。
-
${currenttimestamp}
-
現在のタイムスタンプ。
-
${opseqno}
-
トランザクション内のレコード順序番号。
-
${timestampmicro}
-
レコードのタイムスタンプ(マイクロ秒/エポック後)。
-
${currenttimestampmicro}
-
現在のタイムスタンプ(マイクロ秒/エポック後)。
-
${txind}
-
ソース証跡ファイルのトランザクション・インジケータです。トランザクションの値は、最初の操作の場合は
B
、中間の操作の場合はM
、最後の操作の場合はE
、操作1つのみの場合はW
です。フィルタリング操作または調整適用を使用すると、このフィールドの有用性が無効になります。 -
${static}
-
静的値を含むフィールドを出力に挿入する場合に使用します。必要な値は引数です。必要な値が
abc
である場合の構文は、${static.abc}
または${static[FieldName].abc}
です。
親トピック: JSONフォーマッタの使用
17.3.10 JSON主キーの更新
JSONフォーマッタが操作データをモデル化するように構成されている場合、主キーの更新に特別な処理は不要で、他の更新と同じように扱われます。操作前と操作後の値には、主キーの変更が反映されます。
JSONフォーマッタが行データをモデル化するように構成されている場合、主キーの更新は特別な方法で処理する必要があります。デフォルトの動作は異常終了です。ただし、gg.handler.name.format.pkUpdateHandling
構成プロパティを使用すると、JSONフォーマッタを行データをモデル化するように構成して、主キーの更新を通常の更新操作として、または削除操作後の挿入操作として処理できます。主キーの更新を削除および挿入操作として処理するようにフォーマッタを構成する場合は、更新前イメージと更新後イメージの完全なデータを含むようにレプリケーション・ストリームを構成することをお薦めします。そうしないと、主キーの更新で生成される挿入操作によって、変更されなかったフィールドのデータが欠落します。
親トピック: JSONフォーマッタの使用
17.3.11 Oracle Stream Analyticsの統合
操作モデル化JSONメッセージをKafkaハンドラに送信すると、Oracle GoldenGate for Big DataをOracle Stream Analytics (OSA)と統合できます。これが機能するのは、JSONフォーマッタが操作モデル化JSONメッセージを出力するように構成されている場合のみです。
OSAにはフラット化JSONオブジェクトが必要であるため、JSONフォーマッタの新機能により、フラット化JSONを生成します。この機能を使用するには、gg.handler.name.format.flatten=false
をtrue
に設定します。(デフォルト設定はfalseです)。フラット化JSONファイルの例を次に示します。
{
"table":"QASOURCE.TCUSTMER",
"op_type":"U",
"op_ts":"2015-11-05 18:45:39.000000",
"current_ts":"2016-06-22T13:38:45.335001",
"pos":"00000000000000005100",
"before.CUST_CODE":"ANN",
"before.NAME":"ANN'S BOATS",
"before.CITY":"SEATTLE",
"before.STATE":"WA",
"after.CUST_CODE":"ANN",
"after.CITY":"NEW YORK",
"after.STATE":"NY"
}
親トピック: JSONフォーマッタの使用
17.4 長さ区切り値フォーマッタの使用
長さ区切り値(LDV)フォーマッタは、行ベースのフォーマッタの一種です。ソース証跡ファイルからのデータベース操作を長さ区切り値出力にフォーマットします。ソース証跡からの挿入、更新、削除または切捨ての各操作は、個々の長さ区切りメッセージにフォーマットされます。長さ区切りでは、フィールド・デリミタはありません。フィールドのサイズは、データに基づいて可変です。
長さ区切りでは、デフォルトで次の列値状態が長さ区切り値出力にマップされます。ソース証跡ファイルからの操作の列値は、次の3つの状態のいずれかになります。
-
列値がある - 列値は、接頭辞指標が
P
の出力です。 -
列値がNULL - デフォルトの出力値は
N
です。列値がNULL
の場合の出力は、構成可能です。 -
列値がない - デフォルトの出力値は
M
です。列値がない場合の出力は、設定を変更できます。
トピック:
17.4.1 メッセージのフォーマットの詳細
データの出力のデフォルト形式は、次のとおりです。
- 最初は行の長さで、その後にメタデータが続きます。
<ROW LENGTH><PRESENT INDICATOR><FIELD LENGTH><OPERATION TYPE><PRESENT INDICATOR><FIELD LENGTH><FULLY QUALIFIED TABLE NAME><PRESENT INDICATOR><FIELD LENGTH><OPERATION TIMESTAMP><PRESENT INDICATOR><FIELD LENGTH><CURRENT TIMESTAMP><PRESENT INDICATOR><FIELD LENGTH><TRAIL POSITION><PRESENT INDICATOR><FIELD LENGTH><TOKENS>
または
<ROW LENGTH><FIELD LENGTH><FULLY QUALIFIED TABLE NAME><FIELD LENGTH><OPERATION TIMESTAMP><FIELD LENGTH><CURRENT TIMESTAMP><FIELD LENGTH><TRAIL POSITION><FIELD LENGTH><TOKENS>
- 次が行データです。
<PRESENT INDICATOR><FIELD LENGTH><COLUMN 1 VALUE><PRESENT INDICATOR><FIELD LENGTH><COLUMN N VALUE>
親トピック: 長さ区切り値フォーマッタの使用
17.4.2 フォーマットしたメッセージの例
- 挿入メッセージ:
0133P01IP161446749136000000P161529311765024000P262015-11-05 18:45:36.000000P04WILLP191994-09-30 15:33:00P03CARP03144P0817520.00P013P03100
- 更新メッセージ
0133P01UP161446749139000000P161529311765035000P262015-11-05 18:45:39.000000P04BILLP191995-12-31 15:00:00P03CARP03765P0814000.00P013P03100
- 削除メッセージ
0136P01DP161446749139000000P161529311765038000P262015-11-05 18:45:39.000000P04DAVEP191993-11-03 07:51:35P05PLANEP03600P09135000.00P012P03200
親トピック: 長さ区切り値フォーマッタの使用
17.4.3 LDVフォーマッタの構成プロパティ
表17-13 LDVフォーマッタの構成プロパティ
サンプル構成の確認
#The LDV Handler gg.handler.filewriter.format=binary gg.handler.filewriter.format.binaryLengthMode=false gg.handler.filewriter.format.recordLength=4 gg.handler.filewriter.format.fieldLength=2 gg.handler.filewriter.format.legacyFormat=false gg.handler.filewriter.format.presentValue=CDATA[P] gg.handler.filewriter.format.missingValue=CDATA[M] gg.handler.filewriter.format.nullValue=CDATA[N] gg.handler.filewriter.format.metaColumnsTemplate=${optype},${timestampmicro},${currenttimestampmicro},${timestamp} gg.handler.filewriter.format.pkUpdateHandling=abend
親トピック: 長さ区切り値フォーマッタの使用
17.4.4 その他の考慮事項
ビッグ・データ・アプリケーションは、格納方法がRDBMSと異なります。RDBMSで更新操作と削除操作を行うと、既存のデータが変更されます。ビッグ・データ・アプリケーションでは、データは変更されず、既存のデータに追加されるだけです。特定の行の現在の状態は、HDFSシステムにおけるその行に対する既存の操作がすべて統合された結果になります。
主キーの更新
主キーを更新する操作では、ビッグ・データ統合について特別な考慮と計画が必要です。主キーの更新は、ソース・データベースの特定の行に対する1つ以上の主キーを変更する更新操作です。データはビッグ・データ・アプリケーションで追加されるだけなので、主キーの更新操作は、何も処理しない更新というより新しい挿入にも似ています。長さ区切り値フォーマッタは、主キーの特別な処理に対応しており、ユーザーが設定を変更できます。設定変更が可能な動作は次のとおりです。表17-14 主キーの更新の動作
値 | 説明 |
---|---|
Abend |
デフォルトの動作で、主キーが更新される場合、長さ区切り値フォーマッタは異常終了します。 |
更新 |
この構成では、主キー更新が他の更新操作と同じように処理されます。この構成は、ビッグ・データ・システムから行データを選択するとき、変更される主キーが選択基準として使用されないと間違いなくわかっている場合にのみ選択してください。 |
Delete-Insert |
この構成を使用すると、主キーの更新は、操作前のイメージ・データを使用する削除と、操作後のイメージ・データを使用する挿入という特殊なケースとして処理されます。この構成は、ビッグ・データ・アプリケーションで主キー更新の影響をより正確にモデル化する場合があります。ただし、この構成を選択する場合は、ソース・データベースでのレプリケーションで完全なサプリメンタル・ロギングを有効にすることが重要です。完全なサプリメンタル・ロギングを有効にしない場合、削除操作は正常に処理されますが、挿入操作では、ビッグ・データ・アプリケーションで行データの完全な形式の列のデータがすべては含まれません。 |
データの統合
ビッグ・データ・アプリケーションは、基礎となるストレージにデータを単に追加します。通常、分析ツールはデータ・ファイルを横断して、特定の行の操作をすべて1つの出力に統合するマップ・リデュース・プログラムを生成します。操作順序を指定することが重要です。長さ区切り値フォーマッタには、このニーズに対応する多くのメタデータ・フィールドがあります。この要件を満たすには、操作のタイムスタンプでも十分です。が、共通のトランザクションを共有する場合などには特に、2つの更新操作が同じタイムスタンプになる場合もあります。操作タイムスタンプが等しい場合には、証跡のポジションが判別基準のフィールドになります。最後に、現在のタイムスタンプもビッグ・データにおける操作の順序指標として最適です。
親トピック: 長さ区切り値フォーマッタの使用
17.5 操作ベースと行ベースのフォーマットの使用
Oracle GoldenGate for Big Dataのフォーマッタには、操作ベースと行ベースのフォーマッタがあります。
操作ベースのフォーマッタとは、ソース・データベースの表データに対して発生する個々の挿入、更新および削除イベントです。新しい行はソース・データベースに追加されているところなので、挿入操作で提供されるのは変更後のデータ(またはイメージ)のみです。更新操作は、既存の行データがどのように変更されるかを示す、変更前と変更後の両方のデータを提供します。削除操作は、削除される行を識別するために、変更前のデータのみを提供します。操作ベースのフォーマッタは、ソース証跡ファイルに存在する操作をモデル化します。操作ベースのフォーマットには、変更前および変更後のイメージのフィールドが含まれます。
行ベースのフォーマッタは、操作データを適用した後に存在する行データをモデル化します。行ベースのフォーマッタには、データの1つのイメージのみが含まれます。次の各項では、操作ベースと行ベースのフォーマッタで表示されるデータの種類について説明します。
トピック:
17.5.1 操作フォーマッタ
操作ベースのフォーマットをサポートするフォーマッタは、JSON、Avro操作、およびXMLです。操作ベース・フォーマッタの出力は、次のとおりです。
-
挿入操作: 操作前イメージのデータはnullです。操作後のイメージ・データが出力されます。
-
更新操作: 操作前イメージと操作後イメージの両方のデータが出力されます。
-
削除操作: 操作前イメージのデータが出力されます。操作後イメージのデータはnullです。
-
切捨て操作: 操作前イメージと操作後イメージの両方のデータがnullです。
親トピック: 操作ベースと行ベースのフォーマットの使用
17.5.2 行フォーマッタ
行ベースのフォーマットをサポートするフォーマッタは、区切りテキストとAvro行です。行ベースのフォーマッタは、次の操作について次の情報を出力します。
-
挿入操作: 操作後イメージのデータのみ。
-
更新操作: 操作後イメージのデータのみ。主キーの更新は特別なケースであり、各フォーマッタの項で説明します。
-
削除操作: 操作前イメージのデータのみ。
-
切捨て操作: 表名は示されますが、操作前イメージと操作後イメージの両方のデータがnullです。表の切捨てはDDL操作で、異なるデータベース実装はサポートしない場合があります。データベース実装については、Oracle GoldenGateのドキュメントを参照してください。
親トピック: 操作ベースと行ベースのフォーマットの使用
17.5.3 表の行または列の値の状態
RDBMSでは、特定の行と列の表データは2つの状態(データ値がある、データはnullである)のいずれかのみとなります。ただし、Oracle GoldenGateキャプチャ・プロセスによってデータがOracle GoldenGate証跡ファイルに転送される場合、データの状態は3つ(データ値がある、データはnullである、データがない)になります。
挿入操作の場合、データがnullかどうかに関係なく、操作後イメージにはすべての列値のデータが含まれます。一方、更新操作と削除操作に含まれるデータは、すべての列に完全なデータが含まれるとはかぎりません。更新操作のためにRDBMSにデータを複製する場合、ターゲット・データベースでデータを変更するために必要なのは、主キー値と変更された列の値のみです。また、ターゲット・データベースから行を削除するために必要となるのは、主キー値のみです。したがって、ソース・データベースに値が存在しても、その値がソース証跡ファイルに存在しない可能性があります。ソース証跡ファイルのデータには3つの状態があるので、プラガブル・フォーマッタも3つすべての状態でデータを表せる必要があります。
Oracle GoldenGate証跡ファイルの行および列データは、ビッグ・データ統合に重大な影響を与えるため、必要なデータを理解することが重要です。一般的には、Oracle GoldenGate証跡ファイルで操作に含まれるデータを制御できます。Oracleデータベースの場合、このデータはサプリメンタル・ロギング・レベルによって制御されます。Oracle GoldenGate証跡ファイルに含まれる行と列の値を制御する方法を理解するには、ソース・データベース実装に関するOracle GoldenGateのドキュメントを参照してください。
親トピック: 操作ベースと行ベースのフォーマットの使用
17.6 XMLフォーマッタの使用
XMLフォーマッタは、ソース証跡ファイルの操作前イメージと操作後イメージのデータをXMLドキュメント形式の操作データにフォーマットします。XMLドキュメントの形式は、これまでのリリースのOracle GoldenGate Java AdapterにおけるXML形式と実質的に同じです。
トピック:
親トピック: プラガブル・フォーマッタの使用
17.6.1 メッセージのフォーマットの詳細
XMLでフォーマットされたメッセージには、次の情報が含まれます。
表17-15 XMLフォーマットの詳細
値 | 説明 |
---|---|
|
完全修飾の表名。 |
|
操作タイプ。 |
|
現在のタイムスタンプは、フォーマッタが現在の操作レコードを処理した時刻です。このタイムスタンプはISO-8601形式に従い、精度はミリ秒までです。証跡ファイルを再生しても、同じ操作に対して同じタイムスタンプにはなりません。 |
|
ソース証跡ファイルからのポジション。 |
|
ソース表の列の合計数。 |
|
|
|
|
親トピック: XMLフォーマッタの使用
17.6.2 XMLメッセージの例
次の各項では、XMLメッセージの例を示します。
17.6.2.1 挿入メッセージの例
<?xml version='1.0' encoding='UTF-8'?> <operation table='GG.TCUSTORD' type='I' ts='2013-06-02 22:14:36.000000' current_ts='2015-10-06T12:21:50.100001' pos='00000000000000001444' numCols='7'> <col name='CUST_CODE' index='0'> <before missing='true'/> <after><![CDATA[WILL]]></after> </col> <col name='ORDER_DATE' index='1'> <before missing='true'/> <after><![CDATA[1994-09-30:15:33:00]]></after> </col> <col name='PRODUCT_CODE' index='2'> <before missing='true'/> <after><![CDATA[CAR]]></after> </col> <col name='ORDER_ID' index='3'> <before missing='true'/> <after><![CDATA[144]]></after> </col> <col name='PRODUCT_PRICE' index='4'> <before missing='true'/> <after><![CDATA[17520.00]]></after> </col> <col name='PRODUCT_AMOUNT' index='5'> <before missing='true'/> <after><![CDATA[3]]></after> </col> <col name='TRANSACTION_ID' index='6'> <before missing='true'/> <after><![CDATA[100]]></after> </col> <tokens> <token> <Name><![CDATA[R]]></Name> <Value><![CDATA[AADPkvAAEAAEqL2AAA]]></Value> </token> </tokens> </operation>
親トピック: XMLメッセージの例
17.6.2.2 更新メッセージの例
<?xml version='1.0' encoding='UTF-8'?> <operation table='GG.TCUSTORD' type='U' ts='2013-06-02 22:14:41.000000' current_ts='2015-10-06T12:21:50.413000' pos='00000000000000002891' numCols='7'> <col name='CUST_CODE' index='0'> <before><![CDATA[BILL]]></before> <after><![CDATA[BILL]]></after> </col> <col name='ORDER_DATE' index='1'> <before><![CDATA[1995-12-31:15:00:00]]></before> <after><![CDATA[1995-12-31:15:00:00]]></after> </col> <col name='PRODUCT_CODE' index='2'> <before><![CDATA[CAR]]></before> <after><![CDATA[CAR]]></after> </col> <col name='ORDER_ID' index='3'> <before><![CDATA[765]]></before> <after><![CDATA[765]]></after> </col> <col name='PRODUCT_PRICE' index='4'> <before><![CDATA[15000.00]]></before> <after><![CDATA[14000.00]]></after> </col> <col name='PRODUCT_AMOUNT' index='5'> <before><![CDATA[3]]></before> <after><![CDATA[3]]></after> </col> <col name='TRANSACTION_ID' index='6'> <before><![CDATA[100]]></before> <after><![CDATA[100]]></after> </col> <tokens> <token> <Name><![CDATA[R]]></Name> <Value><![CDATA[AADPkvAAEAAEqLzAAA]]></Value> </token> </tokens> </operation>
親トピック: XMLメッセージの例
17.6.2.3 削除メッセージの例
<?xml version='1.0' encoding='UTF-8'?> <operation table='GG.TCUSTORD' type='D' ts='2013-06-02 22:14:41.000000' current_ts='2015-10-06T12:21:50.415000' pos='00000000000000004338' numCols='7'> <col name='CUST_CODE' index='0'> <before><![CDATA[DAVE]]></before> <after missing='true'/> </col> <col name='ORDER_DATE' index='1'> <before><![CDATA[1993-11-03:07:51:35]]></before> <after missing='true'/> </col> <col name='PRODUCT_CODE' index='2'> <before><![CDATA[PLANE]]></before> <after missing='true'/> </col> <col name='ORDER_ID' index='3'> <before><![CDATA[600]]></before> <after missing='true'/> </col> <col name='PRODUCT_PRICE' index='4'> <missing/> </col> <col name='PRODUCT_AMOUNT' index='5'> <missing/> </col> <col name='TRANSACTION_ID' index='6'> <missing/> </col> <tokens> <token> <Name><![CDATA[L]]></Name> <Value><![CDATA[206080450]]></Value> </token> <token> <Name><![CDATA[6]]></Name> <Value><![CDATA[9.0.80330]]></Value> </token> <token> <Name><![CDATA[R]]></Name> <Value><![CDATA[AADPkvAAEAAEqLzAAC]]></Value> </token> </tokens> </operation>
親トピック: XMLメッセージの例
17.6.2.4 切捨てメッセージの例
<?xml version='1.0' encoding='UTF-8'?> <operation table='GG.TCUSTORD' type='T' ts='2013-06-02 22:14:41.000000' current_ts='2015-10-06T12:21:50.415001' pos='00000000000000004515' numCols='7'> <col name='CUST_CODE' index='0'> <missing/> </col> <col name='ORDER_DATE' index='1'> <missing/> </col> <col name='PRODUCT_CODE' index='2'> <missing/> </col> <col name='ORDER_ID' index='3'> <missing/> </col> <col name='PRODUCT_PRICE' index='4'> <missing/> </col> <col name='PRODUCT_AMOUNT' index='5'> <missing/> </col> <col name='TRANSACTION_ID' index='6'> <missing/> </col> <tokens> <token> <Name><![CDATA[R]]></Name> <Value><![CDATA[AADPkvAAEAAEqL2AAB]]></Value> </token> </tokens> </operation>
親トピック: XMLメッセージの例
17.6.3 XMLスキーマ
XMLフォーマッタは、XMLスキーマ(XSD)を生成しません。XSDは、XMLフォーマッタによって生成されるすべてのメッセージに適用されます。次のXSDは、XMLフォーマッタによって生成されるXMLドキュメントの構造を定義します。
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="operation"> <xs:complexType> <xs:sequence> <xs:element name="col" maxOccurs="unbounded" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:element name="before" minOccurs="0"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute type="xs:string" name="missing" use="optional"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name="after" minOccurs="0"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute type="xs:string" name="missing" use="optional"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element type="xs:string" name="missing" minOccurs="0"/> </xs:sequence> <xs:attribute type="xs:string" name="name"/> <xs:attribute type="xs:short" name="index"/> </xs:complexType> </xs:element> <xs:element name="tokens" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:element name="token" maxOccurs="unbounded" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:element type="xs:string" name="Name"/> <xs:element type="xs:string" name="Value"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute type="xs:string" name="table"/> <xs:attribute type="xs:string" name="type"/> <xs:attribute type="xs:string" name="ts"/> <xs:attribute type="xs:dateTime" name="current_ts"/> <xs:attribute type="xs:long" name="pos"/> <xs:attribute type="xs:short" name="numCols"/> </xs:complexType> </xs:element> </xs:schema>
親トピック: XMLフォーマッタの使用
17.6.4 XMLフォーマッタの構成プロパティ
表17-16 XMLフォーマッタの構成プロパティ
プロパティ | オプションY/N | 有効な値 | デフォルト | 説明 |
---|---|---|---|---|
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、挿入操作を示す指標です。 |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、更新操作を示す指標です。 |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、削除操作を示す指標です。 |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、切捨て操作を示す指標です。 |
|
オプション |
Javaでサポートされる任意の有効なエンコーディング名または別名。 |
UTF-8 (XMLのデフォルト) |
生成されるXMLドキュメントの出力エンコーディング。 |
|
オプション |
|
|
生成されるXMLドキュメントにXML prologが含まれるかどうかを決定します。XML prologは、整形式のXMLではオプションです。XML prologは、 |
|
オプション |
|
|
XMLメッセージの現在のタイムスタンプの形式を制御します。デフォルトでは、日付と時刻の間に |
親トピック: XMLフォーマッタの使用
17.6.5 サンプル構成の確認
Javaアダプタ・プロパティ・ファイルのXMLフォーマッタのサンプル構成を次に示します。
gg.handler.hdfs.format=xml gg.handler.hdfs.format.insertOpKey=I gg.handler.hdfs.format.updateOpKey=U gg.handler.hdfs.format.deleteOpKey=D gg.handler.hdfs.format.truncateOpKey=T gg.handler.hdfs.format.encoding=ISO-8859-1 gg.handler.hdfs.format.includeProlog=false
親トピック: XMLフォーマッタの使用
17.6.6 メタデータ変更イベント
XMLフォーマッタは、メタデータ変更イベントをシームレスに処理します。メタデータ変更イベントによってXMLスキーマが変更されることはありません。XMLスキーマは汎用として設計されているので、同じスキーマが任意の表の操作を表します。
複製されるデータベースとアップストリームのOracle GoldenGateレプリケーション・プロセスでメタデータ変更イベントを伝播できる場合、メタデータが変更されたときにXMLフォーマッタはアクションを実行できます。メタデータの変更は、変更後にメッセージに反映されます。たとえば、列が追加されると、新しい列データが表のXMLメッセージに表示されます。
親トピック: XMLフォーマッタの使用
17.6.7 メタ列出力の設定
メタ列出力を制御するXMLのメタ列テンプレート・プロパティの構成可能な値は次のとおりです。
表17-17 メタ列テンプレート・プロパティ
プロパティ | 必須/オプション | 有効な値 | デフォルト | 説明 |
---|---|---|---|---|
gg.handler.name.format.metaColumnsTemplate |
オプション |
トランザクション・インジケータの
静的値の場合は| ${static} 。静的値を伝播します。したがって、${static.MYVALUE} はMYVALUE を生成フィールドに伝播します。
|
なし |
現在のメタ列情報を簡単な方法で構成でき、使用する明示的な必要性が排除されます。 insertOpKey | updateOpKey | deleteOpKey | truncateOpKey | includeTableName | includeOpTimestamp | includeOpType | includePosition | includeCurrentTimestamp, useIso8601Format これは、テンプレートを表す1つ以上のテンプレート化された値で構成されているカンマ区切りの文字列です。 |
メタ列のキーワードの説明
-
${keyword[fieldName].argument}
-
キーワードは、メタ列構文に基づいて固定されます。オプションで、大カッコの間にフィールド名を指定できます。フィールド名を指定しない場合は、デフォルトのフィールド名が使用されます。
メタ列の値を解決するには、引数が必要です。
-
${alltokens}
-
すべてのOracle GoldenGateトークン。
-
${token}
-
特定のOracle GoldenGateトークンの値。トークン・キーは、ピリオド(
.
)演算子を使用してトークンの後に続ける必要があります。次に例を示します。${token.MYTOKEN}
-
${sys}
-
システム環境変数。変数名は、ピリオド(
.
)演算子を使用してsys
の後に続ける必要があります。次に例を示します。${sys.MYVAR}
-
${env}
-
Oracle GoldenGate環境変数。変数名は、ピリオド(
.
)演算子を使用してenv
の後に続ける必要があります。次に例を示します。${env.someVariable}
-
${javaprop}
-
Java JVM変数。変数名は、ピリオド(
.
)演算子を使用してjavaprop
の後に続ける必要があります。次に例を示します。${javaprop.MYVAR}
-
${optype}
-
操作タイプ。
-
${position}
-
レコードの位置。
-
${timestamp}
-
レコードのタイムスタンプ。
-
${catalog}
-
カタログ名。
-
${schema}
-
スキーマ名。
-
${table}
-
表名。
-
${objectname}
-
完全修飾の表名。
-
${csn}
-
ソースのコミット順序番号
-
${xid}
-
ソース・トランザクションID。
-
${currenttimestamp}
-
現在のタイムスタンプ。
-
${opseqno}
-
トランザクション内のレコード順序番号。
-
${timestampmicro}
-
レコードのタイムスタンプ(マイクロ秒/エポック後)。
-
${currenttimestampmicro}
-
現在のタイムスタンプ(マイクロ秒/エポック後)。
-
${txind}
-
ソース証跡ファイルのトランザクション・インジケータです。トランザクションの値は、最初の操作の場合は
B
、中間の操作の場合はM
、最後の操作の場合はE
、操作1つのみの場合はW
です。フィルタリング操作または調整適用を使用すると、このフィールドの有用性が無効になります。 -
${static}
-
静的値を含むフィールドを出力に挿入する場合に使用します。必要な値は引数です。必要な値が
abc
である場合の構文は、${static.abc}
または${static[FieldName].abc}
です。
親トピック: XMLフォーマッタの使用
17.6.8 主キーの更新
主キーを更新する際、XMLフォーマッタによる特別な処理は必要ありません。XMLフォーマッタは、データベース操作をモデル化するメッセージを作成します。更新操作の場合、これには列値の操作前と操作後のイメージが含まれます。主キーの変更は、他の列値を変更する場合と同様に、列値に対する変更としてこの形式で表されます。
親トピック: XMLフォーマッタの使用