Phoenix

Posted shengyang17

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Phoenix相关的知识,希望对你有一定的参考价值。

 

1. Phoenix

Phoenix是HBase的开源SQL皮肤。可以使用标准JDBC API代替HBase客户端API来创建表,插入数据和查询HBase数据。

特点

1) 容易集成:如Spark,Hive,Pig,Flume和Map Reduce。

2) 性能好:直接使用HBase API以及协处理器和自定义过滤器,可以为小型查询提供毫秒级的性能,或者为数千万行提供数秒的性能。

3) 操作简单:DML命令以及通过DDL命令创建表和版本化增量更改。

4) 安全功能: 支持GRANT和REVOKE

5) 完美支持Hbase二级索引创建。

 架构:

技术图片

 

 作用:

技术图片

 

Phoenix安装部署

官方网址: http://phoenix.apache.org/index.html

上传jar包到/opt/software/

解压到/opt/module 改名为phoenix

[kris@hadoop101 module]$ tar -zxvf /opt/software/apache-phoenix-4.14.1-HBase-1.3-bin.tar.gz -C /opt/module 

[kris@hadoop101 module]$ mv apache-phoenix-4.14.1-HBase-1.3-bin phoenix

 

复制server和client这俩个包拷贝到各个节点的hbase/lib

在phoenix目录下

[kris@hadoop101 module]$ cd /opt/module/phoenix/

向每个节点发送server jar

[kris@hadoop101 phoenix]$ cp phoenix-4.14.1-HBase-1.3-server.jar /opt/module/hbase-1.3.1/lib/
[kris@hadoop101 phoenix]$ scp phoenix-4.14.1-HBase-1.3-server.jar hadoop102:/opt/module/hbase-1.3.1/lib/
[kris@hadoop101 phoenix]$ scp phoenix-4.14.1-HBase-1.3-server.jar hadoop103:/opt/module/hbase-1.3.1/lib/

向每个节点发送client jar

[kris@hadoop101 phoenix]$ cp phoenix-4.14.1-HBase-1.3-client.jar /opt/module/hbase-1.3.1/lib/
[kris@hadoop101 phoenix]$ scp phoenix-4.14.1-HBase-1.3-client.jar hadoop102:/opt/module/hbase-1.3.1/lib/
[kris@hadoop101 phoenix]$ scp phoenix-4.14.1-HBase-1.3-client.jar hadoop103:/opt/module/hbase-1.3.1/lib/

在root权限下给/etc/profile 下添加如下内容

#phoenix
    export PHOENIX_HOME=/opt/module/phoenix
    export PHOENIX_CLASSPATH=$PHOENIX_HOME
    export PATH=$PATH:$PHOENIX_HOME/bin

启动Zookeeper,Hadoop,Hbase(bin/start-hbase.sh

启动Phoenix

[kris@hadoop101 module]$ cd phoenix/
[kris@hadoop101 phoenix]$ bin/sqlline.py hadoop101,hadoop102,hadoop103:2181
Setting property: [incremental, false] Setting property: [isolation, TRANSACTION_READ_COMMITTED] issuing: !connect jdbc:phoenix:hadoop101,hadoop102,hadoop103:2181 none none org.apache.phoenix.jdbc.PhoenixDriver Connecting to jdbc:phoenix:hadoop101,hadoop102,hadoop103:2181 SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/opt/module/phoenix/phoenix-4.14.1-HBase-1.3-client.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/opt/module/hadoop-2.7.2/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. 19/07/12 23:57:53 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Connected to: Phoenix (version 4.14) Driver: PhoenixEmbeddedDriver (version 4.14) Autocommit status: true Transaction isolation: TRANSACTION_READ_COMMITTED Building list of tables and columns for tab-completion (set fastconnect to true to skip)... 133/133 (100%) Done Done sqlline version 1.2.0 0: jdbc:phoenix:hadoop101,hadoop102,hadoop103>

显示所有表 !table  或者!tables

技术图片

 创建表:

CREATE TABLE IF NOT EXISTS us_population (
State CHAR(2) NOT NULL,
City VARCHAR NOT NULL,
Population BIGINT
CONSTRAINT my_pk PRIMARY KEY (state, city));

在phoenix中,默认情况下,表名等会自动转换为大写,若要小写,使用双引号,如"us_population"。

插入记录:
upsert into us_population values(NY,NewYork,8143197);

查询记录:
0: jdbc:phoenix:hadoop101,hadoop102,hadoop103> select * from us_population;
+--------+----------+-------------+
| STATE  |   CITY   | POPULATION  |
+--------+----------+-------------+
| NY     | NewYork  | 8142197     |
+--------+----------+-------------+
1 row selected (0.083 seconds)
0: jdbc:phoenix:hadoop101,hadoop102,hadoop103> select * from us_population where state=NY;
+--------+----------+-------------+
| STATE  |   CITY   | POPULATION  |
+--------+----------+-------------+
| NY     | NewYork  | 8142197     |
+--------+----------+-------------+
删除记录
delete from us_population wherestate=NY;
删除表
drop table us_population;
退出命令行
!quit
0: jdbc:phoenix:hadoop101,hadoop102,hadoop103> !describe test +------------+--------------+-------------+--------------+------------+------------+--------------+----------------+-+ | TABLE_CAT | TABLE_SCHEM | TABLE_NAME | COLUMN_NAME | DATA_TYPE | TYPE_NAME | COLUMN_SIZE | BUFFER_LENGTH | | +------------+--------------+-------------+--------------+------------+------------+--------------+----------------+-+ +------------+--------------+-------------+--------------+------------+------------+--------------+----------------+-+

phoenix表映射

Phoenix和Hbase表的关系

默认情况下,直接在hbase中创建的表,通过phoenix是查看不到的。如图1和图2,US_POPULATION是在phoenix中直接创建的,而kylin相关表是在hbase中直接创建的,在phoenix中是查看不到kylin等表的。


 hbase命令行中查看所有表:

 [kris@hadoop101 bin]$ hbase shell

   hbase(main):001:0> list

 phoenix命令行中查看所有表:
0: jdbc:phoenix:hadoop101,hadoop102,hadoop103> !tables 

如果要在phoenix中操作直接在hbase中创建的表,则需要在phoenix中进行表的映射。

映射方式有两种:视图映射和表映射

 Hbase命令行中创建表test

Hbase 中test的表结构如下,两个列簇name、company.

[kris@hadoop101 bin]$ hbase shell

hbase(main):002:0> create test,name,company
0 row(s) in 1.3380 seconds

映射方式一:视图映射

Phoenix创建的视图是只读的,所以只能用来做查询,无法通过视图对源数据进行修改等操作。

在phoenix中创建视图test 表

0: jdbc:phoenix:hadoop101,hadoop102,hadoop103> create view "test"(empid varchar primary key,"name"."firstname" varchar,"name"."lastname" varchar,"company"."name" varchar,"company"."address" varchar);
0: jdbc:phoenix:hadoop101,hadoop102,hadoop103> select * from "test";
+--------+------------+-----------+-------+----------+
| EMPID  | firstname  | lastname  | name  | address  |
+--------+------------+-----------+-------+----------+
+--------+------------+-----------+-------+----------+

 

删除视图

0: jdbc:phoenix:hadoop101,hadoop102,hadoop103> drop view "test";

映射方式二: 表映射

使用Apache Phoenix创建对HBase的表映射,有两种方法:

1) 当HBase中已经存在表时,可以以类似创建视图的方式创建关联表,只需要将create view改为create table即可。

