简介
Phoenix是构建在HBase上的一个SQL层,采用JAVA语言编写,为Hbase提供JDBC驱动,可通过标准的JDBC API来操作Hbase。Phoenix的查询引擎会将SQL查询语句转换成一个或多个HBase Scanner,且并行执行生成标准的JDBC结果集。
Phoenix的SQL实现原理主要是基于一系列的Scan操作来完成,Scan是HBase的批量扫描过程。这一系列的Scan操作也是分散到各台RegionServer上通过Coprocessor(hbase的协处理器)来完成。主要用到的是RegionObserver(endpoint ,类似关系型数据库中的存储过程,客户端可调用执行一段Server端代码,并将Server端代码结果返回给客户端进一步处理,如常见聚合操作),通过RegionObserver在postScannerOpen Hook中将RegionScanner替换成支持聚合操作的定制化Scanner,在真正执行聚合时,会通过自定的Scan属性传递给RegionScanner,在这个Scan中也可加入一些过滤规则,尽量减少返回Client的结果。
Phoenix与Hbase集成
Phoenix是以JDBC驱动方式嵌入到HBase中的,在部署时只需将Phoenix中的一个jar包直接放HBase的lib目录下即可。
下载phoenix http://phoenix.apache.org/download.html
解压包,将phoenix目录下的 phoenix-HBase-server.jar拷贝至Hbase的lib目录下。重启Hbase后,会在Hbase中自动创建系统表,用于存储phoenix相关信息。此时可通过标准的JDBC来操作Hbase。
Phoenix提供了sqlline.py脚本用于启动Phoenix客户端并进行连接,启动时只需要指定HBase连接的Zookeeper集群地址即可。
Phoenix与Hbase表映射
Phoenix将HBase的数据模型映射到关系型世界。通过Phoenix创建表时会自动调用HBase客户端创建相应的表,并且在SYSTEM.CATALOG系统表中记录Phoenix创建表时的元数据,其主键的值对应HBase的RowKey,非主键的列对应HBase的Column(列族不指定时为0)
如果是通过Hbase API创建的表则不能通过phoenix访问该表,因为SYSTEM.CATALOG表中并没有维护Phoenix创建表的元数据。要想通过phoenix访问时,需创建映射,即添加表的元数据到SYSTEM.CATALOG系统表。
1、创建表
CREATE TABLE IF NOT EXISTS 表名(
列名(rowkey) 类型 主键,
列簇.列名,
列簇.列名
)
2、创建视图(只读)
CREATE VIEW 视图名(
列名(rowkey) 类型 主键,
列簇.列名,
列簇.列名
)
使用JDBC API操作Hbase
<dependency>
<groupId>org.apache.phoenix</groupId>
<artifactId>phoenix-core</artifactId>
<version>4.13.1-HBase-1.2</version>
</dependency>
Phoenix中的SQL
Phoenix的SQL中如果表名、字段名不使用双引号标注那么默认转换成大写。
Phoenix中的字符串使用单引号进行标注。
1、创建表:
对于Phoenix来说,HBase的rowkey会被转换成primary key,column family如果不指定则为0否则字段名会带上,qualifier转换成表的字段名,如下是创建一个Phoenix表的例子,以创建表test_01为例,主键为ROW即为HBase的rowkey, column family为cf1, qualifier为name、age、sex。
create table "test_01" (
"ROW" varchar primary key, -- 设置为主键 将对应hbase中的rowkey
"cf1"."name" varchar ,
"cf1"."age" varchar,
"cf1"."sex" varchar
)
2、插入/更新数据
由于hbase中只有put操作,所以插入和更新都使用upsert,需要更新时以原来的主键(rowkey)插入数据覆盖旧值,这里覆盖后的数据无法在查询出来,即Phoenix不支持hbase的多版本特性。
upsert into "test_01"("ROW","cf1"."name","cf1"."age" ,"cf1"."sex") values('1', 'admin', '25','13')
3、查询数据
4、组合primary key
Phoenix还支持组合primary key,即由多个字段联合组成主键,对于组合主键来说,在HBase底层会把主键的多个字段组合成rowkey显示,其它字段为HBase的qualifier显示。如test_02表,假设row和name为主键,创建表语句又变成:
create table "test_02" (
"ROW" varchar,
"name" varchar ,
"cf1"."age" varchar,
"cf1"."sex" varchar,
constraint pk PRIMARY KEY("ROW","name")
)
此时插入一条记录:
upsert into "test_02"("ROW","name","cf1"."age" ,"cf1"."sex") values('2', 'guest', '25','13')
Phoenix中数据:
hbase中rowkey的值为 row与name的组合: