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'
1)在Phoenix中DDL/DML是忽略大小写的,而表名和列名是区分大小写的;
2)CREATE VIEW风险较小,但是readonly无法新增修改数据;
3)CREATE TABLE风险较大,一旦表结构与HBase原有表不一致,原表将会被新表覆盖,造成数据丢失;
4)映射表创建后,遗留数据无法查询,新增修改后的数据才可见
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);
- 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;
插入数据
删除序列
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:
1024000000
Phoenix on HBase的更多相关文章
- [saiku] 使用 Apache Phoenix and HBase 结合 saiku 做大数据查询分析
saiku不仅可以对传统的RDBMS里面的数据做OLAP分析,还可以对Nosql数据库如Hbase做统计分析. 本文简单介绍下一个使用saiku去查询分析hbase数据的例子. 1.phoenix和h ...
- 浅谈Phoenix在HBase中的应用
一.前言 业务使用HBase已经有一段时间了,期间也反馈了很多问题,其中反馈最多的是HBase是否支持SQL查询和二级索引,由于HBase在这两块上目前暂不支持,导致业务在使用时无法更好的利用现有的经 ...
- 通过phoenix在hbase上创建二级索引,Secondary Indexing
环境描述: 操作系统版本:CentOS release 6.5 (Final) 内核版本:2.6.32-431.el6.x86_64 phoenix版本:phoenix-4.10.0 hbase版本: ...
- phoenix连接hbase数据库,创建二级索引报错:Error: org.apache.phoenix.exception.PhoenixIOException: Failed after attempts=36, exceptions: Tue Mar 06 10:32:02 CST 2018, null, java.net.SocketTimeoutException: callTimeou
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- Hadoop生态圈-phoenix(HBase)的索引配置
Hadoop生态圈-phoenix(HBase)的索引配置 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 创建索引是为了优化查询,我们可以在phoenix上配置索引方式. 一.修改 ...
- Phoenix 映射 HBase + Maven
声明 本文基于 Centos6.x + CDH5.x 什么是Phoenix Phoenix的团队用了一句话概括Phoenix:"We put the SQL back in NoSQL&qu ...
- phoenix到hbase的应用
一.phoenix的简介 hbase的java api或者其语法很难用,可以认为phoenix是一个中间件,提供了访问hbase的另外的语法. 二.配置phoenix和hbase 1.下载 phoen ...
- 关于phoenix构建hbase视图,更新hbase表后,视图表是否更新的验证
1:创建表 create 'MY_TABLE', 'CF1','CF2' 2:在hbase上插入一条数据 put ' ,'CF1:V1', 'uwo1' 3:在phoenix上创建视图 create ...
- 基于Phoenix对HBase建索引
参考: Phoenix与HBase集成进行数据分析 HBase查询速度慢原因排查 操作1,执行查询,如下: : jdbc:phoenix:node3::/hbase> SELECT * FROM ...
随机推荐
- Mongo同步数据到Elasticsearch
个人博客:https://blog.sharedata.info/ 最近需要把数据从Mongo同步到Elasticsearch环境:centos6.5python2.7pipmongo-connect ...
- SSH配置免秘钥登录
一. SSH 配置免秘要登录 配置SSH 免秘要登录,虽然就那么几步,但总是会出现点小问题,今天就做下记录.SSH 免秘钥就是让两台机器相互信任,不需要输入密码就能相互登录.配置相互信任就是把各自的 ...
- 解决Oracle安装时报错“SID已在使用”办法
1. 开始->设置->控制面板->管理工具->服务 停止所有Oracle服务. 2. 开始->程序->Oracle - OraHome81->Oracle I ...
- Model的save方法的使用
在使用类方法创建对象的时候发生save()总提示缺少self参数的错误: class BookInfo(models.Model): #创建书本信息类,继承models.Model booktitle ...
- MySQL中B+树索引的使用
1) 不同应用中B+树索引的使用 对于OLTP应用,由于数据量获取可能是其中一小部分,建立B+树索引是有异议时的 对OLAP应用,情况比较复杂,因为索引的添加应该是宏观的而不是微观的. ...
- 基于websocket搭建简易群聊
1.前端HTML <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=&qu ...
- (4.16)sql server迁移DB文件(同一DB内)
SQL Server 修改数据库物理文件存在位置 关键词:迁移文件,迁移temp库(这怎么迁移呢,用方法2即可,需要重启实例) 三种均需要离线: 一共分为(1)脱机迁移和(2)在线迁移. (1)迁移方 ...
- 005-快捷键,host,查看版本
一.系统快捷键 设置 键盘--查看 shift+ctrl +print 区域截图至剪切版 ctrl+alt+箭头 切换工作区 自定义打开终端快捷键 设置->键盘->自定义:名称: ...
- (扫盲)DTO数据传输对象
DTO即数据传输对象.但从定义上看就是简单的用来传递数据的.主要用途是在框架中定义DTO来绑定表现层中的数据.学过MVC.EF实体模型的都应该知道,我们可以定义一个Model实体来实现前后台数据的交互 ...
- Ip-san 配置过程
1:SAN的定义 SAN是storage area network(存储区域网络)的简写,早期的san采用的是光纤通道技术,后期当iscsi协议出现以后,为了区分两者,就划分了IP SAN和FC SA ...