15 HBaseハンドラの使用
HBaseハンドラを使用して、既存のOracle GoldenGateでサポートされているソースからHBase表に移入します。
この章では、HBaseハンドラの使用方法について説明します。
- 概要
- 詳細な機能
- HBaseハンドラの設定および実行
- セキュリティ
- メタデータ変更イベント
HBaseハンドラは、列の追加や列の削除など、メタデータ変更イベントにシームレスに対応しています。唯一の要件は、ソース証跡ファイルにメタデータが含まれることです。 - その他の考慮事項
- HBaseハンドラのトラブルシューティング
HBaseハンドラのトラブルシューティングは、Javalog4j
ファイルの内容から始まります。Javaロギング構成にある指示に従って、Javalog4j
ログ・ファイルを正しく生成するようにランタイムを構成してください。
15.1 概要
HBaseは、リレーショナル・データベース管理システム(RDBMS)の機能をほとんどエミュレートできるオープン・ソースのビッグ・データ・アプリケーションです。Hadoopは、大量の非構造化データを格納する目的で設計されています。逆に、データベースに格納され、Oracle GoldenGateを通じて複製されるデータは、高度に構造化されています。HBaseには、データの重要な構造を維持しながら、Hadoop分散ファイル・システム(HDFS)によって提供される水平方向のスケーリングの利点を活かす方法があります。
親トピック: HBaseハンドラの使用
15.2 詳細な機能
HBaseハンドラは、ソース証跡ファイルから操作を取得し、対応する表をHBaseに作成してから、変更取得データをその表にロードします。
HBase表名
HBaseに作成される表名は、ソース証跡ファイルからの操作の対応する表名にマップされます。表名では、大文字と小文字が区別されます。
HBase表のネームスペース
2部構成の表名(スキーマ名と表名)の場合、スキーマ名はHBase表のネームスペースにマップされます。Catalog.Schema.MyTable
のような3部構成の表名の場合、作成されるHBaseネームスペースはCatalog_Schema
となります。HBase表のネームスペースは大/小文字が区別されます。NULLスキーマ名がサポートされており、デフォルトのHBaseネームスペースにマップされます。
HBase行キー
HBaseには、データベースの主キーと似たHBase行キーという概念があります。HBase行キーは、表の行を示す一意の識別子です。HBaseがサポートするのは1行当たり1つの行キーのみで、空またはNULLにはできません。HBaseハンドラは、主キー値をHBase行キー値にマップします。ソース表に複数の主キーがある場合、主キー値は連結され、パイプ・デリミタ(|
)で区切られます。HBaseの行キーのデリミタを構成できます。
KEYCOLS
を指定すると、KEYCOLS
句で定義された指定に基づいてキーが構成されます。-
KEYCOLS
の指定がない場合は、表の適格なすべての列の連結に基づいて、キーが構築されます。
その結果、すべての列の値が連結されてHBase rowkeyが生成されます。ただし、これはお薦めできません。
回避策: replicatマッピング文を使用して、1つ以上の主キー列を識別します。たとえば: MAP QASOURCE.TCUSTORD, TARGET QASOURCE.TCUSTORD, KEYCOLS (CUST_CODE);
HBaseの列ファミリ
HBaseには、列ファミリという概念があります。列ファミリは、列データをグループ化する方法です。サポートされるのは、1つの列ファミリのみです。HBaseの各列は、1つの列ファミリに属している必要があります。HBaseハンドラには、表ごとに1つの列ファミリがあり、デフォルトはcf
です。列ファミリ名を構成できます。ただし、特定の列ファミリ名で表を作成した場合は、HBaseサンプルで列ファミリ名を再構成できません。先にその表を変更または削除しないと、Oracle GoldenGate Replicatプロセスが異常終了します。
親トピック: HBaseハンドラの使用
15.3 HBaseハンドラの設定および実行
HBaseは、HBaseハンドラ・プロセスと同じ場所に配置して稼働しているか、HBaseハンドラ・プロセスをホストしているネットワークから接続できるマシン上で稼働している必要があります。また、HBaseデータのリポジトリとして機能している、基礎となるHDFSの単一インスタンスまたはクラスタ化されたインスタンスが稼働している必要があります。
このトピックでは、HBaseハンドラのコンポーネントの構成およびハンドラの実行について説明します。
15.3.1 クラスパス構成
HBaseハンドラをHBaseに接続してデータをストリーミングするには、hbase-site.xmlファイルおよびHBaseクライアントjarが、gg.classpath
変数で構成されている必要があります。HBaseクライアントjarは、HBaseハンドラが接続するHBaseのバージョンと一致する必要があります。HBaseクライアントjarは、Oracle GoldenGate for Big Data製品に付属しません。
バージョンごとに必要なHBaseクライアントjarのリストは、「HBaseハンドラ・クライアント依存性」を参照してください。
hbase-site.xml
ファイルのデフォルトの場所は、HBase_Home
/conf
です。
HBaseクライアントJARのデフォルトの場所は、HBase_Home
/lib/*
です。
HBaseハンドラがWindowsで実行されている場合は、Windowsのクラスパス指定構文に従います。
gg.classpath
は、説明に従って正確に構成する必要があります。hbase-site.xml
ファイルのパスには、ワイルドカードが付加されていないパスのみを使用してください。hbase-site.xml
ファイルのパスにワイルドカード(*)を含めると、アクセスできなくなります。逆に、依存関係jarのパスには、そのディレクトリにあるjarファイルがすべて関連するクラスパスに含まれるように、ワイルドカード(*)を含める必要があります。*.jar
は使用しないでください。正しく構成されたgg.classpath
変数の例を次に示します。
gg.classpath=/var/lib/hbase/lib/*:/var/lib/hbase/conf
親トピック: HBaseハンドラの設定および実行
15.3.2 HBaseハンドラ構成
HBaseハンドラの構成可能な値は次のとおりです。これらのプロパティは、Javaアダプタ・プロパティ・ファイルにあります(Replicatプロパティ・ファイルにはありません)。
HBaseハンドラの選択を有効にするには、まずgg.handler.jdbc.type=hbase
を指定してハンドラ・タイプを構成してから、次に示す他のHBaseプロパティを構成する必要があります。
表15-1 HBaseハンドラの構成プロパティ
プロパティ | 必須/オプション | 有効な値 | デフォルト | 説明 |
---|---|---|---|---|
|
必須 |
任意の文字列。 |
なし |
HBaseハンドラの名前を指定します。HBaseハンドラ名は、この表にリストしたプロパティ名の一部になります。 |
|
必須 |
|
なし |
HBaseハンドラを選択し、変更データ取得をHBaseにストリーミングします |
|
オプション |
HBase列ファミリ名として有効な任意の文字列。 |
|
列ファミリは、HBaseで列をグループ化するメカニズムです。HBaseハンドラは1つの列ファミリのみをサポートします。 |
gg.handler.name.HBase20Compatible |
オプション | true | false |
false (HBase 1.0互換)
|
HBase 2.xでは、メソッドおよび変更されたオブジェクトの階層が削除されました。その結果、HBase 1.xとのバイナリ互換性が損なわれました。このプロパティにtrue を設定すると、HBase 2.xとのインタフェースが正しく設定されます。falseを設定すると、HBase 1.x互換性が使用されます。
|
|
オプション |
|
|
|
|
オプション |
任意の文字列。 |
|
マップにおけるキーと値の間の区切り文字を指定します。たとえば、 |
|
オプション |
任意の文字列。 |
|
マップにおけるキー/値ペアの間の区切り文字を指定します。たとえば、 |
|
オプション |
Javaでサポートされるエンコーディング名または別名脚注1。サポートされるオプションのリストは、 |
Oracle GoldenGateプロセスをホストしているマシンのネイティブのシステム・エンコーディング |
HBaseに書き込まれる値のエンコーディングを決めます。HBase値はバイトとして書き込まれます。 |
|
オプション |
|
|
HBaseハンドラが、主キーを変更する更新操作をどのように処理するかに関する構成を指定します。主キーを操作するとHBaseハンドラで問題が起きることがあるので、ユーザーは特に慎重を期する必要があります。
|
|
オプション |
任意の文字列。 |
|
列の値がNULLの場合にHBaseに送信される内容を構成できます。デフォルトは |
|
オプション |
|
なし |
このプロパティを |
|
オプション( |
Kerberos |
- |
|
|
オプション( |
|
- |
Kerberos認証で用いるKerberosプリンシパル名。 |
|
オプション |
任意の文字列/ |
| |
HBase |
|
オプション |
|
|
|
|
オプション |
|
|
|
脚注1
https://docs.oracle.com/javase/8/docs/technotes/guides/intl/
でJava国際化のサポートを参照してください。
親トピック: HBaseハンドラの設定および実行
15.3.3 サンプル構成
Javaアダプタ・プロパティ・ファイルからのHBaseハンドラの構成例を次に示します。
gg.handlerlist=hbase gg.handler.hbase.type=hbase gg.handler.hbase.mode=tx gg.handler.hbase.hBaseColumnFamilyName=cf gg.handler.hbase.includeTokens=true gg.handler.hbase.keyValueDelimiter=CDATA[=] gg.handler.hbase.keyValuePairDelimiter=CDATA[,] gg.handler.hbase.encoding=UTF-8 gg.handler.hbase.pkUpdateHandling=abend gg.handler.hbase.nullValueRepresentation=CDATA[NULL] gg.handler.hbase.authType=none
親トピック: HBaseハンドラの設定および実行
15.3.4 パフォーマンスに関する考慮事項
トランザクションをコミットするたびに、HBaseハンドラがフラッシュ・コールを実行し、バッファされていたデータをHBaseリージョン・サーバーにフラッシュします。書込み永続性を維持するために、これを実行する必要があります。HBaseリージョン・サーバーへのフラッシュは負荷の高いコールなので、Replicat GROUPTRANSOPS
パラメータを使用して、ソース証跡ファイルの複数の小さいトランザクションを、HBaseに適用される1つの大きいトランザクションにグループ化すると、パフォーマンスが大幅に向上することがあります。Replicat構成ファイルで構成構文を追加すると、Replicatベースのバッチ処理を使用できます。
複数のトランザクションからの操作は、大きいトランザクションにまとめられますが、これはトランザクションがコミットされたグループ化されたトランザクションの最後だけです。
親トピック: HBaseハンドラの設定および実行
15.4 セキュリティ
HBase接続は、Kerberos認証を使用して保護できます。HBaseクラスタを保護するには、HBaseリリースの関連するドキュメントに従ってください。HBaseハンドラは、Kerberosで保護されたクラスタに接続できます。HBase hbase-site.xml
がハンドラのクラスパスにあり、hbase.security.authentication
プロパティをkerberos
に、hbase.security.authorization
プロパティをtrue
に設定する必要があります。
クラスパスにHDFS core-site.xml
ファイルを含むディレクトリが含まれている必要があります。Kerberos認証は、Hadoop UserGroupInformation
クラスを使用して実行されます。このクラスは、kinit
コマンドを正常に実行するために、kerberos
に設定されるHadoop構成プロパティhadoop.security.authentication
に依存しています。
また、HBaseハンドラのJava構成ファイルで次のプロパティを設定する必要があります。
gg.handler.{name}.authType=kerberos gg.handler.{name}.keberosPrincipalName={legal Kerberos principal name} gg.handler.{name}.kerberosKeytabFile={path to a keytab file that contains the password for the Kerberos principal so that the Oracle GoldenGate HDFS handler can programmatically perform the Kerberos kinit operations to obtain a Kerberos ticket}.
keytab
ファイルからKerberosパスワードを復号化できない場合があります。これによって、Kerberos認証が対話型モードにフォール・バックされ、プログラムで呼び出されているため機能しなくなります。この問題の原因は、Java Cryptography Extension (JCE)が、Java Runtime Environment (JRE)にインストールされていないことです。JCEがJREにロードされていることを確認します。http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.htmlを参照してください。
親トピック: HBaseハンドラの使用
15.5 メタデータ変更イベント
HBaseハンドラは、列の追加や列の削除など、メタデータ変更イベントにシームレスに対応しています。唯一の要件は、ソース証跡ファイルにメタデータが含まれることです。
親トピック: HBaseハンドラの使用
15.6 その他の考慮事項
HBaseハンドラの初期設定でよくある問題は、クラスパスです。これを典型的に示しているのが、Java log4j
ログ・ファイルに出現するClassNotFoundException
です。HBaseクライアントjarは、Oracle GoldenGate for Big Dataには付属しません。必要なHBaseクライアントjarを解決する必要があります。「HBaseハンドラ・クライアント依存性」には、サポートされている各バージョンのHBaseクライアントjarのリストがあります。hbase-site.xml
、または1つ以上の必須のクライアントJARがクラスパスに含まれていません。HBaseハンドラのクラスパスの構成については、「クラスパス構成」を参照してください。
親トピック: HBaseハンドラの使用
15.7 HBaseハンドラのトラブルシューティング
HBaseハンドラのトラブルシューティングは、Java log4j
ファイルの内容から始まります。Javaロギング構成にある指示に従って、Java log4j
ログ・ファイルを正しく生成するようにランタイムを構成してください。
15.7.1 Javaクラスパス
Javaクラスパスの問題が一般的です。Java log4j
ログ・ファイルのClassNotFoundException
は、クラスパスに問題があることを示しています。Java log4j
ログ・ファイルを使用して、この問題のトラブルシューティングを行うことができます。ログ・レベルをDEBUG
に設定すると、gg.classpath
オブジェクトで参照されているjarそれぞれがログ・ファイルに記録されます。DEBUG
レベルのロギングを有効にし、ログ・ファイルで次のようなメッセージを探すと、必要な依存関係jarがすべて解決されることを確認できます。
2015-09-29 13:04:26 DEBUG ConfigClassPath:74 - ...adding to classpath: url="file:/ggwork/hbase/hbase-1.0.1.1/lib/hbase-server-1.0.1.1.jar"
親トピック: HBaseハンドラのトラブルシューティング
15.7.2 HBase接続プロパティ
HDFS hbase-site.xml
ファイル(デフォルト設定を含んでいる)の内容は、ロギング・レベルを DEBUG
またはTRACE
に設定している場合に、Java log4j
ログ・ファイルに出力されます。このファイルには、HBaseへの接続プロパティが示されます。Javaのlog4j
ログ・ファイルで次のものを検索します。
2015-09-29 13:04:27 DEBUG HBaseWriter:449 - Begin - HBase configuration object contents for connection troubleshooting. Key: [hbase.auth.token.max.lifetime] Value: [604800000].
一般的に、hbase-site.xml
ファイルがクラスパスに含まれていないか、hbase-site.xml
ファイルのパスが正しくありません。この場合、HBaseハンドラはHBaseへの接続を確立できず、Oracle GoldenGateプロセスは異常終了します。Java log4j
ログでは、次のエラーが報告されます。
2015-09-29 12:49:29 ERROR HBaseHandler:207 - Failed to initialize the HBase handler. org.apache.hadoop.hbase.ZooKeeperConnectionException: Can't connect to ZooKeeper
クラスパスに正しくhbase-site.xml
ファイルが含まれており、HBaseが稼働していることを確認してください。
親トピック: HBaseハンドラのトラブルシューティング
15.7.3 ハンドラ構成のロギング
Javaのlog4j
ログ・ファイルには、HBaseハンドラの構成状態に関する情報が含まれています。この情報は、INFO
ログ・レベルで出力されます。次に、サンプルの出力を示します。
2015-09-29 12:45:53 INFO HBaseHandler:194 - **** Begin HBase Handler - Configuration Summary **** Mode of operation is set to tx. HBase data will be encoded using the native system encoding. In the event of a primary key update, the HBase Handler will ABEND. HBase column data will use the column family name [cf]. The HBase Handler will not include tokens in the HBase data. The HBase Handler has been configured to use [=] as the delimiter between keys and values. The HBase Handler has been configured to use [,] as the delimiter between key values pairs. The HBase Handler has been configured to output [NULL] for null values. Hbase Handler Authentication type has been configured to use [none]
親トピック: HBaseハンドラのトラブルシューティング
15.7.4 HBaseハンドラの削除-挿入の問題
gg.handler.name.setHBaseOperationTimestamp=false
構成プロパティを指定してHBaseハンドラを使用している場合、ソース・データベースがHBaseの表内のデータと同期しなくなることがあります。これは、行の削除に続く、その行の即時再挿入が原因で発生します。HBaseでは、特定のタイムスタンプで識別される、削除用のツームストン・マーカーが作成されます。このツームストン・マーカーは、HBase内の同じ行キーを持つすべての行レコードに削除のマークを付け、これらのレコードにはツームストン・マーカーよりも前か、または同じタイムスタンプが付いています。これは、削除された行がすぐに再挿入されたときに発生します。挿入操作にたまたま削除操作と同じタイムスタンプがあると、その削除操作によって後続の挿入操作が誤って削除されたように見えることがあります。
この問題を回避するには、gg.handler.name.setHbaseOperationTimestamp=を
に設定する必要があり、これは次の2つのことを行います。
-
HBaseハンドラの行操作用のタイムスタンプの設定。
-
挿入操作がその挿入の後のタイムスタンプを持つことを保証する、削除-挿入操作の検出。
gg.handler.name.setHbaseOperationTimestamp
のデフォルトはtrue
で、これは、HBaseサーバーが行のタイムスタンプを提供することを意味します。これにより、HBaseで削除-再挿入を行うと非同期になる問題が回避されます。
HBaseハンドラで行操作のタイムスタンプを設定すると、次のような結果になります。
-
タイムスタンプがクライアント側で設定されているため、複数のアプリケーションが同じHBase表にデータをフィードしている場合に問題が発生する可能性があります。
-
削除と再挿入がユースケースの一般的なパターンである場合、HBaseハンドラでは、このシナリオに遭遇するたびにタイムスタンプを1ミリ秒増分する必要があります。
処理をあまり先送りにはできないため、HBaseハンドラでは、プロセスを待機させる前にタイムスタンプを100ミリ秒未来に進めることのみを許し、クライアント側のHBase操作のタイムスタンプと実際の時間との同期が戻るようにしています。ソース・データベースで更新のかわりに削除-挿入が使用される場合、この同期シナリオはよくあることです。このシナリオが一般的な場合、未来に向けて100ミリ秒を超えるHBaseのタイムスタンプが許されないことが処理速度に影響する可能性があります。
親トピック: HBaseハンドラのトラブルシューティング