この章では、Flumeハンドラについて説明し、その機能を理解できるように例を示します。
内容は次のとおりです。
Flumeハンドラは、Oracle GoldenGate証跡からFlumeソースに変更取得データをストリーミングするために設計されています。Apache Flumeは、ビッグ・データ・アプリケーションにデータをストリーミングすることを主な目的とするオープン・ソース・アプリケーションです。Flumeアーキテクチャには、ソース、チャネル、シンクという3つの主コンポーネントがあり、その全体がデータのパイプラインになります。Flumeソースは、データをFlumeチャネルに公開します。Flumeシンクは、Flumeチャネルからデータを取得し、そのデータを別のターゲットにストリーミングします。Flumeエージェントは、ソース、チャネル、シンクを所有し管理するコンテナ・プロセスです。単一のFlumeインストールに、複数のエージェント・プロセスをホストできます。Flumeハンドラは、証跡ファイルからAvroまたはThrift RPCのFlumeソースへデータをストリーミングできます。
Flumeハンドラを実行するには、AvroまたはThrift Flumeソースとともに構成されたFlumeエージェントが稼働している必要があります。Oracle GoldenGateは、Flumeと同じ場所に配置することも、別のマシンに配置することもできます。別のマシンに配置する場合は、ネットワーク接続でFlumeソースのホストとポートにアクセスできる必要があります。Flumeエージェント・プロセスの構成および起動方法については、次の場所にあるFlumeのユーザーズ・ガイドを参照してください。
https://flume.apache.org/releases/content/1.6.0/FlumeUserGuide.pdf
ここでは、Flumeハンドラのコンポーネントの構成とハンドラの実行について説明します。
Flumeソースに接続して実行するには、Flumeハンドラのgg.classpathconfiguration
変数で2つのものを構成する必要があります。Flumeエージェントの構成ファイルと、FlumeクライアントJARです。Flumeハンドラは、Flumeエージェント構成ファイルの内容を使用して、Flumeソースに接続する際のホスト、ポートおよびソース・タイプを解決します。Flumeクライアント・ライブラリは、Oracle GoldenGate for Big Dataに付属しません。Flumeクライアント・ライブラリのバージョンは、Flumeハンドラが接続するFlumeのバージョンと一致する必要があります。必要なFlumeクライアントJARファイルのバージョン別リストは、「Flumeハンドラ・クライアント依存性」を参照してください。
Oracle GoldenGateのプロパティgg.classpath
は、次のデフォルトの場所を含むように設定する必要があります。
core-site.xml
ファイルのデフォルトの場所は、Flume_Home
/conf
です。
FlumeクライアントJARのデフォルトの場所は、Flume_Home
/lib/*
です。
gg.classpath
は、上の例に示したとおり正確に構成する必要があります。Flumeエージェント構成ファイルのパス指定に含めるパスには、ワイルドカードを使用しないでください。Flumeエージェント構成ファイルのパスに*wildcard
を含めると、アクセスできなくなります。逆に、依存関係jarのパス指定には、そのディレクトリにあるJARファイルがすべて関連するクラスパスに含まれるように、ワイルドカード(*
)を含める必要があります。*.jar
は使用しないでください。正しく構成したgg.classpath
変数の例は、次のようになります。
gg.classpath=dirprm/:/var/lib/flume/lib/*
FlumeハンドラとFlumeを同じ場所に配置していない場合は、Flumeハンドラ・プロセスをホストしているマシンに、Flumeエージェント構成ファイルとFlumeクライアント・ライブラリをコピーする必要があります。
Flumeハンドラの構成可能な値は次のとおりです。これらのプロパティは、Javaアダプタ・プロパティ・ファイルにあります(Replicatプロパティ・ファイルにはありません)。
プロパティ名 | プロパティ値 | 必須 | 説明 |
---|---|---|---|
|
|
はい |
ハンドラのリスト。グループ化プロパティが |
|
|
はい |
使用するハンドラのタイプ。 |
|
フォーマッタ・クラスまたはショート・コード |
いいえ。デフォルトは |
使用するフォーマッタ。次のいずれかを指定できます。
あるいは、カスタム・フォーマッタを記述し、完全修飾クラス名をここに含めることもできます。 |
|
任意のファイル名 |
いいえ。デフォルトは |
デフォルトの |
|
|
いいえ。デフォルトは |
操作モードまたはトランザクション・モード。Javaアダプタのグループ化オプションは、txモードでのみ使用できます。 |
|
カスタム実装の完全修飾クラス名 |
いいえ。デフォルトは |
flumeイベントにどんなヘッダー・プロパティを追加するかを決めるクラス。 |
|
|
いいえ。デフォルトは |
各flumeイベントが操作かトランザクションかを定義する。 |
|
|
いいえ。デフォルトは |
|
|
|
いいえ。デフォルトは |
|
gg.handlerlist = flumehandler gg.handler.flumehandler.type = flume gg.handler.flumehandler.RpcClientPropertiesFile=custom-flume-rpc.properties gg.handler.flumehandler.format =avro_op gg.handler.flumehandler.mode =tx gg.handler.flumehandler.EventMapsTo=tx gg.handler.flumehandler.PropagateSchema =true gg.handler.flumehandler.includeTokens=false
この項では、Oracle GoldenGate証跡ファイルからの操作データが、異なる構成に基づいてFlumeハンドラによってどのようにFlumeイベントにマップされるかを説明します。Flumeイベントとは、Flumeエージェントを通過するデータの単位です。イベントはソースからチャネルへ、チャネルからシンクへと移動し、イベント・インタフェースの実装として表されます。イベントは、オプションでヘッダー(文字列属性)のセットを伴うペイロード(バイト配列)を搬送します。
内容は次のとおりです。
Oracle GoldenGate Java構成ファイルで、Flumeハンドラの構成は次のとおりです。
gg.handler.{name}.mode=op
Oracle GoldenGate証跡ファイルからの個々の操作のデータが、1つのFlumeイベントにマップされます。各イベントはすぐにFlumeにフラッシュされます。各Flumeイベントには、次のヘッダーがあります。
TABLE_NAME:
操作の表名。
SCHEMA_NAME
: 操作のカタログ名(使用可能な場合)とスキーマ名。
SCHEMA_HASH
: Avroスキーマのハッシュ・コード。(Avro行フォーマッタとAvro操作フォーマッタにのみ該当します。)
EventMapsTo
操作Oracle GoldenGate Java構成ファイルで、Flumeハンドラの構成は次のとおりです。
gg.handler.flume_handler_name.mode=tx
gg.handler.flume_handler_name
.EventMapsTo=op
Oracle GoldenGate証跡ファイルからの個々の操作のデータが、1つのFlumeイベントにマップされます。イベントは、トランザクションのコミット時にFlumeにフラッシュされます。各Flumeイベントには、次のヘッダーがあります。
TABLE_NAME
: 操作の表名。
SCHEMA_NAME
: 操作のカタログ名(使用可能な場合)とスキーマ名。
SCHEMA_HASH
: Avroスキーマのハッシュ・コード。(Avro行フォーマッタとAvro操作フォーマッタにのみ該当します。)
データをAvroまたは区切りテキストとしてフォーマットする場合には、このモードを使用することをお薦めします。Replicatのバッチ処理機能を構成すると、1回のトランザクションで処理される操作の数が増えることに注意してください。
EventMapsTo
トランザクションOracle GoldenGate Java構成ファイルで、Flumeハンドラの構成は次のとおりです。
gg.handler.flume_handler_name.mode=tx gg.handler.flume_handler_name.EventMapsTo=tx
ソース証跡ファイルからのトランザクションの操作すべてのデータが、連結されて1つのFlumeイベントにマップされます。イベントはトランザクションのコミット時にフラッシュされます。各Flumeイベントには、次のヘッダーがあります。
GG_TRANID
: トランザクションのトランザクションID
OP_COUNT
: このFlumeペイロード・イベントに含まれる操作の数
JSONやXMLなど自己記述型のフォーマットを使用する場合には、このモードを使用することをお薦めします。Replicatのバッチ処理機能を構成すると、1回のトランザクションで処理される操作の数が増えることに注意してください。
パフォーマンス向上のために、Replicatベースのグループ化を使用することをお薦めします。
gg.handler.
flume_handler_name
のトランザクション・モード。最高のパフォーマンスを得るためには、 EventMapsTo=tx
設定が推奨されます。
Flumeハンドラの最大ヒープ・サイズがパフォーマンスに影響する場合があります。ヒープが小さすぎると、JVMによるガベージ・コレクションが頻繁に発生することがあります。Oracle GoldenGate Javaプロパティ・ファイルでJVMの最大ヒープ・サイズを増やすと、パフォーマンスが向上する場合があります。
Flumeハンドラは、メタデータ変更イベントに適応します。 メタデータ変更イベントを処理するには、ソース証跡ファイルに、その証跡ファイルのメタデータが必要です。ただし、この機能はソースで複製されるデータベースとアップストリームのOracle GoldenGate Captureプロセスを利用してDDLイベントを取得し、複製します。この機能は、Oracle GoldenGateのすべてのデータベース実装で使用できるわけではありません。DDLレプリケーションがサポートされているかどうかを確認するには、適切なデータベース用のOracle GoldenGateのインストレーションおよび構成ガイドを参照してください。
メタデータの変更がソースで発生する場合、Flumeハンドラはそのメタデータ変更イベントを、対応するフォーマッタに通知します。フォーマッタがその表のために保持しているキャッシュ済のスキーマがある場合には、削除されます。対応するフォーマッタで、その表に対する操作が次に発生したとき、スキーマが再生成されます。
この項では、次のFlumeソース構成の例を示します。
Flumeエージェント構成ファイルからのAvro Flumeソースの構成例を次に示します。
client.type = default hosts = h1 hosts.h1 = host_ip:host_port batch-size = 100 connect-timeout = 20000 request-timeout = 20000
この項では、実装するよう選択できるFlumeハンドラの次の高度な機能について説明します。
FlumeハンドラはFlumeにスキーマを伝播できます。これがサポートされているのは現在、Avroの行フォーマッタと操作フォーマッタのみです。この機能を有効にするには、次のプロパティを設定します。
gg.handler.name
.propagateSchema=true
Avro行フォーマッタまたは操作フォーマッタは、ジャスト・イン・タイム・ベースでAvroスキーマを生成します。Avroスキーマは、表に対する操作が最初に発生したときに生成されます。メタデータ変更イベントがあると、クリアする表に対するスキーマ参照が発生するため、新しいスキーマは、その表で次に操作が発生したときに生成されます。
スキーマの伝播を有効にすると、FlumeハンドラはAvroイベントが発生したときにスキーマを伝播します。
Avroに対するデフォルトのFlumeスキーマ・イベント・ハンドラには、次の情報が含まれます。
SCHEMA_EVENT
: true
GENERIC_WRAPPER
: trueまたはfalse
TABLE_NAME
: 証跡に表れる表名
SCHEMA_NAME
: カタログ名(使用可能な場合)とスキーマ名
SCHEMA_HASH
: Avroスキーマのハッシュ・コード
Oracle GoldenGate for Big Data Flume HandlerからFlumeソースへの接続ではKerberos認証が機能します。この機能は、Thrift Flumeソースを使用するFlume 1.6.0以降でのみサポートされています。これを有効にするには、Flumeエージェント構成ファイルでFlumeソースの構成を変更します。
Flumeエージェント構成ファイルで、Kerberos認証を有効にするFlumeソース構成の例を次に示します。クライアントとサーバーのKerberosプリンシパル名を指定する必要があります。クライアント・プリンシパルのパスワードを実行時に解決できるように、Kerberos keytab
ファイルへのパスを指定する必要があります。Kerberosの管理方法、Kerberosプリンシパルおよび対応するパスワード、Kerberos keytab
ファイルの作成については、Kerberosのドキュメントを参照してください。
client.type = thrift hosts = h1 hosts.h1 =host_ip:host_port kerberos=true client-principal=flumeclient/client.example.org@EXAMPLE.ORG client-keytab=/tmp/flumeclient.keytab server-principal=flume/server.example.org@EXAMPLE.ORG
Flumeハンドラは、プライマリのFlumeソースが使用できなくなった場合にフェイルオーバーするように構成できます。この機能は現在、Avro Flumeソースを使用するFlume 1.6.0以降でのみサポートされています。これは、Flumeエージェント構成ファイルのFlumeソースの構成で有効にします。フェイルオーバー機能を有効にする構成例を次に示します。
client.type=default_failover hosts=h1 h2 h3 hosts.h1=host_ip1:host_port1 hosts.h2=host_ip2:host_port2 hosts.h3=host_ip3:host_port3 max-attempts = 3 batch-size = 100 connect-timeout = 20000 request-timeout = 20000
発生するFlumeイベントが、複数のFlumeソース間でロード・バランシングされるように、Flumeハンドラを構成できます。これは現在、Avro Flumeソースを使用するFlume 1.6.0以降でのみサポートされています。この機能は、Flumeエージェント構成ファイルのFlumeソースの構成で有効にします。ロード・バランシング機能を有効にする構成例を次に示します。
client.type = default_loadbalance hosts = h1 h2 h3 hosts.h1 = host_ip1:host_port1 hosts.h2 = host_ip2:host_port2 hosts.h3 = host_ip3:host_port3 backoff = false maxBackoff = 0 host-selector = round_robin batch-size = 100 connect-timeout = 20000 request-timeout = 20000
この項では、様々な問題のトラブルシューティングに役立つ情報を示します。内容は次のとおりです。
Javaクラスパスは、非常によくある問題の1つです。クラスパスに問題があることは、Oracle GoldenGate Java log4j
ログ・ファイルの、ClassNotFoundException
でわかります。この問題のトラブルシューティングに、Java log4j
ログ・ファイルを使用できます。ログ・レベルをDEBUG
に設定すると、ログ・ファイルに記録されるgg.classpath
オブジェクトで参照されているjarそれぞれを記録できます。この方法で、必要な依存性JARがすべて解決されることを確認できます。「クラスパス構成」を参照してください。
状況によっては、Flumeハンドラは、Flumeシンクがメッセージをディスパッチするより早くFlumeソースに書込みを行う場合があります。この場合、Flumeハンドラはしばらく動作しますが、いったんFlumeがメッセージを受け付けなくなると、異常終了します。Oracle GoldenGate Javaログ・ファイルに記録された原因はEventDeliveryException
である可能性があり、これはFlumeハンドラがイベントを送信できなかったことを示します。問題の正確な原因は、Flumeのログを確認してください。FlumeエージェントでOutOfMemoryException
が発生している場合には、Flumeチャネルを構成して、Javaヒープの容量を増やすか、構成を増やすことができます。これで問題が完全に解決しない場合もあります。Flumeシンクがメッセージをディスパッチするより早くFlumeハンドラがFlumeソースにデータをプッシュする場合は、いずれかを変更すれば、エラーになるまでFlumeハンドラが稼働する期間が広がります。
Flumeエージェント構成ファイルがクラスパスにない場合は、Flumeハンドラが起動時に異常終了します。その結果、通常は、Flumeプロデューサのプロパティをロードする際のエラーとしてConfigException
に問題がリストされます。gg.handler.
name
をチェックします。 RpcClientProperites
構成ファイルで、Flumeエージェント・プロパティ・ファイルの命名が正しいことを確認します。GoldenGateのgg.classpath
プロパティをチェックして、Flumeエージェント・プロパティ・ファイルを含むディレクトリがクラスパスに存在することを確認します。また、クラスパスをチェックして、Flumeエージェント・プロパティ・ファイルへのパスがワイルドカード(*
)文字で終わっていないことも確認します。
Flumeソースに接続できない場合、Flumeハンドラが起動時に異常終了します。この問題の根本原因は、Oracle GoldenGate Java log4j
ファイルでIOExeption
としてレポートされ、特定のホストおよびポートでFlumeに接続できなかったことを示します。次の点を確認します。
Flumeエージェント・プロセスが実行されていること。
FlumeハンドラがアクセスするFlumeエージェント構成ファイルに、正しいホストとポートが指定されていること。