Hbase的SQL接口之Phoenix使用心得

news/2024/11/29 13:50:56/

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.专业团队持续维护、改进

http://www.ppmy.cn/news/1574.html

相关文章

MySQL事务

目录 一、MySQL事务的基本了解 1、事务的概念 2、事务的ACID特点 2.1 原子性 2.2 一致性 2.3 隔离性 2.4 持久性 2.5 总结 3、对于隔离性的扩充 3.1 查询全局事务隔离级别 3.2 查询会话事务隔离级别 3.3 设置全局事务隔离级别 3.4 设置会话事务隔离级别 二、事务…

ATF问题二则:EL3可能没有实现吗? aarch32中的S-EL1是什么?

最近两个问题,戳到了我的知识盲点,当然我这个菜鸡ATF哪里都是盲点。 问题一:EL3可能没有实现吗? 问题二:bl2是aarch32, 那么bl2是S-EL1,bl31也是S-EL1? 1、EL3可能没有实现吗? The Armv8-A …

【Python自然语言处理】文本向量化的六种常见模型讲解(独热编码、词袋模型、词频-逆文档频率模型、N元模型、单词-向量模型、文档-向量模型)

觉得有帮助请点赞关注收藏~~~ 一、文本向量化 文本向量化:将文本信息表示成能够表达文本语义的向量,是用数值向量来表示文本的语义。 词嵌入(Word Embedding):一种将文本中的词转换成数字向量的方法,属于文本向量化处理的范畴。 …

推特营销引流入门指南

一、关注 当您关注另一个Twitter用户时,您进行订阅,即可立即阅读其内容分享。因此,请评估您关注的人,尤其是刚开始时。跟踪新用户的一种简单方法是找到他们的个人资料,然后单击“关注”按钮。 Twitter对于那些疯狂点…

kubernetes Service详解

linux kubernetes Service详解 Service介绍 在kubernetes中,pod是应用程序的载体,我们可以通过pod的ip来访问应用程序,但是pod的ip地址不是固定的,这也就意味着不方便直接采用pod的ip对服务进行访问。 为了解决这个问题&#xf…

c语言结构体看这篇文章就够啦(详细介绍结构体)

前言: c语言两大重要点,一个是指针,另一个就是结构体啦,这篇文章我将全面的介绍一下结构体,和他的使用,相信大家看完这篇以后定能对结构体有个深入的理解,并且会正确的使用它。 💞 &…

支付宝支付项目

文章目录🚏 支付宝支付项目🚀 支付宝介绍🚬 1、支付宝平台🚬 2、支付宝开放平台🚬 3、支付能力🚭 条码支付应用场景🚭 扫码支付应用场景🚭 App 支付🚭 手机网站支付&…

ES6的symbol及es2021

1.es6 symbol唯一性 为对象添加新的方法,防止覆盖原方法,所以需要一个独一无二的数据类型symbol a>Symbol(a)参数a作为一种修饰,用去区分 b>转为字符串和布尔值 String(Symbol()) / Boolean(Symbol()) c>作为对象的属性时&#…