第65章 HBase


HBase コンポーネント

重要
Camel HBase は Apache Karaf ではサポートされません。
Camel 2.10 以降で利用可能
このコンポーネントは、Apache HBase のべき等リポジトリー、プロデューサー、およびコンシューマーを提供します。
Maven ユーザーは、このコンポーネントの pom.xml に以下の依存関係を追加する必要があります。
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-hbase</artifactId>
    <version>2.17.0.redhat-630xxx</version>
    <!-- use the same version as your Camel core version -->
</dependency>
Copy to Clipboard Toggle word wrap

Apache HBase の概要

HBase は、Google の Bigtable: A Distributed Storage System for Structured Data の後にモデル化された、オープンソースの分散型バージョン管理された列指向のストアです。Big Data へのランダムでリアルタイム読み取り/書き込みアクセスが必要な場合は、HBase を使用できます。詳細は、Apache HBase を参照してください。

Camel および HBase

camel ルート内で datasotre を使用する場合は、Camel メッセージがデータストアにどのように保存されるかを指定する常にチャーンがあります。ドキュメントベースのストアでは、メッセージボディーをドキュメントに直接マッピングできるため、より簡単になります。リレーショナルデータベースでは、ORM ソリューションを使用してプロパティーを列などにマップできます。列ベースのストアには、このようなマッピングを実行する標準的な方法がないため、より困難です。
HBase は、さらに 2 つの課題を追加します。
  • HBase は列をファミリーにグループ化するため、命名規則を使用してプロパティーを列にマッピングするだけでは不十分です。
  • HBase には 型の概念がありません。つまり、すべてを byte[] として格納し、byte[] が String、Number、シリアル化された Java オブジェクト、またはバイナリーデータのみを表しているかどうかは認識されません。
これらの課題を解決するために、camel-hbase はメッセージヘッダーを使用して、メッセージの HBase 列へのマッピングを指定します。また、HBase データをモデル化し、xml/json との間で簡単に変換できる camel-hbase 提供クラスを使用する機能も提供します。最後に、ユーザーが独自のマッピングストラテジーを実装して使用する機能を提供します。
camel-hbase マッピングストラテジーに関係なく、メッセージを org.apache.camel.component.hbase.model.HBaseData オブジェクトに変換し、そのオブジェクトを内部操作に使用します。

コンポーネントの設定

HBase コンポーネントは、カスタム HBaseConfiguration オブジェクトをプロパティーとして指定するか、クラスパスにある HBase 関連のリソースに基づいて、独自の HBase 設定オブジェクトを作成できます。
    <bean id="hbase" class="org.apache.camel.component.hbase.HBaseComponent">
        <property name="configuration" ref="config"/>
    </bean>
Copy to Clipboard Toggle word wrap
コンポーネントに設定オブジェクトが指定されていない場合、コンポーネントはこれを作成します。作成した設定は、設定を取り出す hbase-site.xml ファイルのクラスパスを検索します。HBase クライアントの設定方法の詳細は、HBase client configuration and dependenciesを参照してください。

HBase プロデューサー

上記のように、Camel は HBase の produers エンドポイントを提供します。これにより、Camel ルートを使用して HBase からデータを保存、削除、取得、またはクエリーできます。
hbase://table[?options]
Copy to Clipboard Toggle word wrap
table はテーブル名です。
サポートされる操作は以下のとおりです。
  • Put
  • Get
  • 削除
  • スキャン

プロデューサーでサポートされる URI オプション

Expand
名前 デフォルト値 説明
operation CamelHBasePut 実行する HBase 操作。サポートされる値:CamelHBasePutCamelHBaseGetCamelHBaseDelete、および CamelHBaseScan
maxResults 100 スキャンする行の最大数。サポートされる操作:CamelHBaseScan
mappingStrategyName header Camel メッセージを HBase 列にマッピングするために使用するストラテジー。サポートされる値は、ヘッダー、または ボディー です。
mappingStrategyClassName null カスタムマッピングストラテジー実装のクラス名。
filters null フィルターの一覧。サポートされる操作:CamelHBaseScan
userGroupInformation UserGroupInformation Camel 2.17: Kerberos を使用する場合など、HBase と通信する権限を定義します。
row.xxx null
Camel 2.17: キー/値を HBaseRow モデルにマッピングするのに使用されます。Camel 2.17 以降 では、マッピングでは row. 接頭辞を使用する必要があります。キーは、ヘッダーマッピングテーブルに以下に一覧表示されます。たとえば、以下のようになります。 row.family=info&row.qualifier=firstName&row.family2=birthdate&row.qualifier2=year
ヘッダーマッピングのオプション:
Expand
名前 デフォルト値 説明
rowId 行の ID。これは、通常 Exchange ごとの行の変更として使用が制限されています。
rowType 文字列 行 ID に対応するタイプ。サポートされる操作:CamelHBaseScan
family 列ファミリー。複数の列を参照するための数字接尾辞を サポート します。
修飾子 列修飾子。複数の列を参照するための数字接尾辞を サポート します。
value 値。複数の列を参照するための数字接尾辞を サポート します。
valueType 文字列 値のタイプ。複数の列を参照するための数字接尾辞をサポートします。サポートされる操作:CamelHBaseGet および CamelHBaseScan

