フォーマッタは、Oracle GoldenGate証跡ファイルの操作をフォーマット済のメッセージに変換する機能を提供します。変換されたメッセージは、Oracle GoldenGate for Big Dataのいずれかのハンドラによってビッグ・データ・ターゲットに送信できます。
トピック:
Oracle GoldenGate for Big Dataのフォーマッタには、操作ベースと行ベースのフォーマッタがあります。
操作ベースとは、ソース・データベースの表データに対して発生する個々の挿入、更新および削除イベントです。新しい行はソース・データベースに追加されているところなので、挿入操作で処理されるのは操作後のデータ(またはイメージ)のみです。更新操作は操作前と操作後のデータが対象で、既存の行データの変更方法を表します。削除操作は操作前のデータのみが対象で、削除されている行の識別を示します。操作ベースのフォーマッタは、ソース証跡ファイルに存在する操作をモデル化します。操作ベースのフォーマッタには、操作前後のイメージのフィールドが含まれます。
行ベースのフォーマッタは、操作データを適用した後に存在する行データをモデル化します。行ベースのフォーマッタに含まれるデータのイメージは1つだけです。次の各項では、操作ベースと行ベースのフォーマッタで表示されるデータの種類について説明します。
トピック:
操作ベースのフォーマットをサポートするフォーマッタは、JSON、Avro操作、およびXMLです。操作ベース・フォーマッタの出力は、次のとおりです。
挿入操作 - 操作前のイメージ・データはNULL。操作後のイメージ・データが出力されます。
更新操作 - 操作前と操作後の両方のイメージ・データが出力されます。
削除操作 - 操作前のイメージ・データが出力されます。操作後のイメージ・データはNULLです。
切捨て操作 - 操作前と操作後の両方のイメージ・データがNULLです。
行ベースのフォーマットをサポートするフォーマッタは、区切りテキストとAvro行です。行ベースのフォーマッタは、次の操作について次の情報を出力します。
挿入操作 - 操作後のイメージ・データのみ。
更新操作 - 操作後のイメージ・データのみ。主キーの更新は特別なケースであり、各フォーマッタの項で説明します。
削除操作 - 操作前のイメージ・データのみ。
切捨て操作 - 表名は示されますが、操作前と操作後のイメージ・データはどちらもNULLです。表の切捨てはDDL操作で、異なるデータベース実装はサポートしない場合があります。データベース実装については、Oracle GoldenGateのドキュメントを参照してください。
RDBMSでは、特定の行と列の表データは2つの状態のうちいずれかをとります。表の行/列に値があるか、値がNULLかのいずれかです。ところが、Oracle GoldenGateの取得プロセスによってデータがOracle GoldenGate証跡ファイルに転送される場合、可能な状態は3つに増えます。表の行/列に値があるか、行/列の値がNULL、または行/列の値がないかです。
挿入操作の場合、操作後のイメージには、その列に値があるかNULLかにかかわらず、すべての列の値のデータが含まれます。一方、更新操作と削除操作に含まれるデータは、すべての列に完全なデータが含まれるとはかぎりません。更新操作のためにRDBMSにデータを複製する場合、ターゲット・データベースで変更する必要があるデータは、主キー値と、変更される列の値のみです。また、削除操作の場合、主キー値でターゲット・データベースから行を削除させる必要があるだけです。したがって、表の行/列がソース・データベースで値を持っている場合でも、その値はソース証跡ファイルには存在しないことになります。ソース証跡ファイルの行/列データには3つの状態があるので、プラガブル・フォーマッタも3つの状態でデータを表せる必要があるということです。
Oracle GoldenGate証跡ファイルでどんな行/列データを使用できるかが、ビッグ・データ統合に影響します。どんなデータが必要かを理解することが重要です。一般的には、Oracle GoldenGate証跡ファイルで操作に含まれるデータを制御できます。Oracleデータベースの場合、これは補足的なロギング・レベルによって制御されます。Oracle GoldenGate証跡ファイルに含まれる行と列の値を制御する方法については、個々のソース・データベース実装に関するOracle GoldenGateのドキュメントを参照してください。
区切りテキスト・フォーマッタは、行ベースのフォーマッタの一種です。ソース証跡ファイルから、データベース操作の内容を、区切りテキスト出力としてフォーマットします。ソース証跡ファイルからの挿入、更新、削除または切捨ての各操作は、区切られた個々のメッセージとしてフォーマットされます。区切りテキスト出力は、各表に対して固定数のフィールドがあり、フィールド区切り文字によって区切られ、最後が行区切り文字になります。フィールドは、位置が関係します。Hiveを含め、ビッグ・データ分析ツールの多くは、区切りテキストを含むHDFSファイルと適切に機能します。
ソース証跡ファイルからの操作の列値は、列に値がある、列値がNULLも、列値がないの3つの状態のいずれかです。デフォルトでは、区切りテキストはこれらの列値状態を区切りテキスト出力に次のようにマップします。
列値がある - 列値が出力されます。
列値がNULL - デフォルトの出力値はNULLです。列値がNULLの場合の出力は、設定を変更できます。
列値がない - デフォルトの出力値は""です。列値がない場合の出力は、設定を変更できます。
トピック:
データの出力のデフォルト形式は、次のとおりです。セミコロンで区切られます。
最初は行のメタデータです。
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に設定されていない場合、区切りテキスト出力のこのフィールドの出力は表示されません。
次の各項では、区切りテキスト・フォーマッタのサンプル・メッセージを示します。メッセージを明確に表示するために、デフォルトのフィールド区切り文字がパイプ文字(|)に変更されています。
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
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
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|||
フィールドと行区切り文字を選択するときは、十分に注意してください。データの内容に出現しない区切り文字を選択することが重要です。
空白と見なされる構成値の先行文字と後続文字は、Javaアダプタ構成機能によって削除されます。含めるまたは完全に空白と見なされる、フィールド区切り文字、行区切り文字、null値形式、および欠落値形式が必要な場合があります。この場合、空白を維持するJavaアダプタ構成ファイルに特殊な構文を使用する必要があります。空白と見なされる先行文字と後続文字が構成値に含まれる場合にその空白を維持するには、CDATA[]ラッパーで構成値をラップしてください。たとえば、\nという構成値はCDATA[\n]として構成します。
正規表現を使用して列値を検索してから、一致項目を指定した値に置き換えることができます。この検索および置換機能を区切りテキスト・フォーマッタとあわせて利用し、列値の内容とフィールドおよび行区切り文字間に不一致がないことを確認できます。詳細は、「正規表現を使用した検索と置換」を参照してください。
ビッグ・データ・アプリケーションは、格納方法がRDBMSと異なります。RDBMSで更新操作と削除操作を行うと、既存のデータが変更されます。一方、ビッグ・データ・アプリケーションでは、データは変更されず、どちらかといえば既存のデータに追加されます。したがって、特定の行の現在の状態は、HDFSシステムにおけるその行に対する既存の操作がすべて統合された結果になります。これにより、次の各項で説明するような特別なシナリオが発生します。
主キーを更新する操作では、ビッグ・データ統合について特別な考慮と計画が必要です。主キーの更新は、ソース・データベースの特定の行に対する1つ以上の主キーを変更する更新操作です。データはビッグ・データ・アプリケーションで追加されるだけなので、主キーの更新操作は、何も処理しない更新というより新しい挿入にも似ています。区切りテキスト・フォーマッタは、主キーの特別な処理に対応しており、ユーザーが設定を変更できます。設定変更が可能な動作は次のとおりです。
表13-1 構成可能な動作
| 値 | 説明 |
|---|---|
|
デフォルトの動作では、主キーが更新される場合、区切りテキスト・フォーマッタは追加を実行します。 |
|
この構成では、主キー更新が他の更新操作と同じように処理されます。この構成は、ビッグ・データ・システムから行データを選択するとき、変更される主キーが選択基準として使用されないと間違いなくわかっている場合にのみ選択してください。 |
|
この構成を使用すると、主キーの更新は、操作前のイメージ・データを使用する削除と、操作後のイメージ・データを使用する挿入という特殊なケースとして処理されます。この構成は、ビッグ・データ・アプリケーションで主キー更新の影響をより正確にモデル化する場合があります。ただし、この構成を選択する場合は、ソース・データベースでのレプリケーションで完全なサプリメンタル・ロギングを有効にすることが重要です。完全なサプリメンタル・ロギングを有効にしない場合、削除操作は正常に処理されますが、挿入操作では、ビッグ・データ・アプリケーションで行データの完全な形式の列のデータがすべては含まれません。 |
前述したように、ビッグ・データ・ファイリングでは、基礎になる格納情報にデータが追加されるだけです。分析ツールは通常、データ・ファイルを横断して、特定の行の操作をすべて1つの出力に統合するMapReduceプログラムを生成します。したがって、操作の順を指定することが重要です。区切りテキスト・フォーマッタには、このニーズに対応する多くのメタデータ・フィールドがあります。この要件を満たすには、操作のタイムスタンプでも十分です。が、共通のトランザクションを共有する場合などには特に、2つの更新操作が同じタイムスタンプになる場合もあります。操作タイムスタンプが等しい場合には、証跡のポジションが判別基準のフィールドになります。最後に、現在のタイムスタンプもビッグ・データにおける操作の順序指標として最適です。
INFOレベルのロギングが有効になっている場合、Java log4jのロギングでは、区切りテキスト出力形式のサマリーが記録されます。区切りフィールドのサマリーは、確認されたソース表ごとに記録され、その表に対する最初の操作が区切りテキスト・フォーマッタによって受け取られたときに発生します。区切りテキスト出力のフィールドに関するこうした詳細な説明は、初期設定を実行するときに便利かもしれません。メタデータ変更イベントの場合、区切りフィールドのサマリーは、メタデータ変更イベント後のその表に対する最初の操作時に再生成され、再度ログに記録されます。
表13-2 構成オプション
| プロパティ | オプション / 必須 | 有効な値 | デフォルト | 説明 |
|---|---|---|---|---|
gg.handler.name.format.includeColumnNames
|
オプション |
|
|
列値に先行する区切りフィールドとして列名を書き込む出力を制御します。trueの場合、出力は次のようになります。 COL1_Name|COL1_Value|COL2_Name|COL2_Value falseの場合、出力は次のようになります。
|
|
オプション |
|
|
値が |
|
オプション |
|
|
値が |
|
オプション |
|
|
値が |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、挿入操作を示す指標です。 |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、更新操作を示す指標です。 |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、削除操作を示す指標です。 |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、切捨て操作を示す指標です。 |
|
オプション |
Javaでサポートされる任意のエンコーディング名または別名。 |
Oracle GoldenGateプロセスをホストしているマシンのネイティブのシステム・エンコーディング。 |
出力される区切りテキストのエンコーディングを決定します。 |
|
オプション |
任意の文字列 |
|
区切りフィールド間に使用される区切り文字。この値は |
|
オプション |
任意の文字列 |
改行 (デフォルトのHive区切り文字) |
レコード間で使用される区切り文字。この値は |
|
オプション |
|
|
|
|
オプション |
任意の文字列 |
|
マップにおけるキーと値の間の区切り文字を指定します。Key1=value1。トークンはマップされた値です。構成値は |
|
オプション |
任意の文字列 |
|
マップにおけるキー/値ペアの間の区切り文字を指定します。 |
|
オプション |
|
|
フォーマッタが、主キーを変更する更新操作をどのように処理するかに関する構成を指定します。主キーを操作するとテキスト・フォーマッタで問題が起きることがあるので、ユーザーは特に慎重を期する必要があります。
|
|
オプション |
任意の文字列 |
NULL |
NULL値の場合に区切り出力に含まれる内容を構成できます。構成値は |
|
オプション |
任意の文字列 |
|
値がない場合に区切りテキスト出力に含まれる内容を構成できます。構成値は |
|
オプション |
|
|
ソース証跡ファイルからの操作ポジションの出力を抑止できます。 |
|
オプション |
|
|
現在のタイムスタンプの形式を制御します。デフォルトはISO 8601形式です。 |
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
Oracle GoldenGate for Big Dataでは、実行時にメタデータ変更イベントが処理されるようになりました。このとき、複製されるデータベースとアップストリームのレプリケーション・プロセスでメタデータ変更イベントが伝播されると想定されています。区切りテキスト・フォーマッタは、変更を反映して実行を続けるように出力形式を変更します。
メタデータの変更はダウンストリームのアプリケーションに影響する可能性があることに注意してください。区切りテキスト形式は、位置の関係を持つ固定数のフィールドで構成されます。ソース表での列の削除は、Oracle GoldenGateの実行時にシームレスに処理されますが、フィールドの合計数が変わることになるため、一部のフィールドの位置関係が変わる可能性があります。新しい列は最後に追加されると想定されるため、列(単数または複数)の追加は、メタデータ変更イベントの中でも影響が最も小さいと考えられます。メタデータ変更イベントを実行する前に、そのイベントの影響を考慮する必要があります。メタデータ変更イベントが頻繁になる場合は、もっと柔軟性が高く明快な形式、たとえばJSONやXMLなどを検討することをお薦めします。
JavaScript Object Notation (JSON)フォーマッタは、行ベースのフォーマットまたは操作ベースのフォーマットで、ソース証跡ファイルから操作を出力できます。ソース証跡ファイルから、操作データをJSONオブジェクトとしてフォーマットします。挿入、更新、削除および切捨ての各操作は、個々のJSONメッセージとしてフォーマットされます。
トピック:
JSONフォーマッタによって生成されるJSONオブジェクトには、各メッセージの先頭に次のメタデータ・フィールドがあります。
表13-3 JSONのメタデータ
| 値 | 説明 |
|---|---|
|
完全修飾の表名を含みます。完全修飾の表名の形式は、 |
|
証跡ファイルからのデータベース操作のタイプを示す操作タイプが含まれます。デフォルト値は、挿入を表す |
|
操作タイムスタンプは、ソース証跡ファイルからの操作のタイムスタンプです。このタイムスタンプはソース証跡から取得されるため、固定です。証跡ファイルを再生すると、同じ操作に対して同じタイムスタンプになります。 |
|
現在のタイムスタンプは、区切りテキスト・フォーマッタが現在の操作レコードを処理した現在時刻のタイムスタンプです。このタイムスタンプはISO-8601形式に従い、精度はミリ秒までです。証跡ファイルを再生しても、同じ操作に対して同じタイムスタンプにはなりません。 |
|
これは証跡ファイルのポジションで、連結された連番と、ソース証跡ファイルからのRBA番号を伴います。証跡のポジションは、操作からソース証跡ファイルをたどるトレーサビリティ情報になります。この連番は、ソース証跡ファイルの番号です。RBA番号は、証跡ファイルのオフセットです。 |
|
ソース表の主キーの列名を保持する配列変数。 |
|
|
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メッセージには、最初に操作メタデータ・フィールドが含まれます。操作メタデータ・フィールドの後に操作データ・フィールドが続きます。行データのフォーマットの場合、これは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フォーマッタによって作成される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",
}
挿入:
{
"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
}
挿入:
{
"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",
}
{
"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スキーマは発生するソース表ごとに生成されます。JSONスキーマは、その表に対する操作が発生した時点でジャスト・イン・タイム方式で生成されます。JSONスキーマは、JSONオブジェクトの解析に必須ではありません。ただし、多くのJSONパーサーがJSONスキーマを使用して、JSONオブジェクトの検証解析を実行します。また、JSONスキーマを確認すると、出力されるJSONオブジェクトのレイアウトを把握できます。JSONスキーマは、デフォルトではGoldenGate_Home/dirdefディレクトリに作成され、次の命名規則に従って名前が付けられます。
FULLY_QUALIFIED_TABLE_NAME.schema.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
}
{
"$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
}
{
"$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
}
表13-4 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 |
オプション |
|
|
|
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スキーマが再生成されます。生成されるJSONメッセージの内容は、メタデータの変更に応じて変わります。たとえば、メタデータの変更が列の追加の場合、メタデータ変更イベントの後で、作成されたJSONメッセージに新しい列が含まれます。
JSONフォーマッタが操作データをモデル化するために構成される場合、主キーの更新に特別な処理は不要で、他の更新と同じように扱われます。操作前と操作後の値には、主キーの変更が反映されます。
JSONフォーマッタが行データをモデル化するために構成される場合、主キーの更新は懸念事項です。デフォルトの動作は異常終了です。gg.handler.name.format.pkUpdateHandling構成プロパティを使用して行データをモデル化するためにJSONフォーマッタを構成すると、主キーの更新は、定期更新として、または削除および挿入操作として扱われます。削除および挿入操作として機能するように構成した場合、更新の操作前と操作後の完全なイメージ・データが含まれるようにレプリケーション・ストリームを構成することをお薦めします。そうしないと、主キーの更新で生成される挿入操作によって、変更されなかったフィールドのデータが欠落します。
操作モデル化JSONメッセージをKafkaハンドラに送信すると、Oracle GoldenGate for Big DataをOracle Stream Analytics (OSA)と統合できます。これが機能するのは、JSONフォーマッタが操作モデル化JSONメッセージを出力するように構成されている場合のみです。
OSAにはフラット化JSONオブジェクトが必要であるため、フラット化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"
}
Apache Avroは、オープン・ソースのデータ・シリアライズ/デシリアライズ・フレームワークの1つです。シリアライズされたデータの柔軟性と簡潔さ、シリアライズ/デシリアライズのパフォーマンスの高さで知られています。Apache Avroは、ビッグ・データ・アプリケーションでよく使われています。
トピック:
Avro行フォーマッタは、ソース証跡ファイルの操作データを、Avroバイナリ配列形式のメッセージにフォーマットします。挿入、更新、削除および切捨ての各操作は、個々のAvroメッセージとしてフォーマットされます。ソース証跡ファイルには、操作データの操作前と操作後のイメージが含まれます。Avro行フォーマッタは、その操作前と操作後のイメージ・データを取得して、データをAvroバイナリ形式の操作データにフォーマットします。
Avro行フォーマッタは、ソース証跡ファイルの操作データから行データを表す形式に操作をフォーマットします。この形式は、Avroメッセージがデータ変更操作をモデル化するため、Avro操作フォーマッタの出力より簡潔です。
Avro行フォーマッタは、AvroデータをHDFSにストリーミングするときに適した選択肢です。Hiveは、HDFSのデータ・ファイルをAvro形式でサポートします。
この項の内容は次のとおりです。
Avro行フォーマッタによって生成されるAvroメッセージには、メッセージの先頭に次の7つのメタデータ・フィールドがあります。
表13-5 Avroフォーマッタのメタデータ
| 値 | 説明 |
|---|---|
|
完全修飾の表名。完全修飾の表名の形式は、 |
|
証跡ファイルからのデータベース操作のタイプを示す操作タイプ。デフォルト値は、挿入を表す |
|
操作タイムスタンプは、ソース証跡ファイルからの操作のタイムスタンプです。このタイムスタンプはソース証跡から取得されるため、固定です。証跡ファイルを再生すると、同じ操作に対して同じタイムスタンプになります。 |
|
現在のタイムスタンプは、フォーマッタが現在の操作レコードを処理した現在時刻です。このタイムスタンプはISO-8601形式に従い、精度はミリ秒までです。証跡ファイルを再生しても、同じ操作に対して同じタイムスタンプにはなりません。 |
|
証跡ファイルのポジションは、連結された連番と、ソース証跡ファイルからのRBA番号を伴います。証跡のポジションは、操作からソース証跡ファイルをたどるトレーサビリティ情報になります。この連番は、ソース証跡ファイルの番号です。RBA番号は、証跡ファイルのオフセットです。 |
|
ソース表の主キーの列名を保持する配列変数。 |
|
ソース証跡ファイルからのトークン・キー値ペアを保持するマップ変数。 |
操作メタデータに続くデータは、操作データです。このデータは、列名で識別される個々のフィールドとして表されます。
ソース証跡ファイルからの操作の列値は、列に値がある、列値がNULLも、列値がないの3つの状態のいずれかです。Avro属性はこのうちの2つ、列に値があるか、列値がNULLかのみをサポートします。列値がない状態は、NULL値と同じとして扱われます。Avro行フォーマッタを使用する際には、ソース証跡ファイルのすべての列に対する完全なイメージ・データを提供するために、Oracle GoldenGateの取得プロセスを構成することをお薦めします。
Avro行フォーマッタのデフォルト設定では、ソース証跡ファイルのデータ型を、対応するAvroデータ型にマップします。Avroでサポートされるデータ型は限られているため、ソース列はAvroのLONG、DOUBLE、FLOAT、BINARYまたはSTRINGデータ型にマップします。このデータ型マッピングの設定を変更して、すべてのデータを文字列として扱うことができます。
Avroメッセージはバイナリなので、人間が読める形式ではありません。次のトピックでは、メッセージの例を示します。これらの例には、JSON形式のメッセージが示されます。
{"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"}
{"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"}
{"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}
{"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は、スキーマの表現に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
} ]
}
表13-6 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が削除され、かわりにスペースが出力されます。 |
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行フォーマッタは、メタデータ変更イベントが発生したときにアクションを実行できます。このとき、複製されるデータベースとアップストリームのOracle GoldenGateレプリケーション・プロセスでメタデータ変更イベントが伝播されると想定されています。Avroメッセージは対応するスキーマに緊密に依存しているため、Avroを使用してフォーマットするときには特にメタデータ変更イベントが重要です。
メタデータ変更イベントは、Avro行フォーマッタによってシームレスに処理され、更新されたAvroスキーマは、メタデータ変更イベント後にその表の操作が最初に発生したときに生成されます。メタデータ変更イベントの影響を理解して、ダウンストリーム・ターゲットを新しいAvroスキーマに変更する必要があります。AvroメッセージがAvroスキーマに密に依存している場合、互換性の問題が生じることがあります。スキーマ変更の前に生成されるAvroメッセージを、新たに生成されたAvroスキーマでデシリアライズすることはできません。
逆に、スキーマ変更の後で生成されるAvroメッセージを、前に生成されたAvroスキーマでデシリアライズすることもできません。ベスト・プラクティスとして、メッセージの生成に使用されたのと同じバージョンのAvroスキーマを使用するようにしてください。詳細は、Apache Avroのドキュメントを参照してください。
この項では、次の特別な考慮事項について説明します。
Avroはバイナリ形式なので、人間が読める形式ではありません。Avroメッセージはバイナリ形式なので、問題が発生した場合にデバッグが容易ではないため、Avro行フォーマッタではこの問題を軽減するための特別な機能が用意されています。log4j Javaロギング・レベルをTRACEに設定すると、作成されるAvroメッセージがデシリアライズされ、ログ・ファイルにJSONオブジェクトとして示されます。これで、作成されたAvroメッセージの構造と内容を見られるようになります。TRACEは、パフォーマンスに大きくマイナスの影響を及ぼすため、本番環境では有効にしないでください。または、内容をトラブルシューティングするために、人間が読める内容で生成するフォーマッタに切り替えることも検討できます。XMLまたはJSONフォーマッタはどちらも、トラブルシューティングしやすいように人間が読める形式で内容を生成します。
主キーを更新する操作では、ビッグ・データ統合について特別な考慮と計画が必要です。主キーの更新は、ソース・データベースの特定の行に対する1つ以上の主キーを変更する更新操作です。データはビッグ・データ・アプリケーションで追加されるだけなので、主キーの更新操作は、何も処理しない更新というより新しい挿入にも似ています。Avro行フォーマッタは、主キーの特別な処理に対応しており、次のようにユーザーが設定を変更できます。
表13-7 構成可能な動作
| 値 | 説明 |
|---|---|
|
デフォルトの動作では、区切りテキスト・フォーマッタが主キーが更新されて異常終了します。 |
|
この構成では、主キー更新が他の更新操作と同じように処理されます。この構成は、ビッグ・データ・システムから行データを選択するとき、変更される主キーが選択基準として使用されないと間違いなくわかっている場合にのみ選択してください。 |
|
この構成を使用すると、主キーの更新は、操作前のイメージ・データを使用する削除と、操作後のイメージ・データを使用する挿入という特殊なケースとして処理されます。この構成は、ビッグ・データ・アプリケーションで主キー更新の影響をより正確にモデル化する場合があります。ただし、この構成を選択する場合は、ソース・データベースでのレプリケーションで完全なサプリメンタル・ロギングを有効にすることが重要です。完全なサプリメンタル・ロギングを有効にしない場合、削除操作は正常に処理されますが、挿入操作では、ビッグ・データ・アプリケーションで行データの完全な形式の列のデータがすべては含まれません。 |
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スキーマのフィンガープリント。フィンガープリントは、Avro SchemaNormalization.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"
} ]
}
Avro操作フォーマッタは、ソース証跡ファイルの操作データを、Avroバイナリ配列形式のメッセージにフォーマットします。挿入、更新、削除および切捨ての各操作は、個々のAvroメッセージとしてフォーマットされます。ソース証跡ファイルには、操作データの操作前と操作後のイメージが含まれます。Avro操作フォーマッタは、その操作前と操作後のイメージ・データを取得して、データをAvroバイナリ形式の操作データにフォーマットします。
Avro操作フォーマッタは、ソース証跡ファイルの操作データから操作データを表す形式に操作をフォーマットします。この形式は、Avroメッセージが行データをモデル化するため、Avro行フォーマッタの出力より詳細です。
この項の内容は次のとおりです。
Avro操作フォーマッタによって生成されるAvroメッセージには、メッセージの先頭に次のメタデータ・フィールドがあります。
表13-8 Avroメッセージとそのメタデータ
| フィールド | 説明 |
|---|---|
|
|
|
証跡ファイルからのデータベース操作のタイプを示す操作タイプ。デフォルト値は、挿入を表す |
|
操作タイムスタンプは、ソース証跡ファイルからの操作のタイムスタンプです。このタイムスタンプはソース証跡から取得されるため、固定です。証跡ファイルを再生すると、同じ操作に対して同じタイムスタンプになります。 |
|
現在のタイムスタンプは、フォーマッタが現在の操作レコードを処理した現在時刻です。このタイムスタンプはISO-8601形式に従い、精度はミリ秒までです。証跡ファイルを再生しても、同じ操作に対して同じタイムスタンプにはなりません。 |
|
証跡ファイルのポジションは、連結された連番と、ソース証跡ファイルからのRBA番号を伴います。証跡のポジションは、操作からソース証跡ファイルをたどるトレーサビリティ情報になります。この連番は、ソース証跡ファイルの番号です。RBA番号は、証跡ファイルのオフセットです。 |
|
ソース表の主キーの列名を保持する配列変数。 |
|
ソース証跡ファイルからのトークン・キー値ペアを保持するマップ変数。 |
この操作データは、列名で識別される個々のフィールドとして表されます。
ソース証跡ファイルからの操作の列値は、列に値がある、列値がNULLも、列値がないの3つの状態のいずれかです。Avro属性はこのうちの2つ、列に値があるか、列値がNULLかのみをサポートします。Avro操作フォーマッタには、列値がない場合を示すために、列ごとに追加のブール型フィールドがあります。このブール型フィールドは、COLUMN_NAME_isMissingという名前です。COLUMN_NAMEフィールドの組合せを使用すると、3つすべての状態を定義できます。
状態1: 列に値がある
COLUMN_NAMEフィールドに値がある
COLUMN_NAME_isMissingフィールドがfalse
状態2: 列値がNULL
COLUMN_NAMEフィールドの値がNULL
COLUMN_NAME_isMissingフィールドがfalse
状態3: 列値がない
COLUMN_NAMEフィールドの値がNULL
COLUMN_NAME_isMissingフィールドがtrue
Avro行フォーマッタのデフォルト設定では、ソース証跡ファイルのデータ型を、対応するAvroデータ型にマップします。Avroでサポートされるデータ型は少ないため、この機能はソース証跡ファイルの数値フィールドを、数値として型付けされるメンバーにマップする場合に、大きく影響します。このデータ型マッピングの設定を変更して、すべてのデータを文字列として扱うことができます。
Avroメッセージはバイナリなので、人間が読める形式ではありません。次のトピックでは、メッセージの例を示します。JSON形式のメッセージが示されます。
{"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}}
{"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}}
{"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}
{"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スキーマはJSONとして表されます。Avroスキーマは、生成されるAvroメッセージの形式を定義し、Avroメッセージのシリアライズとデシリアライズに必要です。Avroスキーマは、最初に表に対する操作が発生した時点でジャスト・イン・タイム方式で生成されます。Avroスキーマは表定義に固有であり、処理される操作で発生する表ごとに個別のAvroスキーマが生成されます。デフォルトでは、AvroスキーマはGoldenGate_Home/dirdef ディレクトリに書き込まれますが、書き込む場所は設定を変更できます。Avroスキーマのファイル名は、Fully_Qualified_Table_Name.avscという命名規則に従いますが、書き込む場所は設定変更が可能です。Avroスキーマのファイル名は、次の命名規則に従います。
前の項のサンプルに示した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
} ]
}
表13-9 構成オプション
| プロパティ | オプションY/N | 有効な値 | デフォルト | 説明 |
|---|---|---|---|---|
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、挿入操作を示す指標です |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、更新操作を示す指標です。 |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、削除操作を示す指標です。 |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、切捨て操作を示す指標です。 |
|
オプション |
Javaでサポートされる任意の有効なエンコーディング名または別名 |
UTF-8 (JSONのデフォルト) |
JSONとして生成されるAvroスキーマの出力のエンコーディングを制御します。JSONのデフォルトはUTF-8です。Avroメッセージはバイナリで、独自の内部形式でエンコーディングをサポートしています。 |
|
オプション |
|
|
生成されるAvroメッセージの出力の型付けを制御します。 |
|
オプション |
任意の文字列 |
値なし |
オプションで、ユーザーが各Avroメッセージの後に区切り文字を挿入できます。これはベスト・プラクティスとは言えませんが、ユースケースによっては、ユーザーが他のストリームを解析し、個々のAvroメッセージをストリームから抽出したい場合があるかもしれません。このプロパティを使用すると、そうしたオプションをユーザーが実行できます。Avroメッセージには出現しそうにない一意の区切り文字を選択してください。このプロパティは |
|
オプション |
有効で存在する人気のファイル・システム・パス。 |
|
生成されるAvroスキーマの出力場所を制御します。 |
|
オプション |
|
|
汎用のAvroラッパー・メッセージで、ソース証跡ファイルからの操作に対してAvroメッセージをラップする機能を提供します。詳細は、「汎用のラッパー機能」を参照してください。 |
|
オプション |
|
|
現在のタイムスタンプの形式を制御します。デフォルトはISO 8601形式です。falseに設定すると、現在のタイムスタンプの日付と時刻の間のTが削除され、かわりにスペースが出力されます。 |
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操作フォーマッタは、メタデータ変更イベントとともにアクションを実行できます。このとき、複製されるデータベースとアップストリームのOracle GoldenGateレプリケーション・プロセスでメタデータ変更イベントが伝播されると想定されています。Avroメッセージは対応するスキーマに緊密に依存しているため、Avroを使用してフォーマットするときには特にメタデータ変更イベントが重要です。メタデータ変更イベントは、Avro操作フォーマッタによってシームレスに処理され、更新されたAvroスキーマは、メタデータ変更イベント後にその表の操作が最初に発生したときに生成されます。メタデータ変更イベントの影響を理解して、ダウンストリーム・ターゲットを新しいAvroスキーマに変更する必要があります。AvroメッセージがAvroスキーマに密に依存している場合、互換性の問題が生じることがあります。スキーマ変更の前に生成されるAvroメッセージを、新たに生成されたAvroスキーマでデシリアライズすることはできません。逆に、スキーマ変更の後で生成されるAvroメッセージを、前に生成されたAvroスキーマでデシリアライズすることもできません。ベスト・プラクティスとして、メッセージの生成に使用されたのと同じバージョンのAvroスキーマを使用するようにしてください。詳細は、Apache Avroのドキュメントを参照してください。
この項では、次の特別な考慮事項について説明します。
Avroはバイナリ形式なので、人間が読める形式ではありません。Avroメッセージはバイナリ形式なので、問題が発生した場合にデバッグが容易ではありません。log4j Javaロギング・レベルをTRACEに設定すると、作成されるAvroメッセージがデシリアライズされ、ログ・ファイルにJSONオブジェクトとして示されます。これで、作成されたAvroメッセージの構造と内容を見られるようになります。TRACEは、パフォーマンスに大きい影響を及ぼすため、本番環境では有効にしないでください。
Avro操作フォーマッタは、更新操作の操作前と操作後の完全なイメージを使用してメッセージを作成します。したがって、Avro操作フォーマッタでは、主キーの更新について特別な処理は必要ありません。
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"
} ]
}
Oracle GoldenGate for Big Dataは、Avroオブジェクト・コンテナ・ファイル(OCF)形式でHDFSに書き込むことができます。HDFSにフォーマットするデータにはAvro OCFを使用するのが最適です。Avro OCFはスキーマ展開を他の形式よりも効率的に処理します。Avro OCFフォーマッタでも圧縮および圧縮解除がサポートされ、ディスク領域がより効率的に使用できます。
HDFSハンドラの特殊なユースケースとして、HDFSハンドラをAvroフォーマッタに統合して、Avro OCF形式でHDFSにファイルを書き込むことができます。Avro OCF形式は、HiveでAvroデータをHDFSを読込み可能にするために必要です。Avro OCF形式の詳細は、Avro仕様に記載されています。
http://avro.apache.org/docs/current/spec.html#Object+Container+Files
もう1つの重要な機能は、次を使用して、データをAvro OCF形式でストリーミングし、Hiveで表定義を生成して、メタデータの変更イベントが生じた場合はHiveで表定義を更新するようHDFSハンドラを構成できることです。
| プロパティ | オプション / 必須 | 有効な値 | デフォルト | 説明 |
|---|---|---|---|---|
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、挿入操作を示す指標です。 |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、更新操作を示す指標です。 |
|
オプション |
任意の文字列 |
|
出力レコードに切り捨てられ、切捨て操作を示す指標です。 |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、切捨て操作を示す指標です。 |
|
オプション |
Javaでサポートされる任意の有効なエンコーディング名または別名。 |
|
JSONとして生成されるAvroスキーマの出力のエンコーディングを制御します。JSONのデフォルトはUTF-8です。Avroメッセージはバイナリで、独自の内部形式でエンコーディングをサポートしています。 |
|
オプション |
|
|
生成されるAvroメッセージの出力の型付けを制御します。 |
|
オプション |
|
|
フォーマッタが、主キーを変更する更新操作をどのように処理するかを制御します。主キーを操作するとAvro行フォーマッタで問題が起きることがあるので、ユーザーは特に慎重を期する必要があります。
|
|
オプション |
|
|
Avroのシリアライズのためにスキーマを生成する必要があるため、このプロパティを |
|
オプション |
有効で存在する人気のファイル・システム・パス |
|
ローカル・ファイル・システムに対する生成されたAvroスキーマの出力先を制御します。このプロパティは、Avroスキーマが書き込まれるHDFSの場所を制御しません。この場所はHDFSハンドラ・プロパティで制御されます。 |
|
オプション |
|
|
現在のタイムスタンプのデフォルト形式はISO8601です。 |
|
オプション |
|
|
trueに設定すると、Avroスキーマがスキーマ・ディレクトリに作成されて、タイムスタンプでバージョン管理されます。スキーマの形式は、次のとおりです。
|
XMLフォーマッタは、ソース証跡ファイルから、操作データをJSONオブジェクトとしてフォーマットします。XMLフォーマッタは、その操作前と操作後のイメージ・データを取得して、データをXMLドキュメント形式の操作データにフォーマットします。XMLドキュメントの形式は、これまでのリリースのOracle GoldenGate Java Adapter製品におけるXML形式と、実質的に同じです。
トピック:
XMLでフォーマットされたメッセージには、次の情報が含まれます。
表13-10 XMLフォーマットの詳細
| 値 | 説明 |
|---|---|
|
完全修飾の表名。 |
|
操作タイプ。 |
|
現在のタイムスタンプは、フォーマッタが現在の操作レコードを処理した時刻です。このタイムスタンプはISO-8601形式に従い、精度はミリ秒までです。証跡ファイルを再生しても、同じ操作に対して同じタイムスタンプにはなりません。 |
|
ソース証跡ファイルからのポジション。 |
|
ソース表の列の合計数。 |
|
|
|
|
この項では、次のXMLメッセージの例を示します。
<?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 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 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 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スキーマ(XSD)は、XMLフォーマッタの機能の一部として生成されません。XSDは、XMLフォーマッタによって生成されるすべてのメッセージに汎用です。生成されるXMLドキュメントの構造を定義するXSDが、次のように定義されています。
<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>
表13-11 構成オプション
| プロパティ | オプションY/N | 有効な値 | デフォルト | 説明 |
|---|---|---|---|---|
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、挿入操作を示す指標です。 |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、更新操作を示す指標です。 |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、削除操作を示す指標です。 |
|
オプション |
任意の文字列 |
|
出力レコードに挿入され、切捨て操作を示す指標です。 |
|
オプション |
Javaでサポートされる任意の有効なエンコーディング名または別名。 |
UTF-8 (XMLのデフォルト) |
生成されるXMLドキュメントの出力のエンコーディングを制御します。 |
|
オプション |
|
|
生成されるXMLドキュメントのXML prologの出力を制御します。XML prologは、整形式のXMLではオプションです。サンプルのXML prologは、 |
|
オプション |
|
|
XMLメッセージの現在のタイムスタンプの形式を制御します。 |
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フォーマッタは、メタデータ変更イベントをシームレスに処理します。XMLドキュメントは、メタデータ変更イベントがあってもXMLスキーマが変更されないような形式です。XMLスキーマは汎用として設計されているので、同じスキーマが任意の表の操作を表します。
XMLフォーマッタは、メタデータ変更イベントとともにアクションを実行できます。このとき、複製されるデータベースとアップストリームのOracle GoldenGateレプリケーション・プロセスでメタデータ変更イベントが伝播されると想定されています。XMLドキュメントは、メタデータ変更イベントがあってもXMLスキーマが変更されないような形式です。XMLスキーマは汎用なので、同じスキーマが任意の表の操作を表します。メタデータで生じる変更は、メタデータ変更イベント後にメッセージに反映されます。たとえば列を追加する場合、新しい列と列データは、メタデータ変更イベントの後に、その表のXMLメッセージに表示され始めます。