0: jdbc:phoenix:hadoop101,hadoop102,hadoop103> create table "test"(empid varchar primary key,"name"."firstname" varchar,"name"."lastname" varchar,"company"."name" varchar,"company"."address" varchar);

2) 当HBase中不存在表时,可以直接使用create table指令创建需要的表,系统将会自动在Phoenix和HBase中创建person_infomation的表,并会根据指令内的参数对表结构进行初始化。

0: jdbc:phoenix:hadoop101,hadoop102,hadoop103> create table "test"(empid varchar primary key,"name"."firstname" varchar,"name"."lastname" varchar,"company"."name" varchar,"company"."address" varchar);

使用spark对phoenix的读写

    http://phoenix.apache.org/phoenix_spark.html

            技术图片

Phoenix中查看数据

select * from STOCK_SYMBOL

在Hbase中查看数据

scan "STOCK_SYMBOL"

2. Phoenix创建Hbase二级索引

配置Hbase支持Phoenix创建二级索引

  1.  添加如下配置到Hbase的Hregionserver节点的hbase-site.xml 

技术图片
<!-- phoenix regionserver 配置参数 -->
<property>
<name>hbase.regionserver.wal.codec</name>
<value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>

<property>
<name>hbase.region.server.rpc.scheduler.factory.class</name>
<value>org.apache.hadoop.hbase.ipc.PhoenixRpcSchedulerFactory</value>
<description>Factory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates</description>
</property>

<property>
<name>hbase.rpc.controllerfactory.class</name>
<value>org.apache.hadoop.hbase.ipc.controller.ServerRpcControllerFactory</value>
<description>Factory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates</description>
</property>
View Code

     2.  添加如下配置到Hbase中Hmaster节点的hbase-site.xml中

技术图片
<!-- phoenix master 配置参数 -->
<property>
<name>hbase.master.loadbalancer.class</name>
<value>org.apache.phoenix.hbase.index.balancer.IndexLoadBalancer</value>
</property>

<property>
<name>hbase.coprocessor.master.classes</name>
<value>org.apache.phoenix.hbase.index.master.IndexMasterObserver</value>
</property>
View Code

  3 常见问题汇总:

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

<property>
<name>hbase.coprocessor.regionserver.classes</name>
<value>org.apache.hadoop.hbase.regionserver.LocalIndexMerger</value>
</property>

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

                  技术图片

正常配置:

<property>
        <name>hbase.zookeeper.quorum</name>
        <value>hadoop101,hadoop102,hadoop103</value>
</property>

创建索引

 1 phoenix的索引分类

1)global index是默认的索引格式。适用于多读少写的业务场景。写数据的时候会消耗大量开销,因为索引表也要更新,而索引表是分布在不同的数据节点上的,跨节点的数据传输带来了较大的性能消耗。在读数据的时候Phoenix会选择索引表来降低查询消耗的时间。如果想查询的字段不是索引字段的话索引表不会被使用,也就是说不会带来查询速度的提升。

CREATE INDEX my_index ON my_table (my_index)

2)Local index适用于写操作频繁的场景。索引数据和数据表的数据是存放在相同的服务器中的,避免了在写操作的时候往不同服务器的索引表中写索引带来的额外开销。查询的字段不是索引字段索引表也会被使用,这会带来查询速度的提升。

CREATE LOCAL INDEX my_index ON my_table (my_index)

  2 三种提升效率查询方式

1) CREATE INDEX my_index ON my_table (v1) INCLUDE (v2)
2) SELECT /*+ INDEX(my_table my_index) */ v2 FROM my_table WHERE v1 = foo
3) CREATE LOCAL INDEX my_index ON my_table (v1)

   3 如何删除索引

DROP INDEX my_index ON my_table

 

 

以上是关于Phoenix的主要内容,如果未能解决你的问题,请参考以下文章