操作を配置します。

HBase は列ベースのストアで、特定の行の特定の列にデータを保存できます。列はファミリーにグループ化されるため、列を指定するには、列ファミリーとその列の修飾子を指定する必要があります。特定の列にデータを保存するには、列と行の両方を指定する必要があります。
camel ルートから HBase にデータを保存する最も単純なシナリオでは、メッセージボディーの一部を指定の HBase 列に保存します。
        <route>
            <from uri="direct:in"/>
            <!-- Set the HBase Row -->
            <setHeader headerName="CamelHBaseRowId">
                <el>${in.body.id}</el>
            </setHeader>
            <!-- Set the HBase Value -->
            <setHeader headerName="CamelHBaseValue">
                <el>${in.body.value}</el>
            </setHeader>
            <to uri="hbase:mytable?operation=CamelHBasePut&amily=myfamily&ualifier=myqualifier"/>
        </route>
Copy to Clipboard Toggle word wrap
上記のルートは、メッセージボディーに id および value プロパティーを持つオブジェクトが含まれ、値の内容を id で指定された行の HBase 列 myfamily:myqualifier に保存します。複数の列と値のペアを指定する必要がある場合は、追加の列マッピングを指定できます。2 番目のヘッダーからの数字(例: RowId2, RowId3, RowId4 など)を使用する必要があります。最初のヘッダーのみには数字 1 がありません。
        <route>
            <from uri="direct:in"/>
            <!-- Set the HBase Row 1st column -->
            <setHeader headerName="CamelHBaseRowId">
                <el>${in.body.id}</el>
            </setHeader>
            <!-- Set the HBase Row 2nd column -->
            <setHeader headerName="CamelHBaseRowId2">
                <el>${in.body.id}</el>
            </setHeader>
            <!-- Set the HBase Value for 1st column -->
            <setHeader headerName="CamelHBaseValue">
                <el>${in.body.value}</el>
            </setHeader>
            <!-- Set the HBase Value for 2nd column -->
            <setHeader headerName="CamelHBaseValue2">
                <el>${in.body.othervalue}</el>
            </setHeader>
            <to uri="hbase:mytable?operation=CamelHBasePut&amily=myfamily&ualifier=myqualifier&amily2=myfamily&ualifier2=myqualifier2"/>
        </route>
Copy to Clipboard Toggle word wrap
uri オプション、メッセージヘッダー、またはその両方の組み合わせを使用できることを覚えておくことが重要です。定数を URI の一部として指定し、動的な値をヘッダーとして指定することが推奨されます。何かがヘッダーとして定義され、uri の一部として定義されている場合、ヘッダーが使用されます。

操作を取得します。

Get Operation は、指定された HBase 行から 1 つ以上の値を取得するために使用される操作です。取得する値を指定するには、uri の一部として指定するか、メッセージヘッダーとして指定できます。
        <route>
            <from uri="direct:in"/>
            <!-- Set the HBase Row of the Get -->
            <setHeader headerName="CamelHBaseRowId">
                <el>${in.body.id}</el>
            </setHeader>
            <to uri="hbase:mytable?operation=CamelHBaseGet&amily=myfamily&ualifier=myqualifier&alueType=java.lang.Long"/>
            <to uri="log:out"/>
        </route>
Copy to Clipboard Toggle word wrap
上記の例では、get 操作の結果は CamelHBaseValue という名前のヘッダーとして保存されます。

操作を削除します。

camel-hbase で HBase delete 操作を実行することもできます。delete 操作は、行全体を削除します。指定する必要があるのは、メッセージヘッダーの一部として 1 つ以上の行になります。
        <route>
            <from uri="direct:in"/>
            <!-- Set the HBase Row of the Get -->
            <setHeader headerName="CamelHBaseRowId">
                <el>${in.body.id}</el>
            </setHeader>
            <to uri="hbase:mytable?operation=CamelHBaseDelete"/>
        </route>
Copy to Clipboard Toggle word wrap

スキャン操作。

スキャン操作は HBase のクエリーと同等です。スキャン操作を使用して、複数の行を取得できます。結果の一部となる列を指定し、値をオブジェクトに変換する方法を指定するには、uri オプションまたはヘッダーを使用します。
        <route>
            <from uri="direct:in"/>
            <to uri="hbase:mytable?operation=CamelHBaseScan&amily=myfamily&ualifier=myqualifier&alueType=java.lang.Long&owType=java.lang.String"/>
            <to uri="log:out"/>
        </route>
