phoenix使用详解
phoenix使用详解
- 一、phoenix是什么
- 二、phoenix架构
- 三、phoenix表与hbase表对应关系
- 四、phoenix基本语法
- 五、phoenix加盐表
- 六、phoenix二级索引
- 七、phoenix使用注意点
- 八、java应用使用phoenix
- 九、phoenix连接工具
一、phoenix是什么
我前面文章说过一个观点:“懒人改变世界”,phoenix的出现也验证来它的准确性。
phoenix和hive类似,它也是一个工具,hive是在hadoop之上,phoenix是在hbase之上,也是Apache基金的顶级项目。
phoenix是构建在HBase上的一个SQL层,能让我们用标椎的JDBC APIs而不是HBase客户端APIs来创建表、和对HBase数据进行CRUD。
Phoenix完全使用java编写,作为HBase内嵌的JDBC驱动,Phoenix查询引擎会将SQL查询转换为一个或多个HBase扫描(Scan),并编排执行以生成标椎的JDBC结果集。
Phoenix通过以下方式减少我们的代码量,提高生产效率,并且性能比我们自己写代码更好:
1、将SQL编译成原生的HBase scan;
2、确定scan关键字的最佳开始和结束;
3、让scan并行执行。
二、phoenix架构
架构图:
phoenix架构图如上,我们应用通过phoenix驱动通过jdbc方式连接Hbase,其中phoenix驱动会用到hbase的client。phoenix把我们熟知的sql编译转换成hbase原生的shell语法,再通过hbase client去访问hbase,后续到了hbase的流程可参考我前面文章《HBase详解》的介绍。
三、phoenix表与hbase表对应关系
默认情况下,直接在hbase中创建的表,通过phoenix是查看不到的。
如果要在phoenix中操作由hbase创建的表,则需要在phoenix中进行表的映射。
映射方式有两种:视图映射和表映射
假设Hbase中已创建表test,test有两个列簇name、company
视图映射:
Phoenix创建的视图是**【只读】**的,只能用来做查询,无法通过视图对源数据进行修改等操作。
create view "test"(empid varchar primary key,"name"."firstname" varchar,"name"."lastname" varchar,"company"."name" varchar,"company"."address" varchar);
表映射
(1)、把create view改为create table即可
(2)、当HBase中不存在表时,使用create table指令创的表,系统将会自动在Phoenix和HBase中创建表,并会根据指令内的参数对表结构进行初始化。
create table "test"(empid varchar primary key,"name"."firstname" varchar,"name"."lastname" varchar,"company"."name" varchar,"company"."address" varchar
);
四、phoenix基本语法
!table查看表信息
!describe tablename可以查看表字段信息
SELECT
SELECT * FROM TEST where colum = '123' LIMIT 10 OFFSET 10;
UPSERT VALUES
UPSERT INTO TEST(NAME,ID) VALUES('foo',123);
UPSERT SELECT
UPSERT INTO test.targetTable(col1, col2) SELECT col3, col4 FROM test.sourceTable WHERE col5 < 100
DELETE
DELETE FROM TEST WHERE ID=123;
CREATE TABLE
CREATE TABLE my_schema.my_table ( id BIGINT not null primary key, date Date)
DROP TABLE
DROP TABLE my_schema.my_table;
ALTER
ALTER TABLE my_table ADD dept_name char(50);
CREATE INDEX
CREATE INDEX my_idx ON sales.opportunity(last_updated_date DESC)
CREATE INDEX my_idx ON log.event(created_date DESC) INCLUDE (name, payload) SALT_BUCKETS=10
DROP INDEX
DROP INDEX my_idx ON sales.opportunity
phoenix字段类型
类型 | java 类型 | 长度 |
---|---|---|
INTEGER | java.lang.Integer | -2147483648 to 2147483647 |
UNSIGNED_INT | java.lang.Integer | 0 to 2147483647 |
BIGINT | java.lang.Long | -9223372036854775807 to 9223372036854775807 |
UNSIGNED_LONG | java.lang.Long | 0 to 9223372036854775807 |
TINYINT | java.lang.Byte | -128 to 127 |
UNSIGNED_TINYINT | java.lang.Byte | 0 to 127 |
SMALLINT | java.lang.Short | -32768 to 32767 |
UNSIGNED_SMALLINT | java.lang.Short | 0 to 32767 |
FLOAT | java. lang.Float | -3.402823466 E + 38 to 3.402823466 E + 38 |
UNSIGNED_FLOAT | java.lang.Float | -3.402823466 E + 38 to 3.402823466 E + 38 |
DOUBLE | java.lang.Double | -1.7976931348623158 E+308 to 1.7976931348623158 E+308 |
UNSIGNED_DOUBLE | java.lang.Double | 0 to 1.7976931348623158 E + 308 |
DECIMAL | java.math.BigDecimal | 38 digits |
BOOLEAN | java.lang.Boolean | |
TIME | java.sql.Time | |
DATE | java.sql.Date | |
TIMESTAMP | java.sql.Timestamp | |
UNSIGNED_TIME | java.sql.Time | |
UNSIGNED_DATE | java.sql.Date | |
UNSIGNED_TIMESTAMP | java.sql.Timestamp | |
VARCHAR( precisionInt ) | java.lang.String | |
CHAR ( precisionInt ) | java.lang.String | |
BINARY ( precisionInt ) | byte[] | |
VARBINARY | byte[] |
五、phoenix加盐表
1. 什么是加盐?
在密码学中,加盐是指在散列之前将散列内容(例如:密码)的任意固定位置插入特定的字符串。其作用是让加盐后的散列结果和没有加盐的结果不相同,在不同的应用情景中,这个处理可以增加额外的安全性。而Phoenix中加盐是指对pk对应的byte数组插入特定的byte数据。
2. 加盐的好处?
加盐能解决HBASE读写热点问题,例如:单调递增rowkey数据的持续写入,使得负载集中在某一个RegionServer上引起的热点问题。均匀划分region,均匀打散数据分布。
3. 怎么对表加盐?
在创建表的时候指定属性值:SALT_BUCKETS,其值表示所分buckets(region)数量, 范围是1~256。
CREATE TABLE table (key VARCHAR PRIMARY KEY, col VARCHAR) SALT_BUCKETS = 8;
4. 加盐的原理是什么?
加盐的过程就是在原来key的基础上增加一个byte作为前缀,计算公式如下:
new_row_key = (++index % BUCKETS_NUMBER) + original_key
5、加盐加多少好
加盐要是hbase节点数的倍数,最少是1倍(3个节点的就是3)
根据表数据量大小增加加盐数
六、phoenix二级索引
phoenix的二级索引是一个很好用的功能,解决了hbase没有索引的缺陷。我们创建了二级索引其实是在hbase额外建了一张表,该表数据无需我们维护,用phoenix自动维护。
七、phoenix使用注意点
1.select语句禁止全表扫描,一定要走主键索引或者二级索引,可用explain查看sql执行计划。我们可以巧妙合理的设计我们的主键。
2、使用主键索引查询时,where条件的顺序一定要和建表定义主键的顺序一致,要不然走不到主键索引。
3.使用二级索引只能查主键字段和创建索引是INCLUDE后面添加的字段,禁止查额外字段,因为查了其它字段就不会走到二级索引,是全表扫。非要查额外字段可以查两次,先查出主键,再根据主键去查。
4.建表和索引是最好都提前做加盐。
八、java应用使用phoenix
1.引入架包
<dependency><groupId>org.apache.phoenix</groupId><artifactId>phoenix-core</artifactId><version>phoenix版本</version>
</dependency>
2.phoenix连接
phoenix连接我们连接普通关系型数据库一样,可以使用阿里巴巴的连接池com.alibaba.druid.pool.DruidDataSource
驱动:org.apache.phoenix.jdbc.PhoenixDriver
连接串dbUrl为:jdbc:phoenix:zk1,zk2:2181/hbase,其中zk为Zookeeper的ip,2181为Zookeeper端口,/hbase要看我们hbase的配置选填
3.使用
可以和关系型库那样愉快的使用mybatis框架访问hbase数据.
九、phoenix连接工具
1、服务器官网下载好phoenix,进入bin目录执行如下命令即可进去phoenix,就可以使用phoenix命令操作了。
./sqlline.py zk1,zk2:2181/hbase
2、图形化界面工具
DBeaver,SQuirrel等
更多phoenix相关内容请参考phoenix官网
http://phoenix.apache.org/
参考链接
https://blog.csdn.net/dz77dz/article/details/105784099
https://www.cnblogs.com/hbase-community/p/8727674.html
phoenix使用详解相关推荐
- phoenix中文详解
https://www.cnblogs.com/linbingdong/p/5832112.html
- Phoenix的使用方式详解
本篇博客小菌为大家分享的是关于Phoenix的使用方式与常用shell. 前文传送门:<Phoenix(凤凰)的安装介绍> Phoenix使用 先让我们来看看Phoenix的几种方法调用 ...
- 通俗易懂word2vec详解词嵌入-深度学习
https://blog.csdn.net/just_so_so_fnc/article/details/103304995 skip-gram 原理没看完 https://blog.csdn.net ...
- bootloader详解(转载)
一.bootloader介绍 bootloader是硬件在加电开机后,除BIOS固化程序外最先运行的软件,负责载入真正的操作系统,可以理解为一个超小型的os.目前在Linux平台中主要有lilo.gr ...
- 【NLP】Google BERT详解
版权声明:博文千万条,版权第一条.转载不规范,博主两行泪 https://blog.csdn.net/qq_39521554/article/details/83062188 </div> ...
- 逆透视变换详解 及 代码实现(一)
逆透视变换详解 及 代码实现(一) 中主要是原理的说明: 一.世界坐标轴和摄像机坐标轴 从下图中可以看到,世界坐标为(X,Y,Z) 相机坐标为(Xc,Yc,Zc) 而世界坐标变换到相机坐标存在一个旋 ...
- oracle通过dblink连接mysql配置详解(全Windows下)
oracle通过dblink连接mysql配置详解(全Windows下) 关于oracle通过dblink连接mysql,经过了两周的空闲时间研究学习,终于配置好了,真是不容易啊,仔细想想的话,其实也 ...
- 万字HBase详解带你畅游大数据的海豚湾
写在前面:我是「且听风吟」,目前是某上市游戏公司的大数据开发工程师,热爱大数据开源技术,喜欢分享自己的所学所悟,现阶段正在从头梳理大数据体系的知识,以后将会把时间重点放在Spark和Flink上面. ...
- 计算机bios设置论文,玩转电脑必看知识——各种BIOS设置详解 的更多相关文章
7.IDE Primary Master UDMA(第一个IDE主控制器下的UDMA模式) 8.IDE Primary Slave UDMA(第一个IDE从控制器下的UDMA模式) 9.IDE Sec ...
最新文章
- gtkorphan清理孤立软件包
- 《JAVA练习题目4》 训练要点:String和StringTokenizer的使用,以及排序算法。
- python中if elif语句优化_python – 最有效的方式做一个if-elif-elif-else语句当else做的最多?...
- 一文让你明白Redis持久化 1
- fprintf,sprintf,sscanf,fscanf
- 编译器角度看C++复制构造函数
- netty系列之:netty中的Channel详解
- 编译器——指令的汇编
- CodeProject上的两个简单绘图程序
- UWB定位系统场景的分析
- “虚度”一下时光,给老友写封信
- Android Bottom Sheet详解
- [POJ 3311] Hie with the Pie
- eclipse鼠标变成十字架
- Django+Vue开发生鲜电商平台之11.首页、商品数量、缓存和限速功能开发
- 小米路由器忘记管理密码后重置密码
- 鼠标侧键设置工具X-Mouse安装教程
- 天顶围棋 8 zenith 8_2019年第九届世界围棋巅峰对决盛大启幕 安徽阜阳点燃黑白激情...
- 非CS专业的人如何学才能够像CS专业一样
- java数组字符串转数组或集合
热门文章
- ps入门第15天_运用路径工具绘制矢量图形_根据照片用路径画卡通
- 广东大爷10栋房收租,外卖小哥为5块钱崩溃大哭:成人世界是你想不到的心酸...
- 0x000007FEFD72A06D 处(位于 Opencv_Test.exe 中)引发的异常: Microsoft C++ 异常: cv::Exception
- 解决Eclipse中progress一直在右下角跳出来的问题
- 推荐好用的天气插件(天气网)
- 数据挖掘与机器学习:Weka
- 180220——折腾:U盘作启动盘安装win 7
- 网盘不限速下载神器,亲测可用,速度10MB/s以上!
- 汇编语言程序设计钱晓捷第五版期末复习参考
- 苹果Windows装oracle10,苹果MacBook安装Win10系统教程