Phoenixを使用してセカンダリインデックスを作成する



Create Secondary Index Using Phoenix



1.なぜセカンダリインデックスが必要なのですか?

HBaseの場合、行を正確に見つける唯一の方法は、rowkeyを使用して行を照会することです。行キーを使用してデータを検索しない場合は、各列の値を1行ずつ比較する必要があります。つまり、全表スキャンです。より大きなテーブルの場合、全表スキャンのコストは許容できません。ただし、多くの場合、複数の角度からデータをクエリする必要があります。たとえば、人を見つけるときに、名前、ID番号、学生IDなどのさまざまな角度でクエリを実行できます。これほど多くの角度のデータを行キーに入れることはほとんど不可能です(ビジネスの柔軟性は許可されていません。行キーの長さの要件も許可されていません)。したがって、これを実現するには、セカンダリインデックスが必要です。セカンダリインデックスの原則は単純ですが、自分で管理する場合は面倒な場合があります。現在、PhoenixはHBa​​seセカンダリインデックスのサポートを提供しています。


2.フェニックスグローバルインデックスとローカルインデックス

2.1グローバルインデックス

グローバルインデックス、グローバルインデックス、少ない書き込みでビジネスシナリオを読み取るのに適しています。データテーブルへのすべての更新(DELETE、UPSERT VALUES、およびUPSERT SELECT)によりインデックステーブルが更新され、インデックステーブルが異なるデータノードに分散されるため、データの書き込み時にグローバルインデックスを使用すると非常にコストがかかります。クロスノードデータ転送は、パフォーマンスのオーバーヘッドを大きくします。フェニックスは、データを読み取るときに、クエリの消費にかかる時間を短縮するためにインデックステーブルを選択します。デフォルトでは、クエリするフィールドがインデックスフィールドでない場合、インデックステーブルは使用されません。つまり、クエリ速度は向上しません。



2.2ローカルインデックス作成

書き込み操作が頻繁でスペースが限られているシーン向けのローカルインデックス、ローカルインデックス。グローバルインデックス作成と同様に、Phoenixはクエリの作成時にインデックスが使用されているかどうかを自動的に判断します。ローカルインデックスを使用する場合、インデックスデータとデータテーブルのデータは同じサーバーに格納されるため、書き込み操作中に異なるサーバーのインデックステーブルにインデックスを書き込むオーバーヘッドが回避されます。ローカルインデックスを使用する場合、クエリフィールドがインデックスフィールドでなくてもインデックステーブルが使用されるため、グローバルインデックスとは異なり、クエリ速度が向上します。ローカルインデックスの場合、データテーブルのすべてのインデックスデータは、単一のスタンドアロンの共有可能なテーブルに格納されます。


3.不変インデックスと可変インデックス

3.1不変のインデックス

不変インデックス、不変インデックスは、ログデータやイベントデータの保存など、更新されておらず、時系列に保存された(時系列データ)シナリオを追加するデータにのみ適用されます。不変のインデックスを格納する方法は、1つを記述し、追加のみです。フェニックスでcreatetableステートメントを使用するときにIMMUTABLE_ROWS = trueを指定すると、このテーブルで作成されたインデックスが不変のインデックスに設定されます。デフォルトでは、Phoenixはテーブルの作成時にIMMUTABLE_ROW = trueを指定せず、テーブルが変更可能であることを示します。不変インデックスは、グローバル不変インデックスとローカル不変インデックスに分けられます。



3.2可変インデックス

可変インデックス、可変インデックス。データが追加または削除されたシナリオに適しています。テーブルの作成時にIMMUTABLE_ROWS = trueを明示的に指定しない限り、Phoenixによってデフォルトで作成されるインデックスは可変インデックスです。可変インデックスは、グローバル不変インデックスとローカル不変インデックスにも分けられます。


4.フェニックスセカンダリインデックスをサポートするようにHBaseを構成します

phoenixのセカンダリインデックス機能を有効にする場合は、各RegionServerでHMasterとhbase-site.xmlの追加構成を実行する必要があります。まず、各RegionServerのhBase-site.xmlに次のプロパティを追加します。

hbase.regionserver.wal.codec org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec hbase.region.server.rpc.scheduler.factory.class org.apache.hadoop.hbase.ipc.PhoenixRpcSchedulerFactory Factory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates hbase.rpc.controllerfactory.class org.apache.hadoop.hbase.ipc.controller.ServerRpcControllerFactory Factory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates hbase.coprocessor.regionserver.classes org.apache.hadoop.hbase.regionserver.LocalIndexMerger

各regionserverのhbase-site.xmlで上記の属性を構成しない場合、create indexステートメントを使用してセカンダリインデックスを作成すると、次の例外がスローされます。



Error: ERROR 1029 (42Y88): Mutable secondary indexes must have the hbase.regionserver.wal.codec property set to org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec in the hbase-sites.xml of every region server tableName=TEST_INDEXES (state=42Y88,code=1029)

次に、各マスターのhbase-site.xmlに次の属性を追加します。

hbase.master.loadbalancer.class org.apache.phoenix.hbase.index.balancer.IndexLoadBalancer hbase.coprocessor.master.classes org.apache.phoenix.hbase.index.master.IndexMasterObserver

上記の変更が完了したら、hbaseクラスターを再起動して、構成を有効にします。


5.Phoenixを使用してセカンダリインデックスを作成します

5.1グローバルインデックスの作成

# Create Global Index Global Indexing create index TEST_SPLIT_IDX on 'TEST'('id_number') #View whether the query statement is indexed explain select 'id_number' from 'TEST' where 'id_number' = '510121199007144049' # Adopt INCLUDE (index cover) create index TEST_SPLIT_IDX on 'TEST'('id_number') INCLUDE('age') # create index 'TEST_SPLIT_IDX 'on 'TEST'('id_number','age')

複数列のインデックス

複数列のインデックスは、プレフィックスタイプが満たされる場合に使用されます。たとえば、A、B、およびCの順序の複数の列インデックスが作成されます。 where条件でA条件、AB条件、またはABC条件が指定されている場合、インデックスは取得されますが、BC条件はインデックスを取得できません。

インデックスカバレッジ

インデックスカバレッジは、実際にはINCLUDEに含まれる列をインデックステーブルに格納しています。検索時に、これらの列の値をインデックステーブルから直接戻すことができます。インデックス列とインデックスオーバーライド列の違いに特に注意してください。インデックス列は、インデックステーブルに行キーの形式で存在します。複数のインデックス列は特定のバイトで区切られ、行キーに一緒に格納されます。つまり、インデックス列が多い場合、行キーの長さは長くなり、サイズはインデックス列のサイズによって異なります。インデックスオーバーライド列は、インデックステーブルの列ファミリに格納されます。

5.2ローカルインデックスの作成

#Create a local index Local Indexing create local index TEST_SPLIT_IDX on 'TEST'('id_number')

ローカルインデックスに関する考慮事項

グローバルインデックス作成とは異なり、select句にインデックス列(USER_NAME)以外の列がある場合でも、インデックステーブルを取得できます。


参照: https://blog.csdn.net/d6619309/article/details/50358592