痛点&目的:
- Hbase 作为NoSQL数据库,语法特别难用,为了方便我们使用标准SQL查询Hbase数据。
- Phoenix支持DDL与DML 增删改查。
- Impala给外部提供的接口难以提升并发量。
- 减轻Impala的查询压力。
官网:
Phoneix安装:
SIT环境Cloudera5.14.4的hbase 为1.2版本,因此到phoneix官网下载对应版本的tar包并上传至其中一台机器,这里上传到gateway。
解压tar包: tar –zxvf apache-phoenix-4.14.0-cdh5.14.2-bin.tar.gz –C /opt/app
建软连接: ln –s /opt/app/apache-phoenix-4.14.0-cdh5.14.2-bin /opt/cloudera/parcels/phoenix
环境变量:
在CM里新增一个参数: 然后重启hbase服务
将 hbase 集群中的配置文件 hbase-site.xml 拷贝到 Phoenix 的 bin 目录下,覆盖原有的配置文件
将 hdfs 集群中的配置文件 core-site.xml、 hdfs-site.xml 拷贝到 Phoenix 的 bin 目录下
Copy以下三个jar包到CDH集群每台机器的 hbase的lib下:
cp $PHOENIX_HOME/phoenix-4.14.0-cdh5.14.2-server.jar /opt/cloudera/parcels/CDH/lib/hbase/lib/
cp $PHOENIX_HOME/phoenix-4.14.0-cdh5.14.2-client.jar /opt/cloudera/parcels/CDH/lib/hbase/lib/
cp $PHOENIX_HOME/phoenix-core-4.14.0-cdh5.14.2.jar /opt/cloudera/parcels/CDH/lib/hbase/lib/
在$PHOENIX_HOME/bin下执行命令进入phoenix shell:
./sqlline.py sithd01,sithd02,sithd03:2181
执行SQL文件:
导数据文件至phoenix表:
刚才的语法新建的phoenix表和数据:
Phoenix的表在hbase中可以看到:
与hbase已有的表做映射:
在hbase shell中准备一张表:
在phoenix中创建映射视图:
Tips:
HBase数据表默认主键列名是ROW
表名和列族以及列名需要用双引号括起来, 因为HBase是区分大小写的,如果不用双引号括起来的话Phoenix在创建表的时候会自动将小写转换为大写字母,这样HBase中会创建另外一张表,大小写不同。
查询表名需要用双引号括起来.
实施同步hbase的最新数据:
建phoenix表则可以与hbase相互操作.
性能对比
Phoenix查询Hbase VS impala 查询hive与hbase的映射表
数据量586968。
准备:
--建hive的hbase映射表
CREATE TABLE IF NOT EXISTS dl_noahwm_cbs.hbase_tbl_doc_record (
key string comment "hbase rowkey",
`docrecordid` STRING COMMENT '上传文档ID',
`doccatcode` STRING COMMENT '文档分类编码',
`doccatindex` STRING COMMENT '文档索引号',
`docname` STRING COMMENT '文档名称',
`docextension` STRING COMMENT '文档扩展名',
`docsize` STRING COMMENT '文档大小',
`docdesc` STRING COMMENT '文档说明',
`version` STRING COMMENT '版本号',
`docaccessid` STRING COMMENT 'ECM访问ID',
`bizgroup` STRING COMMENT '业务所属板块',
`isdeleted` STRING COMMENT '逻辑删除',
`createdbyid` STRING COMMENT '添加人',
`createdtime` STRING COMMENT '添加日期',
`lastmodifiedbyid` STRING COMMENT '最后更新人',
`lastmodifiedtime` STRING COMMENT '最后更新日期',
`src_sys_name` STRING COMMENT 'source system name',
`ins_gmt_ts` STRING COMMENT 'insert timestamp',
`upt_gmt_ts` STRING COMMENT 'update timestamp')
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,record:docrecordid,record:doccatcode,record:doccatindex,record:docname,record:docextension,record:docsize,record:docdesc,record:version,record:docaccessid,record:bizgroup,record:isdeleted,record:createdbyid,record:createdtime,record:lastmodifiedbyid,record:lastmodifiedtime,record:src_sys_name,record:ins_gmt_ts,record:upt_gmt_ts")
TBLPROPERTIES("hbase.table.name" = "hbase_tbl_doc_record");
--插入数据: 需as字段否则会乱序
insert into table hbase_tbl_doc_record
select docrecordid as key,docrecordid as docrecordid,
doccatcode as doccatcode,
doccatindex as doccatindex,
docname as docname,
docextension as docextension,
docsize as docsize,
docdesc as docdesc,
version as version,
docaccessid as docaccessid,
bizgroup as bizgroup,
isdeleted as isdeleted,
createdbyid as createdbyid,
createdtime as createdtime,
lastmodifiedbyid as lastmodifiedbyid,
lastmodifiedtime as lastmodifiedtime,
src_sys_name as src_sys_name,
ins_gmt_ts as ins_gmt_ts,
upt_gmt_ts as upt_gmt_ts from tbl_doc_record;
--phoenix DDL
create view "hbase_tbl_doc_record"(
"ROW" varchar primary key,
"record"."docrecordid" varchar,
"record"."doccatcode" varchar,
"record"."doccatindex" varchar,
"record"."docname" varchar,
"record"."docextension" varchar,
"record"."docsize" varchar,
"record"."docdesc" varchar,
"record"."version" varchar,
"record"."docaccessid" varchar,
"record"."bizgroup" varchar,
"record"."isdeleted" varchar,
"record"."createdbyid" varchar,
"record"."createdtime" varchar,
"record"."lastmodifiedbyid" varchar,
"record"."lastmodifiedtime" varchar,
"record"."src_sys_name" varchar,
"record"."ins_gmt_ts" varchar,
"record"."upt_gmt_ts" varchar
);
查询性能对比:
Query1: select count(1) from hbase_tbl_doc_record where docsize>'200000';
Hive: 45.67s
Impala: 15.56s
Phoenix: 2.39s
Query2: select distinct docsize from hbase_tbl_doc_record where docsize>'200000' limit 20;
Hive: 54.67s
Impala: 10.81s
Phoenix: 0.048s
Query3: select count(1) from hbase_tbl_doc_record where docsize like '20%';
Hive:42.25s
Impala: 11.8s
Phoenix: 2.322s
Query4: select * from hbase_tbl_doc_record where createdtime >'2016-01-01 00:00:00' limit 100;
Hive: 31.7s
Impala: 2.17s
Phoenix: 0.214s