以前の投稿では、MorphlineSolrSinkでApache Flumeを使用して、バッチモードでほぼリアルタイムに電子メールメッセージのインデックスを作成する方法を学びました。この投稿では、NGDATAとClouderaによって管理されているApacheHBaseとLilyHBaseIndexerでClouderaSearchを使用してメールのインデックスを作成する方法を学習します。 (前の投稿をまだ読んでいない場合は、読み進める前に背景として読むことをお勧めします。)
HBaseIndexerとFlumeMorphlineSolrSinkのどちらを選択するかは、ユースケースに完全に依存しますが、その決定を行う際に考慮すべき点がいくつかあります。
- HBaseは特定のユースケースに最適なストレージメディアですか?
- データはすでにHBaseに取り込まれていますか?
- ファイルをHFiles以外の形式で保存する必要があるアクセスパターンはありますか?
- HBaseが現在実行されていない場合、HBaseを起動するのに十分なハードウェアリソースがありますか?
HBaseに保存されているドキュメントにインデックスを付けるようにClouderaSearchを構成するには、構成ファイルを直接変更してLily HBase Indexerを手動またはサービスとして起動する方法と、ClouderaManagerを使用してすべてを構成する方法の2つがあります。この投稿では後者に焦点を当てます。これは、HBaseでの検索、またはCDHでの他のサービスを有効にする最も簡単な方法であるためです。
HBaseレプリケーションとLilyHBaseインデクサーについて
このソリューションを設計する際、ClouderaはHBaseのインデックス作成を効果的にするための4つの主要な要件を特定しました。
- インデックス作成のレイテンシは、ほぼリアルタイム(秒)で調整可能である必要があります
- 挿入、更新、削除がHBaseに適用されている間、Solrインデックスは最終的にHBaseテーブルと一致している必要があります
- インデックス作成メカニズムは、スケーラブルでフォールトトレラントである必要があります
- インデックス作成プロセスでHBaseの書き込みを遅くすることはできません
これらの要件を満たすために、ClouderaSearchはHBaseのネイティブレプリケーションメカニズムを使用します。 HBaseレプリケーションに慣れていない人のために、ここに簡潔で非常に高レベルの要約があります:
更新が先行書き込みログ(WAL)に適用されると、HBaseRegionServerはこれらの更新を別のスレッドでリッスンします。そのスレッドのバッファがいっぱいになるか、ファイルの終わりに達すると、複製されたすべての更新を含むバッチが、別のクラスタで実行されているピアのRegionServerに送信されます。したがって、WALは、インデックス作成が機能するために不可欠です。
Cloudera Searchは、HBase行の変更イベントをリッスンし、別のRegionServerに更新を送信する代わりに、それらをLilyHBaseIndexerに送信するHBaseレプリケーションメカニズムを使用します。次に、Lily HBaseIndexerはClouderaMorphlines変換ロジックを適用し、イベントをSolrフィールドに分割して、ApacheSolrServerに転送します。
HBaseコプロセッサーに同じ機能を実装するのと比較して、HBaseレプリケーションを使用することには大きな利点があります。まず、レプリケーションは、HBaseに取り込まれるデータと並行して非同期に機能します。したがって、Cloudera Searchのインデックス作成は、通常のHBase操作にレイテンシーや操作上の不安定さを追加しません。次に、レプリケーション方式を使用すると、変換ロジックをオンザフライでシームレスに変更できます。逆に、コプロセッサーの変更によって変更を行うには、RegionServerを再起動する必要があります。これにより、HBaseユーザーはデータを使用できなくなります。おそらく最も重要なのは、コプロセッサーの実装がかなり煩わしく、適切にテストされていない場合、HBaseのパフォーマンスを混乱させる可能性があることです。
このフローを以下に示します。
ClouderaSearchのインストールとLilyHBaseインデクサーのデプロイ
Cloudera Managerは、ClouderaSearchを単一のパッケージとして自動的にダウンロードして展開します。上部のナビゲーションにある「パッケージ」アイコンをクリックし、Solrバージョンを選択して、ダウンロード、配布、およびアクティブ化するだけです。
前述のように、Cloudera SearchはHBaseレプリケーションに依存しているため、次に有効になります。 HBaseサービス->構成->バックアップをクリックしてレプリケーションをアクティブ化します 「HBaseレプリケーションを有効にする」と「インデックス作成を有効にする」の両方がチェックされていることを確認します。必要に応じて、変更を保存し、HBaseサービスを再起動します。
Lily HBaseインデクサーを追加するには、サービス->サービスの追加に移動します 、「Keystore Indexer」を選択して追加し、メール処理に使用されるHBaseインスタンスをポイントします。
Solrの構成
次に、前の投稿で説明したとおりにSolrを構成します。
- サンプルschema.xml構成ファイルを生成します:
$ solrctl --zk localhost:2181/solr \ instancedir --generate $HOME/emailSearchConfig
- $ HOME / emailSearchConfigのschema.xmlファイルを、電子メール処理に関連するフィールドを定義する構成ファイルで編集します。ファイルの完全なコピーは、このリンクにあります。
- Solr構成をZooKeeperにアップロードします:
$ solrctl --zk localhost:2181/solr instancedir \ --create email_collection $HOME/emailSearchConfig
- Solrコレクションを生成します:
$ solrctl --zk localhost:2181/solr collection \ --create email_collection -s 1
インデクサーの登録
この手順は、インデクサーとHBaseレプリケーションを追加および構成するために必要です。以下のコマンドは、ZooKeeperを更新し、myindexerをHBaseのレプリケーションピアとして追加します。また、構成をZooKeeperに挿入します。これは、LilyHBaseIndexerがSolrの適切なコレクションを指すために使用します。
$ hbase-indexer add-indexer -n myindexer -c indexer-config.xml \ -cp solr.zk=localhost:2181/solr \ -cp solr.collection=collection1
引数:
- -n myindexer –ZooKeeperに登録されるインデクサーの名前を指定します
- -c indexer-config.xml –インデクサーの動作を指定する構成ファイル
- -cp solr.zk =localhost:2181 / solr –ZooKeeperとSolrの構成の場所を指定します。これは、ZooKeeperの環境固有の場所で更新する必要があります。
- -cp solr.collection =collection1 –更新するコレクションを指定します。 collection1を作成したSolr構成ステップを思い出してください。
この場合、index-config.xmlファイルは比較的簡単です。調べるテーブル、マッパーとして使用されるクラス(com.ngdata.hbaseindexer.morphline.MorphlineResultToSolrMapper)、およびMorphline構成ファイルの場所をインデクサーに指定するだけです。マッピングタイプはcolumnに設定されます 各セルを個別のSolrドキュメントとして取得したいからです。デフォルトでは、mapping-typeは rowに設定されています 、この場合、Solrドキュメントは完全な行になります。
Param name =” morphlineFile”は、Morphlines構成ファイルの場所を指定します。場所はMorphlinesファイルの絶対パスである可能性がありますが、Cloudera Managerを使用しているため、相対パス「morphlines.conf」を指定してください。
hbase-indexer構成ファイルの内容は、このリンクにあります。
hbase-indexerコマンドの完全なリファレンスについては、引数なしでコマンドを実行するだけで十分です。
$ hbase-indexer Usage: hbase-indexerwhere an option from one of these categories: TOOLS add-indexer update-indexer delete-indexer list-indexers PROCESS MANAGEMENT server run the HBase Indexer server node REPLICATION (EVENT PROCESSING) TOOLS replication-status replication-wait PACKAGE MANAGEMENT classpath dump hbase CLASSPATH version print the version or CLASSNAME run the class named CLASSNAME Most commands print help when invoked w/o parameters.
LilyHBaseインデクサーの構成と起動
Lily HBase Indexerを追加したときに、関連付けられているHBaseのインスタンスを指定したことを思い出してください。したがって、このステップでそれを行う必要はありません。ただし、このインデクサーが電子メールメッセージを解析し、関連するすべてのフィールドを抽出できるようにするMorphlines変換ロジックを指定する必要があります。
[サービス]に移動し、前に追加したLilyHBaseIndexerを選択します。 [構成]->[表示と編集]->[サービス全体]->[モーフライン]を選択します 。モーフラインファイルをコピーして貼り付けます。
メールモーフラインライブラリは、次のアクションを実行します。
1.extractHBaseCellsコマンドを使用してHBaseメールイベントを読み取ります
2。 grokコマンドを使用して、構造化されていないテキストをフィールドに分割します
3。メールにMessage-IDがない場合は、generateUUIDコマンドで生成します
4。 convertTimestampコマンドを使用して、日付/タイムスタンプをSolrが理解できるフィールドに変換します
5。 sanitizeUknownSolrFieldscommand
extractHBaseCellsコマンドは、HBaseインデクサーのモーフライン構成で唯一異なる点であるため、さらに注意を払う必要があります。パラメータは次のとおりです。
- inputColumn –サブスクライブする列を指定します(ワイルドカードの場合もあります)
- outputFied –データが送信されるフィールドの名前
- type –フィールドのタイプ(メール本文の場合は文字列)
- ソース–値または修飾されている可能性があります。 valueは、セル値にインデックスを付ける必要があることを指定します
extractHBaseCells { mappings : [ { inputColumn : "messages:*" outputField : "message" type : string source : value } ] }
このモーフラインファイルのコピーをここからダウンロードします。
重要な注意点の1つは、idフィールドがLilyHBaseIndexerによって自動的に生成されることです。この設定は、unique-key-field属性を指定することにより、上記のindex-config.xmlファイルで構成できます。 idのデフォルト名を残すことをお勧めします—上記のxmlファイルで指定されていないため、デフォルトのidフィールドが生成され、RowID-ColumnFamily-ColumnNameの組み合わせになります。
この時点で、変更を保存し、ClouderaManagerからLilyHBaseIndexerを起動します。
HBaseでの受信トレイテーブルの設定
プログラムでHBaseにテーブルを作成する方法はたくさんあります(Java API、REST API、または同様の方法)。ここでは、HBaseシェルを使用して受信トレイテーブルを作成します(わかりやすくするために、意図的に説明的な列ファミリー名を使用します)。本番アプリケーションでは、ファミリ名は常に短くする必要があります。これは、セルキーの一部としてすべての値とともに常に格納されるためです。次のコマンドはそれを実行し、「メッセージ」と呼ばれる列ファミリーでレプリケーションを有効にします。
hbase(main):003:0> create 'inbox', {NAME => 'messages', REPLICATION_SCOPE => 1}
テーブルが正しく作成されたことを確認するには、次のコマンドを実行します。
hbase(main):003:0> describe 'inbox' DESCRIPTION ENABLED {NAME => 'inbox', FAMILIES => [{NAME => 'messages', DATA_BLOCK_ENCODING => ' true NONE', BLOOMFILTER => 'NONE', REPLICATION_SCOPE => '1', VERSIONS => '3', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => '2147483647', KEEP_DEL ETED_CELLS => 'false', BLOCKSIZE => '65536', IN_MEMORY => 'false', ENCODE _ON_DISK => 'true', BLOCKCACHE => 'true'}]}
この時点から、列ファミリー「messages」のテーブル「inbox」に入れられた電子メールは、Lily HBase Indexerへのイベントをトリガーします。LilyHBaseIndexerは、イベントを処理し、フィールドに分割して、インデックス作成のためにSolrに送信します。
受信ボックステーブルのスキーマは単純です。行IDは、この受信ボックスが属する人の名前です。各セルは個別のメッセージであり、列は一意の整数IDです。以下は、HueのHBaseインターフェースによって表示されるサンプルテーブルのスナップショットです。
データへのアクセス
インデックスに登録された電子メールにアクセスするには、多くのビジュアルツールを選択できます。 HueとSolrGUIはどちらも非常に優れたオプションです。 HBaseは、GUIからだけでなく、HBaseシェル、API、さらには単純なスクリプト手法を介した、さまざまなアクセス手法も可能にします。
Solrとの統合により、優れた柔軟性が得られ、データの非常に単純な検索オプションと高度な検索オプションを提供することもできます。たとえば、電子メールオブジェクト内のすべてのフィールドがSolrに格納されるように、Solr schema.xmlファイルを構成すると、ユーザーは、ストレージスペースと計算の複雑さを犠牲にして、簡単な検索で完全なメッセージ本文にアクセスできます。
または、id、sender、subjectなどの限られた数のフィールドのみを保管するようにSolrを構成することもできます。これらの要素を使用すると、ユーザーはSolrをすばやく検索し、メッセージIDを取得できます。これを使用して、HBase自体から完全なメッセージを取得できます。
以下の例では、メッセージIDのみをSolrに格納しますが、電子メールオブジェクト内のすべてのフィールドにインデックスを付けます。このシナリオでSolrを検索すると、電子メールIDが取得され、HBaseの照会に使用できます。このタイプのセットアップは、ストレージコストを低く抑え、Solrのインデックス機能を最大限に活用するため、Solrにとって理想的です。
以下のシェルスクリプトは、Solr Rest APIにキーワード「productId」のクエリを発行し、フィールド「id」をCSV形式で返します。結果は、クエリに一致するドキュメントIDのリストです。次に、スクリプトはIDをループし、それらを行ID、列ファミリー、および列名に分割します。これらは、標準のHBaseRESTAPIを介してHBaseにアクセスするために使用されます。
#!/bin/bash # Query SOLR and return the id field for every document # that contains the word resign query_resp=$(curl -s 'http://spark:8983/solr/collection1_shard1_replica1/select?q=productId&fl=id&wt=csv') # Loop through results of the previous command, # and use the id to retrieve the cells from HBase via the HBase REST API for i in $query_resp do if [ "$i" != "id" ]; then cmd=$(echo $i |awk -F'-' '{print "curl -s http://spark:20550/inbox/" $1 "/" $2 ":" $3}') $cmd -H "Accept: application/x-protobuf " fi done
結論
この投稿では、HBaseに保存されているEメールのインデックス作成が非常に簡単であることがわかりました。ほぼリアルタイムで、メインのHBaseフローに完全に邪魔になりません。要約すると、次の主な手順を念頭に置いてください。
- HBaseでレプリケーションを有効にする
- LilyHBaseIndexerを適切に構成する
- Lily HBaseインデクサーでMorphlinesを使用して、変換を支援します(コーディングは不要です!)
前の投稿を読む機会があった場合は、morphlines.confファイルが3つのケースすべてで実質的に同一であることがわかります。これは、Hadoopエコシステム上で検索のユースケースを拡大するのが非常に簡単であることを意味します。データがすでにHDFSにある場合は、MapReduceIndexerToolを使用してインデックスを作成します。データがFlumeを介して到着する場合は、同一のモーフラインファイルでSolrMorphlineSinkを使用します。後でHBaseがユースケースに適合すると判断した場合、HBaseでセルのインデックス作成を開始するために必要な変更は最小限です。extractHBaseCellsコマンドをモーフラインファイルに追加するだけです。
この例はユースケースとしての電子メールに焦点を当てていますが、この方法は、HBaseがストレージおよびアクセスレイヤーとして使用される他の多くのシナリオに適用できます。企業がすでに特定のユースケースでHBaseを使用している場合は、その上にClouderaSearchを実装することを検討してください。コーディングは不要で、組織内のはるかに幅広い対象者にデータを実際に公開できます。
Jeff Shmainは、Clouderaのソリューションアーキテクトです。