2.8 phoenix表映射
默认情况下,直接在hbase中创建的表,通过phoenix是查看不到的,如图1和图2,US_POPULATION是在phoenix中直接创建的,而test是在hbase中直接创建的,默认情况下,在phoenix中是查看不到test的。
映射与Phoenix二级索引 - 图1
图1 phoenix命令行中查看所有表
映射与Phoenix二级索引 - 图2
图2 hbase命令行中查看所有表
如果需要在phoenix中操作直接在hbase中创建的表,则需要在phoenix中进行表的映射。映射方式有两种:视图映射和表映射。
hbase 中test的表结构如下,两个列簇name、company.

Rowkey name company
empid firstname lastname name address

2.8.1 hbase命令行中创建表

$ cd /home/hadoop/hbase/bin
$ ./hbase shell 进入hbase命令行
create ‘test’,’name’,’company’ 创建表,如下图
映射与Phoenix二级索引 - 图3
下面的视图映射和表映射均基于该表。

2.8.2 视图映射

  1. Phoenix创建的视图是只读的,所以只能用来做查询,无法通过视图对源数据进行修改等操作。而且相比于直接创建映射表,视图的查询效率会低,原因是:创建映射表的时候,Phoenix会在表中创建一些空的键值对,这些空键值对的存在可以用来提高查询效率。<br /> 1)创建视图<br />create view"test"(empid varchar primarykey,"name"."firstname" varchar,"name"."lastname"varchar,"company"."name" varchar,"company"."address"varchar);<br /> 2)删除视图<br /> drop view "test";

2.8.3 表映射

使用Apache Phoenix创建对HBase的表映射,有两种方法:
1) 当HBase中已经存在表时,可以以类似创建视图的方式创建关联表,只需要将create view改为create table即可。
2)当HBase中不存在表时,可以直接使用create table指令创建需要的表,并且在创建指令中可以根据需要对HBase表结构进行显示的说明。
第1)种情况下,如在之前的基础上已经存在了test表,则表映射的语句如下:
create table “test”(empid varchar primarykey,”name”.”firstname”varchar,”name”.”lastname”varchar,”company”.”name” varchar,”company”.”address”varchar);
第2)种情况下,直接使用与第1)种情况一样的create table语句进行创建即可,这样系统将会自动在Phoenix和HBase中创建person_infomation的表,并会根据指令内的参数对表结构进行初始化。
使用create table创建的关联表,如果对表进行了修改,源数据也会改变,同时如果关联表被删除,源表也会被删除。但是视图就不会,如果删除视图,源数据不会发生改变。
2.8.4 使用spark对phoenix的读写
请参考http://phoenix.apache.org/phoenix_spark.html
映射与Phoenix二级索引 - 图4
select from STOCK_SYMBOL
映射与Phoenix二级索引 - 图5
scan “STOCK_SYMBOL”
映射与Phoenix二级索引 - 图6

*第三章 利用Phoenix为Hbase表创建二级索引


3.1配置Hbase支持Phoenix创建二级索引
https://blog.csdn.net/u011491148/article/details/45749807
对于Hbase,如果想精确定位到某行记录,唯一的办法就是通过rowkey查询。如果不通过rowkey查找数据,就必须逐行比较每一行的值,对于较大的表,全表扫描的代价是不可接受的。
3.1.1、修改Hbase的regionserver节点的hbase-site.xml配置文件

  1. <property>
  2. <name>hbase.regionserver.wal.codec</name>
  3. <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
  4. </property>
  5. <property>
  6. <name>hbase.region.server.rpc.scheduler.factory.class</name>
  7. <value>org.apache.hadoop.hbase.ipc.PhoenixRpcSchedulerFactory</value>
  8. <description>Factory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates</description>
  9. </property>
  10. <property>
  11. <name>hbase.rpc.controllerfactory.class</name>
  12. <value>org.apache.hadoop.hbase.ipc.controller.ServerRpcControllerFactory</value>
  13. <description>Factory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates</description>
  14. </property>

注意:网上配置文档里有这一条,但在实际测试中(测试环境hbase-1.3.1,网上0.98.6),加入该条的regionserver会在hbase启动时失败,对应节点上没有HregionServer进程,去掉该配置后正常启动,且能正常创建local index。

  1. <property>
  2. <name>hbase.coprocessor.regionserver.classes</name>
  3. <value>org.apache.hadoop.hbase.regionserver.LocalIndexMerger</value>
  4. </property>


还有一点,hbase-site.xml的zookeeeper的配置信息不能加2181,否则在创建local index的时候会报以下异常:

映射与Phoenix二级索引 - 图7
正常配置
映射与Phoenix二级索引 - 图8

3.1.2、修改Hbase的master节点的hbase-site.xml配置文件
注意,如果master节点上也有regionserver,那么master节点配置如下,否则不需要regionserver的配置参数。

  1. <!-- phoenix master 配置参数 -->
  2. <property>
  3. <name>hbase.master.loadbalancer.class</name>
  4. <value>org.apache.phoenix.hbase.index.balancer.IndexLoadBalancer</value>
  5. </property>
  6. <property>
  7. <name>hbase.coprocessor.master.classes</name>
  8. <value>org.apache.phoenix.hbase.index.master.IndexMasterObserver</value>
  9. </property>
  10. <!-- phoenix regionserver 配置参数 -->
  11. <property>
  12. <name>hbase.regionserver.wal.codec</name>
  13. <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
  14. </property>

3.2创建索引
配置好以上配置信息之后,重启Hbase,以下测试环境通过Phoenix映射Hbase中已有的表,数据量743569行,202M,当然也可以通过Bulkload直接在Phoenix创建表并插入数据影响Hbase。
3.2.1、未创建索引信息时,用时6.08s
select “uploader” from “hive_hbase_youtube” where “uploader”=’karianahhk’;
映射与Phoenix二级索引 - 图9
3.2.2、创建索引,用时0.014s
create index “youtube_index2” on “hive_hbase_youtube” (“info”.”uploader”);
映射与Phoenix二级索引 - 图10
映射与Phoenix二级索引 - 图11
3.3关于Phoenix创建的HBase二级索引的更新问题
3.3.1、在使用Phoenix创建Hbase的二级索引表之后,在Phoenix中看不到新建的索引表,但是
在Hbase表中可以看到索引表。
映射与Phoenix二级索引 - 图12

现在,有一个问题,可以看到同一个表中查询的数据却不同,原因是Jarry是直接向Hbase表插入的数据,而Phoenix已经为name字段创建索引,这时就查询不到Jarry,但是通过Phoenix的映射表向Hbase插入的数据数据查询索引字段可以查询到。

映射与Phoenix二级索引 - 图13

3.3.2、问题是,如果绕开Phoenix向Hbase表插入数据,那么索引表就不会动态更新。
解决方案:
现有的解决方案是,在通过Hbase向表中插入数据时,我们要向索引表中也插入一条索引数据。那么查看以下索引表数据:
映射与Phoenix二级索引 - 图14
其实索引的rowkey就是索引字段+rowkey,那么我们插入一条:
put ‘name’,”Jarry\x001003”,’0:_0’,’x’
映射与Phoenix二级索引 - 图15
3.3.3、再次查询Phoenix中的索引字段,可以显示索引字段了。
映射与Phoenix二级索引 - 图16
有关索引的扩展请访问
https://blog.csdn.net/qq_41665356/article/details/80278125