Copy to Clipboard Toggle word wrap
この場合、結果を制限するためにフィルターの一覧も指定する必要があります。フィルターのリストを uri の一部として指定できます。Camel はフィルターすべてを満たす行のみ 返します。メッセージの一部である情報を認識するフィルターを設定するには、Camel は ModelAwareFilter を定義します。これにより、フィルターがメッセージとマッピングストラテジーで定義されるモデルを考慮することができます。ModelAwareFilter camel-hbase を使用すると、選択したマッピングストラテジーが in メッセージに適用され、マッピングをモデル化する オブジェクトが作成され、そのオブジェクトを Filter に渡します。
たとえば、メッセージヘッダーとして を使用してスキャンを実行するには、以下のように ModelAwareColumnMatchingFilter を使用します。
        <route>
            <from uri="direct:scan"/>
            <!-- Set the Criteria -->
            <setHeader headerName="CamelHBaseFamily">
                <constant>name</constant>
            </setHeader>
            <setHeader headerName="CamelHBaseQualifier">
                <constant>first</constant>
            </setHeader>
            <setHeader headerName="CamelHBaseValue">
                <el>in.body.firstName</el>
            </setHeader>
            <setHeader headerName="CamelHBaseFamily2">
                <constant>name</constant>
            </setHeader>
            <setHeader headerName="CamelHBaseQualifier2">
                <constant>last</constant>
            </setHeader>
            <setHeader headerName="CamelHBaseValue2">
                <el>in.body.lastName</el>
            </setHeader>
            <!-- Set additional fields that you want to be return by skipping value -->
            <setHeader headerName="CamelHBaseFamily3">
                <constant>address</constant>
            </setHeader>
            <setHeader headerName="CamelHBaseQualifier3">
                <constant>country</constant>
            </setHeader>
            <to uri="hbase:mytable?operation=CamelHBaseScan&ilters=#myFilterList"/>
        </route>

        <bean id="myFilters" class="java.util.ArrayList">
            <constructor-arg>
                <list>
                    <bean class="org.apache.camel.component.hbase.filters.ModelAwareColumnMatchingFilter"/>
                </list>
            </constructor-arg>
        </bean>
Copy to Clipboard Toggle word wrap
上記のルートは、pojo プロパティーが firstName で、lastName プロパティーがメッセージボディーとして渡されると仮定し、これらのプロパティーを取得し、それらをメッセージヘッダーの一部として追加します。デフォルトのマッピングストラテジーは、ヘッダーを HBase 列にマップするモデルオブジェクトを作成し、そのモデルを ModelAwareColumnMatchingFilter に渡します。フィルターは、モデルに一致する列が含まれていない行を除外します。サンプルによるクエリーに似ています。

HBase コンシューマー

Camel HBase Consumer は、指定された HBase テーブルで繰り返しスキャンを実行し、メッセージの一部としてスキャン結果を返します。ヘッダーマッピング(デフォルト)またはボディーマッピングのいずれかを指定できます。後ほど、org.apache.camel.component.hbase.model.HBaseData をメッセージボディーの一部として追加します。
hbase://table[?options]
Copy to Clipboard Toggle word wrap
uri オプションの一部として、返す列とそのタイプを指定できます。
hbase:mutable?family=name&qualifer=first&valueType=java.lang.String&family=address&qualifer=number&valueType2=java.lang.Integer&rowType=java.lang.Long
Copy to Clipboard Toggle word wrap
上記の例では、指定されたフィールドで設定されるモデルオブジェクトを作成し、スキャン結果によりモデルオブジェクトに値が設定されます。最後に、マッピングストラテジーは、このモデルを Camel メッセージにマッピングするために使用されます。

コンシューマーでサポートされている URI オプション

Expand
名前 デフォルト値 説明
initialDelay 1000 最初のポーリングが開始されるまでの時間(ミリ秒単位)。
delay 500 次のポーリングまでの時間 (ミリ秒単位)。
useFixedDelay true 固定遅延または固定レートを使用するかどうかを制御します。詳細は、JDK の ScheduledExecutorService を参照してください。
timeUnit TimeUnit.MILLISECONDS initialDelay および delay オプションの時間単位。
runLoggingLevel TRACE Camel 2.8: コンシューマーはポーリング時に開始/完了のログ行をログに記録します。このオプションを使用すると、ログレベルを設定できます。
operation CamelHBasePut 実行する HBase 操作。サポートされる値:CamelHBasePutCamelHBaseGetCamelHBaseDelete、および CamelHBaseScan
maxResults 100 スキャンする行の最大数。サポートされる操作:CamelHBaseScan
mappingStrategyName header Camel メッセージを HBase 列にマッピングするために使用するストラテジー。サポートされる値は、ヘッダー、または ボディー です。
mappingStrategyClassName null カスタムマッピングストラテジー実装のクラス名。
filters null フィルターの一覧。サポートされる操作:CamelHBaseScan
remove true true の場合、Camel HBase Consumer は処理する行を削除します。
userGroupInformation UserGroupInformation Camel 2.17: Kerberos を使用する場合など、HBase と通信する権限を定義します。
ヘッダーマッピングのオプション:
Expand
名前 デフォルト値 説明
rowId 行の ID。これは、通常 Exchange ごとの行の変更として使用が制限されています。
rowType 文字列 行 ID に対応するタイプ。サポートされる操作: CamelHBaseScan
family 列ファミリー。**upports には、複数の列を参照するための数字の接尾辞が含まれます。
修飾子 列修飾子。*複数の列を参照するための数字接尾辞をサポートします。
value 値。複数の列を参照するための数字接尾辞をサポートします。
rowModel 文字列 各行のモデル化方法を記述する org.apache.camel.component.hbase.model.HBaseRow のインスタンス
rowModel のロールが明確でない場合、URI オプション(ファミリー、修飾子、タイプなど)を使用して "describ" ではなく、HBaseRow modle をプログラムで構築できます。

HBase Idempotent リポジトリー

camel-hbase コンポーネントは、各メッセージが一度だけ処理されるようにするときに使用できるべき等リポジトリーも提供します。HBase idempotent リポジトリーは、テーブル、列ファミリー、列修飾子で設定され、そのテーブルにメッセージごとに行を作成します。
HBaseConfiguration configuration = HBaseConfiguration.create();
HBaseIdempotentRepository repository = new HBaseIdempotentRepository(configuration, tableName, family, qualifier);

from("direct:in")
  .idempotentConsumer(header("messageId"), repository)
  .to("log:out);
Copy to Clipboard Toggle word wrap

HBase マッピング

前述のように、デフォルトのマッピングストラテジーが ヘッダー および ボディー マッピングであることが分かります。以下は、各マッピングストラテジーの仕組みの詳細な例になります。

HBase ヘッダーマッピングの例

ヘッダーマッピングはデフォルトのマッピングです。値 myvalue を HBase 行 myrow と列 myfamily:mycolum に指定するには、メッセージには以下のヘッダーが含まれている必要があります。
Expand
ヘッダー
CamelHBaseRowId myrow
CamelHBaseFamily myfamily
CamelHBaseQualifier myqualifier
CamelHBaseValue myvalue
異なる列および / または異なる行により多くの値を配置するには、ヘッダーのインデックスで接尾辞が付いたヘッダーを追加で指定できます。以下に例を示します。
Expand
ヘッダー
CamelHBaseRowId myrow
CamelHBaseFamily myfamily
CamelHBaseQualifier myqualifier
CamelHBaseValue myvalue
CamelHBaseRowId2 myrow2
CamelHBaseFamily2 myfamily
CamelHBaseQualifier2 myqualifier
CamelHBaseValue2 myvalue2
get や scan などの取得操作では、データの変換先となるタイプごとに、各列に を指定することもできます。以下に例を示します。
Expand
ヘッダー
CamelHBaseFamily myfamily
CamelHBaseQualifier myqualifier
CamelHBaseValueType Long
すべてのメッセージに対して定数とみなされるボイラープレートヘッダーを回避するために、以下のようにエンドポイント URI の一部として指定することもできます。

ボディーマッピングの例

ボディーマッピングストラテジーを使用するには、URI の一部としてオプション mappingStrategy を指定する必要があります。以下に例を示します。
hbase:mytable?mappingStrategy=body
Copy to Clipboard Toggle word wrap
ボディーマッピングストラテジーを使用するには、ボディーに org.apache.camel.component.hbase.model.HBaseData のインスタンスが含まれている必要があります。構築できます
HBaseData data = new HBaseData();
HBaseRow row = new HBaseRow();
row.setId("myRowId");
HBaseCell cell = new HBaseCell();
cell.setFamily("myfamily");
cell.setQualifier("myqualifier");
cell.setValue("myValue");
row.getCells().add(cell);
data.addRows().add(row);
Copy to Clipboard Toggle word wrap
上記のオブジェクトは put 操作で使用することができます。たとえば、ID myRowId で行を作成または更新し、値 myvalue を列 myfamily:myqualifier に追加します。ボディーマッピングストラテジーが最初に認識されない可能性があります。ヘッダーマッピングストラテジーに対する利点は、HBaseData オブジェクトを xml/json との間で簡単に変換できることです。

その他の参考資料

トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat