Hbase的SQL接口之Phoenix使用心得
创始人
2024-03-17 23:11:10

PHOENIX 官方定义

A SQL layer over HBase delivered as a client-embedded JDBC drivertargeting low latency queries over HBase data

不同于Hive on HBase的方式,Phoenix将Query Plan直接使用HBaseAPI实现,目的是规避MapReduce框架,减少查询的时间延迟

Phoenix中SQL Query Plan的执行,基本上是通过构建一系列的Hbase scan来完成。

为了尽可能减少数据传输,在Region Server使用Coprocessor来尽可能的执行Aggregate相关工作,基本思想是使用RegionObserver在PostScannerOpen hook中将RegionScanner替换成支持Aggregation工作的定制化的Scanner,具体的Aggregate操作通过custom的scan属性传递给RegionScanner。与基于MapReduce的框架执行Plan的思想比较,基本上就是通过Coprocessor,使用RegionServer自身来在各个节点上执行Aggregation。

采用JDBC接口和应用程序交互。

二、hbase建表、phoenix格式数据导入

创建表结构、rowkey索引确定

根据业务需求建表、rowkey、索引列,前期规划设计对后期查询性能的优化尤为重要。

表字段类型要前期规划好,比如要排序的字段,最好是用int或者bigint,要确定常用查询列。确定rowkey,确定hbase分区规则,防止后面数据倾斜。

为了查询性能尽量的好,分区规则是有规则的,简单的hash分区,效果是不好的。

注意:目前支持了不同数据格式的phoenix格式,但是建表的时候还是需要考虑的,比如排序字段尽量考虑int,事先要确定一些常用列,都死为了优化查询。

数据灌入

有三种数据灌入的方式:

1.简单phoenix接口put数据

通过java代码,插入数据进hbase,几条记录写入

HTable table = new HTable(conf, “tableName”);
Put put = new Put(rowkey);
table.put(put);

2.datax少量数据导入

传统的etl开发根据建表sql将云梯生产的数据转换成phoenix格式的文件导入,但文件大小控制在几百M大小,不易过大。

3.hfile超大数据量bulkload

在这里我们遇到了比较大的坎,云梯1、odps对自动脚本灌数据支持的不够好,需要进行个性化需求的开发,中间搞了个收到bulkload到hbase的方法是。

找了台机器单独弄了个 gateway,部署了hadoop客户端,手动bulkload数据。

下载并、配置好环境,搞2个手动bulkload和load的脚本,即可搞了。

(一)bulkload脚本如下图:

alt

(二)bulkload完成后还需要将数据load到hbase的库里,脚本如下:

${HBASE_HOME}/bin/hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles hdfs://hdfscluster-1/group/aplus-48/201403211000/ TABLE_NAME

三、应用层phoenix接口开发、调试

类jdbc数据源、查询等接口开发

需要注意的是:

1.日常环境搭建,因为测试环境没有dns转发,所以需要进行host绑定到相应的zk服务器,

2.应用的预发生产环境都是连hbase的生产环境

2.1 但是必须确保生产环境有正确格式的数据在hbase里面,否则会报一系列的让你难以捉摸的异常。

2.2 因为初期对phoenix语法的不熟悉,你需要搭建一个phoenix的客户端,进行sql查询。

否则java应用启动发布、查错、改sql,这活菊有的你苦了。

你只需要下载一tar包到随便一台能连phoenix生产的机器,一般为预发环境,就可以。

它支持单sql执行,切记要在sql结尾加上分号。

也支持批量的sql执行,psql同时会将sql的执行时间打印出来,如下

alt

3.phoenix的语法和sql基本类似,但是也是有点区别的,比如:

 3.1 分页不行mysql那样的limit 1,10 ;phoenix的格式是where  (field1,field2) > ('75','47')  limit 10这里的列值就是上次分页最后一条记录的某个列值。3.2 join查询的性能会慢3.3 order by只能在内存里做,limit也是3.4 当查询结果集大到一定程度,rs读取的速度会降低减慢3.5 因为很多排序、查询计算会在内存里做,所以phoenix会在应用服务器/tmp目录产生很多临时文件,如果代码中没有将 rs.close(),那么那些临时文件会很快撑爆硬盘。如图:

alt

四、hbase存储结合phoenix优势

   1.海量低成本的存储空间2.快速敏捷接入hbase解决方案phoenix3.业务逻辑优化过后的匹配特征的高查询性能(一个月4T数据查询速度在毫秒级别)4.云梯数据快速导入hbase(4T一个小时bulkload完成datax传统导入是它几倍)4.强大的sql语法、功能支持5.专业团队持续维护、改进

相关内容

热门资讯

中证A500ETF摩根(560... 8月22日,截止午间收盘,中证A500ETF摩根(560530)涨1.19%,报1.106元,成交额...
A500ETF易方达(1593... 8月22日,截止午间收盘,A500ETF易方达(159361)涨1.28%,报1.104元,成交额1...
何小鹏斥资约2.5亿港元增持小... 每经记者|孙磊    每经编辑|裴健如 8月21日晚间,小鹏汽车发布公告称,公司联...
中证500ETF基金(1593... 8月22日,截止午间收盘,中证500ETF基金(159337)涨0.94%,报1.509元,成交额2...
中证A500ETF华安(159... 8月22日,截止午间收盘,中证A500ETF华安(159359)涨1.15%,报1.139元,成交额...