HBase,phoenix
HBase,一个NoSQL数据库,可存储大量非关系型数据。
HBase,可以用HBase shell进行操作,也可以用HBase Java api进行操作。HBase虽然是一个数据库,但是它的查询语句,很不太好用。要是能像使用Mysql等关系型数据库一样用sql语句操作HBase,那就很Perfect了。
现有工具有很多Hive,Tez,Impala,Shark/Spark,Phoenix等。今天主要记录Phoenix。
phoenix,由saleforce.com开源的一个项目,后又捐给了Apache。它相当于一个Java中间件,帮助开发者,像使用jdbc访问关系型数据库一些,访问NoSql数据库HBase。
phoenix,操作的表及数据,存储在hbase上。phoenix只是需要和Hbase进行表关联起来。然后再用工具进行一些读或写操作。
其实,可以把Phoenix只看成一种代替HBase的语法的一个工具。虽然可以用java可以用jdbc来连接phoenix,然后操作HBase,但是在生产环境中,不可以用在OLTP中。在线事务处理的环境中,需要低延迟,而Phoenix在查询HBase时,虽然做了一些优化,但延迟还是不小。所以依然是用在OLAT中,再将结果返回存储下来。
Phoenix官网上,对Phoenix讲解已经很屌了。如果英语好,可以看官网,更正式一些。
Phoenix安装
1、下载phoenix。
phoenix与HBase版本对应关系
Phoenix 2.x - HBase 0.94.x
Phoenix 3.x - HBase 0.94.x
Phoenix 4.x - HBase 0.98.1+
我目前测试使用版本概况:
Hadoop1.0.4
HBase0.94.18
所以我可以用phoenix2.x,phoenix3.x。
官网download页面有
我选用的是phoenix3.1.0版本。
2、上传到主节点linux就ok了,解压缩
tar –zxvf phoenix.tar.gz
pwd
/root/phoenix
ll phoenix
phoenix目录结构可能会有点不同,主要是bin目录的位置,可能在hadoop1下,也可能直接在 /root/phoenix下。没关系,都差不多。
3、拷贝一些文件
既然用的hadoop1.x集群,那么我们使用phoenix目录下,hadoop1目录下的内容。
①将hadoop1下,phoenix-core-3.x.jar拷贝到hadoop集群各个节点HBase的lib目录下。
②重启一下HBase
4、验证是否安成功
在主节点上,切换到/root/phoenix/hadoop1/bin目录下
输入 ./sqlline.py master:2181
如果出现这个画面,那就是成功了。如果不成功,可能是zookeeper配置的有一些问题吧。
好吧,先退出此界面,输入!quit回车然后就可以退出了。
这个phoenix挺有意思,有一些命令需要输入叹号的!
phoenix的使用
mysql的话,可以CLI命令行的方式操作;可以通过用jdbc,在Java代码中访问;可以通过用SQLyog进行访问管理;
phoenix,怎么用呢?~可以看成是mysql。Phoenix可以在CLI下操作;可以用jdbc操作;可以用phoenix的一个客户端工具Squirrel 访问;
先说Squirrel吧,这个简单一些。
Squirrel SQL Client,是一个连接数据库的客户端工具。一般支持JDBC的数据库都可以用它来连接。(如Squirrel连接Mysql)
下载Squirrel SQL Client,解压缩就可以了。运行squirrel-sql.bat就出现了图形界面。
这肯定要说怎样连Phoenix?
①在Squirrel安装目录的lib下,添加几个jar包
a,phoenix-core-xxx.jar
b,phoenix-3.0-client.jar
c,hbase-0.94.18.jar
d,hadoop1.0.4.jar
e,hadoop-common-xxx.jar
②
需要点击“Drivers”,将phoenix的驱动添加进去。
③点击左上角 蓝色的 “ + ” 加号,添加
按上面的顺序,依次填写。第一步Name:随便写个名字,标记连接;第二步Example URL:相当于mysql的jdbc连接串,这里的alias写zookeeper的主机名称,端口号,可以写,可以不写,我一般不写;第三步选择Phoenix-core的jar包;第四步就是手动输入org.apache.phoenix.jdbc.PhoenixDriver。
然后点击OK。
④配置连接
Name:为随便起的名称。
Driver:选中③中添加的phoenix驱动。
URL:写如上内容,jdbc:phoenix:node1,node2,master等这里主要是zookeeper主机名。
User Name:要连接的主机的用户名
Password:要连接的主机的密码
点击Test可以进行测试,或点OK连接。
连接完毕,启动后,就可以看到如下的效果了。这里我已经创建了几个表了,这些表都是存在于HBase上的。
Squirrel的一些布局简介:
1,用squirrel建立的一些连接
2,当前连接下,所有对象,包括主见系统表,普通表,视图。
3,为表,这些表都是实际存在于zookeeper所管理的HBase上的。右键此表,可以对表进行管理。
4,为视图。
5,编写sql脚本的地方,可以输入脚本执行。脚本执行方式,在5上面有一个小人,选中sql,点击小人就可以执行了。或者按ctrl + enter键,执行。
6,为选中的对象的一些基本信息,列信息,行数等。
7,为sql执行的一些状态。
下面在Squirrel中创建一个表
在Squirrel中创建表的过程主要是编写sql,进行执行。sql该怎么写,需要看phoenix驱动都支持什么效果。
这需要看phoenix的官网了。
需要注意的是phoenix是区分大小写的,自己定义的HBase中的 HTableName,ColumnFamily,以及字段Column,需要和Phoenix中保持一致。
phoenix操作hbase,我们有两种方式,创建表,创建视图。
这两种方式,有区别。
比如,创建表的话,就可以对HBase进行插入,查询,删除操作。视图的话,一般就只可以进行查询操作
虽然看起来,表的功能,比视图更强大一些。但是就像是mysql等关系型数据库一样,删除表操作,会将表删掉。但是删除视图操作,却不会影响原始表的结构。
因为使用phoenix,创建表后,会自动和hbase建立关联映射。当你使用phoenix删除和hbase之间的关系时,就会将hbase中的表也删掉了
所以用视图,会对原始的HBase表影响小一些。
phoenix可以创建表,
若hbase中,不存在HTable:
create htablename (
pk VARCHAR primary key not null,
col1 VARCHAR null,
col2 VARCHAR null,
col3 VARCHAR null
)
create htablename2(
pk VARCHAR primary key null,
"cf"."col1" VARCHAR null,
"cf"."col2" VARCHAR null,
"cf2"."col3" VARCHAR null,
"cf2"."col4" VARCHAR null,
)
上面的SQL脚本,可以在SQuirreL中进行执行,执行过程中,如果出现错误,会在工具的下面进行提示。若成功后,就可以在HBase中看到这个表了。
若Hbase中,已存在名为htablename3的HTable,那么SQuirrel是不会直接显示出hbase中这个已存在的表的,我们还需要额外做一些操作。
在SQuirreL中进行执行,执行完毕后,就会将HBase的htablename3,映射到SQuirreL中。这样我们就可以在Java api中进行操作了。否则是不可以的。
那么需要哪些具体操作呢?其实很简单,我当时没想到
就像创建表一样,使用Create table就可以了。就这样简单。
不过这个语句怎么写呢?怎样对应呢?
create htablename3(
pk VARCHAR primary key null, ---列名就叫 pk。rowkey自动会和primary key进行对应。
"cf"."col1" VARCHAR null, ---将名为cf的columnFamily下,字段名为col1的字段,写在这里。
"cf"."col2" VARCHAR null, ---将名为cf的columnFamily下,字段名为col2的字段,写在这里。。。下面就以此类推
"cf2"."col3" VARCHAR null,
"cf2"."col4" VARCHAR null,
)
然后在SQuirreL中执行,然后就可以看到数据了。
不过此时,可能还会有问题,乱码。 在SQuirrel中,主键以及一些包含汉字的字段,都是方块等乱码了。这个怎么解决???
创建试图
CREATE VIEW "heihei"
(pk VARCHAR primary key)
default_column_family = 'FM'
创建完成后,这里的“heihei” 是HBase中table的名称。然后定义一个主键,就可以了。
创建视图
①CREATE VIEW "DAMAI" ( PK VARCHAR PRIMARY KEY) DEFAULT_COLUMN_FAMILY='FM'
这里双引号内的 “DAMAI” 和HBase中的表名是一样的,所以会自动关联。
那么,如果想针对HBase中的一个表,建多个视图呢?
②第二种视图,可以在Phoenix table的基础上创建。
CREATE VIEW my_VIEW (new_col VARCHAR,new_col2 VARCHAR) AS SELECT * FROM phoenix_Table WHERE ......
③第三种视图,是建立在视图之上,
CREATE VIEW my_VIEW_ON_VIEW AS SELECT * FROM MY_VIEW WHERE ......
所以说,在创建DAMAI视图的时候,可以将全部字段都包括进来。然后再在此视图基础上,创建其它视图。
随着数据的增长,视图中可以看到的数据的条数,也在同步增加。
使用命令查看一下视图中的数据
select * from damai 这时可以用大小写都行了。没有区分
查询结果现在,只有一列。看来是创建视图时,没有关联好其他列。没关系,删掉,重建。
Phoenix中的语法
Phoenix中的数据类型
Phoenix中的方法
我自己使用过程中一些简单语句,如下:
select * from shuju;
select count(1) from shuju;
select cmtid,count(1) as num from shuju group by cmtid order by num desc;
select avg(TO_NUMBER(avgt)) from shuju;
select cmtid,count(1) as num,avg(TO_NUMBER(avgt)) as avgt,avg(TO_NUMBER(loss)) as loss from shuju group by cmtid order by num desc;
select acm,dtype,cmtid,count(1) as num,avg(TO_NUMBER(avgt)) as avgt,avg(TO_NUMBER(loss)) as loss
from shuju
group by acm,dtype,cmtid
order by num desc;
select acm,dtype,porgcode,orgid,cmtid,count(1) as num,avg(TO_NUMBER(avgt)) as avgt,avg(TO_NUMBER(loss)) as loss
from shuju
group by acm,dtype,porgcode,orgid,cmtid
order by num desc;
where TO_DATE(ttime,'yyyyMMddHHmmss')=TO_DATE('20141125','yyyyMMdd')
select ttime from shuju order by ttime desc;
where TO_DATE(ttime,'yyyyMMddHHmmss')=TO_DATE('20141125','yyyyMMdd')
select TO_DATE(ttime,'yyyyMMddHHmmss') from shuju;
select TO_DATE('20141125','yyyyMMdd') from shuju;
select (TO_DATE(ttime,'yyyyMMddHHmmss')=TO_DATE('20141125','yyyyMMdd')) as aaa from shuju order by aaa asc;
用SHELL命令来操作phoenix
用SHELL来操作phoenix,不太好用。无助的时候,你可以喊救命!So,Say Help Help Help
./sqlline.py master:2181
进入shell后,输入help
可以看到很多命令,前面都带了一个叹号。根据意思自己猜一猜功能,然后试一试效果,就可以了。不记录了。
用Phoenix Java api操作HBase
这个过程就想是JDBC一样使用就可以了。
①先将phoenix的 core.jar包 和 phoenix的client.jar 包放到lib里。
②创建连接,过程和mysql类似
public Connection GetConnection(){
Connection cc = null;
String driver = "org.apache.phoenix.jdbc.PhoenixDriver";
//String url = "jdbc:phoenix:192.168.206.21:2181";
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
if (cc == null) {
try {
cc = DriverManager.getConnection(url);
} catch (SQLException e) {
e.printStackTrace();
}
}
return cc;
}
HBase,phoenix相关推荐
- kettle操作mysql,hive,hbase,phoenix性能测试(使用笔记性能测试部分补充和更新)...
注:前提不泄露公司信息 Mysql数据库连接 主机名或 IP 地址: xxx 端口: xxx 数据库:xxx 用户名: xxxx 保存密码: xxxxx 1.1 mysql写入hive (1)a表 数 ...
- 利用phoenix建立二级索引查询hbase,大神请无视
利用phoenix建立二级索引查询hbase phoenix的简单介绍 phoenix,中文译为"凤凰",很美的名字.Phoenix是由saleforce.com开源的一个项目,后 ...
- 为什么国内流行hbase,国外反而多用cassandra?
为什么国内流行hbase,国外反而多用cassandra? Google trend上的数据 只有中韩在使用hbase,其他地区大多都在用cassandra,这是什么原因导致的?hbase和cassa ...
- HBase安装phoenix实战shell操作
Hbase安装参考https://rumenz.com/rumenbiji/hadoop-hbase-install.html 由于我们安装的是 hbase-2.3.1-bin.tar.gz ,所以需 ...
- HBase 集成 Phoenix 构建二级索引实践
Phoenix 在 HBase 生态系统中占据了非常重要的地位,本文主要包括以下几方面内容: Phoenix 介绍 CDH HBase 集成 Phoenix 使用 Phoenix 创建 HBase 二 ...
- HBase、Phoenix
一.前言(整体聊聊hbase,hdfs,Phoenix) 一.从HDFS角度理解HBase写:1.HBase的数据存储在HDFS之上,HDFS不支持随机写.因此HBase做一系列优化.2.因为HDFS ...
- Hbase之phoenix的介绍与使用
目录 一.phoenix的简介 二.phoenix的安装与基本操作 Phoenix Shell操作 表的映射 视图映射 表映射 数字类型 JDBC操作 Phoenix二级索引 全局索引 包含索引 本地 ...
- 一些开源搜索引擎实现——倒排使用原始文件,列存储Hbase,KV store如levelDB、mongoDB、redis,以及SQL的,如sqlite或者xxSQL...
本文说明:除开ES,Solr,sphinx系列的其他开源搜索引擎汇总于此. A search engine based on Node.js and LevelDB A persistent, net ...
- [转]大数据环境搭建步骤详解(Hadoop,Hive,Zookeeper,Kafka,Flume,Hbase,Spark等安装与配置)
大数据环境安装和配置(Hadoop2.7.7,Hive2.3.4,Zookeeper3.4.10,Kafka2.1.0,Flume1.8.0,Hbase2.1.1,Spark2.4.0等) 系统说明 ...
最新文章
- GDAL库简介以及在Windows下编译过程
- 帝国cms底部代码哪里改?要修改版权和统计代码
- 区块链BaaS云服务(21)腾讯CCGP ”跨链协议 AMDP“
- navigating the online library
- [LeetCode] Valid Anagram - 字符串排序比较系列
- FL2440移植LINUX-3.4.2 -- 按键驱动和触摸屏驱动移植
- php怎么关闭oracle连接,PHP 连接 Oracle
- vslabel隐藏了怎么找_vscode菜单栏与工具栏隐藏之后怎么找回来
- 【JAVA 第三章 流程控制语句】课后习题 三角形面积计算
- 用C#实现对Oracle 存储过程/函数/包的调试(附源代码)
- fastjson 判断是否包含_Fastjson, Gson, org.json.JSON三者对于JSONObject及JSONArray的判断
- Maven—Windows操作系统中安装配置Maven环境
- java中几个常用的开源常用工具类
- 个人所得税个人计算机,个人所得税计算器(PC)版
- 软路由保姆级入门教程 一篇看懂软路由
- 电商的运营模式流程(最全解析电商运营模式)
- ftp客户端上传文件步骤
- 上帝为什么不直接把魔鬼撒但这等邪…
- 如何彻底卸载2345全家桶?
- golang:An operation on a socket could not be performed because the system lacked sufficient buffer s
热门文章
- 好好一个985,怎么被学生戏称为全国最“水”的高校?
- 关于我用chat gpt生成了一篇nba比赛前瞻预测文章,大家觉得怎么样!
- 山东大学软件学院数字仓库与数字挖掘考试(回忆版)
- 计算机上摄氏度的符号怎么输,Word中摄氏度符号怎么打出来?
- 基于C语言的图书管理信息系统的设计与实现
- 苹果企业开发者账号申请记录
- unity替换shader方法
- ARDUINO(os)基本介绍之开发版类型
- linux中lv的详细创建流程【化分区-pv-vg-lv创建整套流程】,centos中lv脚本创建vg-pv-lv,-bash: lvs: command not found处理方法
- 微信小程序订单语音播报