Phoenix on HBase
- 嵌入式的JDBC驱动,实现了大部分的java.sql接口,包括元数据API
- 可以通过多部行键或是键/值单元对列进行建模
- 完善的查询支持,可以使用多个谓词以及优化的扫描键
- DDL支持:通过CREATE TABLE、DROP TABLE及ALTER TABLE来添加/删除列
- 版本化的模式仓库:当写入数据时,快照查询会使用恰当的模式
- DML支持:用于逐行插入的UPSERT VALUES、用于相同或不同表之间大量数据传输的UPSERT SELECT、用于删除行的DELETE
- 通过客户端的批处理实现的有限的事务支持
- 单表——还没有连接,同时二级索引也在开发当中
- 紧跟ANSI SQL标准,HIVE不完全支持SQL92,而Phoenix 接近ANSI SQL-2003
- Phoenix 2.x - HBase 0.94.x
- Phoenix 3.x - HBase 0.94.x
- Phoenix 4.x - HBase 0.98.1+
从Apache Phoenix 下载Phoenix二进制包安装,也可以从Apache或Github下载源码使用Maven编译,命令如下:
# mvn package -DskipTests -Dhadoop.profile=2
# mv $PHOENIX_HOME/phoenix-hadoop2-compat/target/phoenix-hadoop2-compat-4.0.0-incubating.jar /opt/cloudera/parcels/CDH/lib/hbase/lib/
hbase(main):001:0> list
create table test (mykey integer not null primary key, mycolumn varchar); upsert into test values (1,'Hello'); upsert into test values (2,'World!'); select * from test;
0: jdbc:phoenix:zk_host> !columns TEST
hbase(main):002:0> scan 'TEST'
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.PreparedStatement; import java.sql.Statement; public class TestJava { public static void main(String[] args) throws SQLException { Statement stmt = null; ResultSet rset = null; Connection con = DriverManager.getConnection("jdbc:phoenix:[zk_host]"); // 已通过Shell建立 //stmt = con.createStatement(); //stmt.executeUpdate("create table test (mykey integer not null primary key, mycolumn varchar)"); //stmt.executeUpdate("upsert into test values (1,'Hello')"); //stmt.executeUpdate("upsert into test values (2,'World!')"); //con.commit(); PreparedStatement statement = con.prepareStatement("select * from test"); rset = statement.executeQuery(); while (rset.next()) { System.out.println(rset.getString("mycolumn")); } statement.close(); con.close(); } }
# java -cp phoenix-assembly/target/phoenix-4.0.0-incubating-client.jar:. TestJava
# sudo -u hdfs hadoop fs -put examples/WEB_STAT.csv /user/phoenix/
phoenix> CREATE TABLE "t1" ( pk VARCHAR PRIMARY KEY, "cf".a VARCHAR, "cf".B VARCHAR, "cf".C VARCHAR );
phoenix> select * from "t1";
hbase> put 't1', 'row1', 'cf:B', 'value2'
hbase> put 't1', 'row1', 'cf:c', 'value3'
hbase> scan 't1'
- 在Phoenix中DDL/DML是忽略大小写的,而表名和列名是区分大小写的;
- CREATE VIEW风险较小,但是readonly无法新增修改数据;
- CREATE TABLE风险较大,一旦表结构与HBase原有表不一致,原表将会被新表覆盖,造成数据丢失;
- 映射表创建后,遗留数据无法查询,新增修改后的数据才可见
1.1)Mutable Index
CREATE TABLE my_table (k VARCHAR PRIMARY KEY, v1 VARCHAR, v2 BIGINT);
CREATE INDEX my_index ON my_table (v1);
CREATE INDEX my_index ON my_table (v1) INCLUDE (v2);
CREATE TABLE my_table (k VARCHAR PRIMARY KEY, v VARCHAR) IMMUTABLE_ROWS=true;
注意:只有当查询cloumns完全匹配索引时,基于索引的查询才能生效。例如:
create table usertable (id varchar primary key, firstname varchar, lastname varchar);
create index idx_name on usertable (firstname);
查询语句:
select id, firstname, lastname from usertable where firstname = 'foo';
由于索引只有firstname,而查询cloumns还包括了lastname,因此上述查询索引并未生效,可将索引调整如下:
create index idx_name on usertable (firstname) include (lastname);
SELECT title, author, isbn, description FROM library WHERE published_date > 2010 AND (title, author, isbn) > (?, ?, ?) ORDER BY title, author, isbn LIMIT 20
3)Sequences
创建序列
CREATE SEQUENCE my_sequence START WITH -1000;
CREATE SEQUENCE my_sequence INCREMENT BY 10;
CREATE SEQUENCE my_schema.my_sequence START 0 CACHE 10;
插入数据
UPSERT INTO my_schema(MYKEY, MYCOLUMN) VALUES( NEXT VALUE FOR my_schema.my_sequence, 'foo');
删除序列
DROP SEQUENCE my_sequence;
DROP SEQUENCE IF EXISTS my_schema.my_sequence;
4)Salted Tables
在使用连续的row key时,避免RegionServer出现Hotspotting是HBase使用过程中的通用问题。详细描述及解决方案参考http://blog.sematext.com/2012/04/09/hbasewd-avoid-regionserver-hotspotting-despite-writing-records-with-sequential-keys/。 其问题大致可描述为:HBase按照row key的字典序的形式存储记录,这可以非常快速的通过raw key定位数据,以及数据的startkey和endkey范围。在很多应用场景中,很多时候采用自增或自减的序列作为HBase的row key,比如001,002,003……或者499,498,…… 在这种情况下,下一个序列必须由当前序列和步长计算得出,那么如果Region由很多个RegionServer提供服务,这是没有问题的。但很显然在HBase的架构中,一个Region只有一个RegionServer提供服务。因此,当一个Region达到它预先设置的一个最大范围时,将分裂成为两个较小的Region,并由两个RegionServer接管,无论怎样分裂对Region的写入负载总是落在某一个RegionServer的主机上,若需要全局序列实现自增,显然就失去了集群负载均衡的作用,下图是一个负载情况:
找到了问题原因,那么解决方案就相对容易一下,例如可以salt row keys with a prefix,即为row key做一些添加剂,如增加前缀:
new_row_key = (++index % BUCKETS_NUMBER) + original_key
这里简单的根据数据的原始自增或自减的记录或者ID作为index,对需要分片的bucket去余进行划分,得到一个新的row key:
那么HBase集群相对之前的负载将会大有改善,如下图所示:
Phoenix中以Salted Table的方式支持上述接近方案,可以做如下定义,其中SALT_BUCKETS是1~256的自然数:
CREATE TABLE table (a_key VARCHAR PRIMARY KEY, a_col VARCHAR) SALT_BUCKETS = 20;
5)Configuration and Tuning
这里以bin/psql.py客户端脚本执行调优为例,修改$PHOENIX/phoenix-assembly/target目录下的phoenix-4.0.0-incubating-client.jar的hbase-default.xml文件,增加如下内容以实现将客户端默认缓存从100MB调整为1GB:
phoenix.query.maxServerCacheBytes
1024000000
Phoenix on HBase相关推荐
- Phoenix 原理 以及 Phoenix在HBase中的应用
一.前言 业务使用HBase已经有一段时间了,期间也反馈了很多问题,其中反馈最多的是HBase是否支持SQL查询和二级索引,由于HBase在这两块上目前暂不支持,导致业务在使用时无法更好的利用现有的经 ...
- [saiku] 使用 Apache Phoenix and HBase 结合 saiku 做大数据查询分析
saiku不仅可以对传统的RDBMS里面的数据做OLAP分析,还可以对Nosql数据库如Hbase做统计分析. 本文简单介绍下一个使用saiku去查询分析hbase数据的例子. 1.phoenix和h ...
- springboot集成phoenix,操作hbase
文章目录 前言 1.版本要求 1.1 对hbase版本的支持 2.微服务集成 2.1 创建gradle项目,添加依赖 2.2 application.yml配置 2.3 准备调试环境 2.3.1 服务 ...
- 实时即未来,车联网项目之phoenix on hbase 即席查询【四】
文章目录 Phoenix的介绍和客户端命令 构建HBase的二级索引 原始数据itcast_src构建二级索引 phoenix 使用场景 车辆常用字段明细数据 ETL 车辆明细数据统计 车辆总数统计 ...
- SpringBoot 使用Phoenix操作HBase数据库教程
SpringBoot 使用Phoenix操作HBase数据库教程 文章目录 添加 Phoenix 相关依赖 控制器实现Hbase数据库操作 好的html源码下载 文章目录 借助 Apache Phoe ...
- Apache Phoenix:HBase之上的SQL工具[1] 简介与架构
Apache Phoenix:HBase之上的SQL工具[1] 简介与架构 作者:胡佳辉(Dennis) 时间:2019年1月1日 CSDN博客:https://blog.csdn.net/gob ...
- Phoenix查询hbase
https://www.cnblogs.com/linbingdong/p/5832112.html 这个很全看这个HBase,一个NoSQL数据库,可存储大量非关系型数据. HBase,可以用HB ...
- phoenix+hbase+Spark整合,Spark处理数据操作phoenix入hbase,Spring Cloud整合phoenix
1 版本要求 Spark版本:spark-2.3.0-bin-hadoop2.7 Phoenix版本:apache-phoenix-4.14.1-HBase-1.4-bin HBASE版本:hbase ...
- Phoenix 关联hbase表历史数据
Phoenix 基本使用 进入Phoenix phoenix-sqlline.py 10.248.161.18:2181:/hbase 或者进入目录下执行 cd /opt/cloudera/parce ...
最新文章
- 【一步一步学习spring】spring bean管理(上)
- 【技术总结】几种常用的无线串行通信技术
- 远程唤醒_Python黑科技:在家远程遥控公司电脑,python+微信一键连接!
- Redis数据恢复--误删数据后一次吓尿的经历
- wordpress html音乐,WordPress引用百度Ting音乐方法
- 怎样去掉桌面图标和字的蓝色阴影
- java gradle构建_在Gradle中为JPMS构建Java 6-8库
- Vue项目启动报错 error:cannot find module xxx
- mysql 修改字段长度
- android 官方增量更新,Android 如何实现增量更新
- 计算机录屏幕和声音的软件是什么,电脑录屏软件带声音哪个好用 电脑录屏软件带声音软件...
- ASP.NET公司企业网站源码
- 个人用游戏设计框架图
- Batman+joker乱谈
- Windows 7 新功能 - AppLocker
- Halcon一维码识别实例
- Demo20211202
- 利用Metasploit控制目标电脑(Win7_x64系统)
- Win10 WUP网易云应用出现网络异常
- 活用lambda之list函数处理
热门文章
- Titanic(Kaggle)-数据处理(1)
- Motion Tuned Spatio-temporal Quality Assessmentof Natural Videos
- ORG 0x7C00
- Excel表格的加密与解密
- 【Oracle】数据发散分析
- python 对于程序异常的处理
- python通过什么来区分不同语句块_python经由过程什么来辨别差别的语句块?_后端开发...
- 数据库第六次作业--查询数据--多条件
- Genesis与Wisemont Capital进行深入探讨
- 患上肾囊肿会带来什么危害?