分享

通过SQuirrel使用Phoenix操作HBase实现创建表和视图

本帖最后由 rsgg03 于 2015-5-4 22:15 编辑
问题导读
1.phoenix不支持哪些功能?
2.phoenix,怎么用呢?~是否可以看成是mysql?
3.什么是Squirrel?
4.如何使用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时,虽然做了一些优化,但延迟还是不小。所以依然是用在OLAP(联机分析处理)中,再将结果返回存储下来。

Phoenix官网上,对Phoenix讲解已经很屌了。如果英语好,可以看官网,更正式一些。
phoenix能干嘛:官网很多描述,总结一句,就是方便操作了。其他的,没有多少优势。
phoenix不能干嘛:
  1. ①不支持事务处理
  2. ②不支持复杂的条件
  3. ③表之间的关联操作
复制代码

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页面有
1.png
我选用的是phoenix3.1.0版本。

2、上传到主节点linux就ok了,解压缩
tar –zxvf phoenix.tar.gz
pwd
/root/phoenix
ll phoenix
2.png
phoenix目录结构可能会有点不同,主要是bin目录的位置,可能在hadoop1下,也可能直接在 /root/phoenix下。没关系,都差不多。

3、拷贝一些文件
既然用的hadoop1.x集群,那么我们使用phoenix目录下,hadoop1目录下的内容。
①将hadoop1下,phoenix-core-3.x.jar拷贝到hadoop集群各个节点HBase的lib目录下。
②重启一下HBase (在这里可以看出,用phoenix需要重启hbase,所以选择hbase查询工具时,需要考虑一下)

4、验证是否安成功
在主节点上,切换到/root/phoenix/hadoop1/bin目录下
输入:
./sqlline.py master:2181

3.png
如果出现这个画面,那就是成功了。如果不成功,可能是zookeeper配置的有一些问题吧。
好吧,先退出此界面,输入!quit回车然后就可以退出了。
这个phoenix挺有意思,有一些命令需要输入叹号的!

phoenix的使用
mysql的话,可以CLI命令行的方式操作;可以通过用jdbc,在Java代码中访问;可以通过用SQLyog进行访问管理;

1、phoenix,怎么用呢?~可以看成是mysql。
①Phoenix可以在CLI下操作;
②可以用jdbc操作;
③可以用phoenix的一个客户端工具Squirrel 访问;

2、先说Squirrel吧,这个简单一些。
Squirrel SQL Client,是一个连接数据库的客户端工具。一般支持JDBC的数据库都可以用它来连接。(如Squirrel连接Mysql)
下载Squirrel SQL Client,解压缩就可以了。运行
squirrel-sql.bat
就出现了图形界面。

3、这肯定要说怎样连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

4.png

需要点击“Drivers”,将phoenix的驱动添加进去。

③点击左上角 蓝色的 “ + ” 加号,添加

5.png

按上面的顺序,依次填写。
第一步,Name:随便写个名字,标记连接;
第二步,Example URL:相当于mysql的jdbc连接串,这里的alias写zookeeper的主机名称,端口号,可以写,可以不写,我一般不写;
第三步,选择Phoenix-core的jar包;
第四步,就是手动输入org.apache.phoenix.jdbc.PhoenixDriver。
然后点击OK。

④配置连接

6.png

Name:为随便起的名称。
Driver:选中③中添加的phoenix驱动。
URL:写如上内容,jdbc:phoenix:node1,node2,master等这里主要是zookeeper主机名。
User Name:要连接的主机的用户名
Password:要连接的主机的密码
点击Test可以进行测试,或点OK连接。
连接完毕,启动后,就可以看到如下的效果了。这里我已经创建了几个表了,这些表都是存在于HBase上的。

7.png


4、Squirrel的一些布局简介(看上面这个图):
1,用squirrel建立的一些连接
2,当前连接下,所有对象,包括主见系统表,普通表,视图。
3,为表,这些表都是实际存在于zookeeper所管理的HBase上的。右键此表,可以对表进行管理。
4,为视图。
5,编写sql脚本的地方,可以输入脚本执行。脚本执行方式,在5上面有一个小人,选中sql,点击小人就可以执行了。或者按ctrl + enter键,执行。
6,为选中的对象的一些基本信息,列信息,行数等。
7,为sql执行的一些状态。

5、在Squirrel中建表或视图
在Squirrel中创建表的过程主要是编写sql,进行执行。sql该怎么写,需要看phoenix驱动都支持什么效果。
这需要看phoenix的官网了。
需要注意的是phoenix是区分大小写的;
自己定义的HBase中的 HTableName,ColumnFamily,以及字段Column,需要和Phoenix中保持一致。(最好都用大写)

phoenix操作hbase,我们有两种方式,创建表,创建视图。
这两种方式,有区别。
创建表的话,可读可写,就可以对HBase进行插入,查询,删除操作。
视图的话,是只读的,一般就只可以进行查询操作
虽然看起来,表的功能,比视图更强大一些。但是就像是mysql等关系型数据库一样,删除表操作,会将表删掉。但是删除视图操作,却不会影响原始表的结构。
因为使用phoenix,创建表后,会自动和hbase建立关联映射。当你使用phoenix删除和hbase之间的关系时,就会将hbase中的表也删掉了
所以用视图,会对原始的HBase表影响小一些。

6、用phoenix可以创建表
(1)若hbase中,不存在名为htablename或htablename2的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)
在SQuirreL中执行上面的SQL脚本,执行过程中,如果出现错误,会在工具的下面进行提示。
若成功后,就可以在HBase中看到这个表了,而且在SQuirrel中,看到此表。

(2)若hbase存在htablename3,但SQuirrel中看不到时
当安装好SQuirrel时,本以为连上hbase后,就可以在SQuirrel中看到hbase中的表了。但是并没有看到,也不会显示。
如果要想看到hbase中已存在的表,还需要一些操作。

也就是如果想要在SQuirrel中,看到htablename3,且想要对htablename3进行操作。
也还是需要在SQuirreL中进行执行创建表的操作,执行完毕后,就会将HBase的htablename3,映射到SQuirreL中。
这样我们就可以在Java api中进行操作了。否则是不可以的。

那么需要哪些具体操作呢?其实很简单,我当时没想到
就像创建表一样,使用Create table就可以了。就这样简单。
不过这个语句怎么写呢?怎样对应呢?
create htablename3(    --这句话直接写就可以了,这样的话,HBase中的RowKey转换成phoenix中的主键,列名就叫 pk。    --rowkey自动会和primary key进行对应。    pk VARCHAR primary key null,    --将名为cf的columnFamily下,字段名为col1的字段,写在这里。    "cf"."col1" VARCHAR null,    --将名为cf的columnFamily下,字段名为col2的字段,写在这里。。。下面就以此类推    "cf"."col2" VARCHAR null,    "cf2"."col3" VARCHAR null,    "cf2"."col4" VARCHAR null)
然后在SQuirreL中执行,然后就可以看到数据了。
不过此时,可能还会有问题,乱码。 在SQuirrel中,主键以及一些包含汉字的字段,都是方块等乱码了。这个怎么解决???(暂未解决)

7、用phoenix可以创建视图
假如,要对刚刚创建的表htablenameX创建视图操作
CREATE  VIEW  “htablenameX”   (pk VARCHAR primary key)   default_column_family = ‘FM’
创建完成后,这里的“htablenameX” 是HBase中table “htablenameX”的名称。然后定义一个主键,就可以了。

可能还不太清楚,看下面
(1)第一种视图,假如HBase中存在表”DAMAI”,需要以视图的方式,操作它,那么开始创建视图
CREATE VIEW “DAMAI” ( PK VARCHAR PRIMARY KEY) DEFAULT_COLUMN_FAMILY=’FM’
这里双引号内的 “DAMAI” 和HBase中的表名是一样的,所以会自动关联。
会自动对应表名,自动关联字段。
这里需要注意:创建视图时,要保证在SQuirrel工具中,没有相同名称的表存在。
8.png

那么,如果想针对HBase中的一个表,建多个视图呢?慢慢来

(2)第二种视图,可以在Phoenix table的基础上创建
CREATE VIEW my_VIEW (new_col VARCHAR,new_col2 VARCHAR) AS SELECT * FROM phoenix_Table WHERE ……
也就是,原来在phoenix中,已经创建了表了。
例如:htablename2。在htablename2上建立一个视图,叫”mingzisuibian”  (名字随便)
CREATE VIEW mingzisuibian ( new_col VARCHAR, new_col2  VARCHAR )  AS SELECT * FROM htablename2 WHERE ….(针对htablename2的查询条件)

(3)第三种建视图的方式,是在视图之上建立视图
CREATE VIEW my_VIEW_ON_VIEW AS SELECT * FROM MY_VIEW WHERE ……
在(1)中,我们创建了一个视图 “DAMAI”。这里面包括了全部的字段。
所以说,在创建DAMAI视图的时候,可以将全部字段都包括进来。
所以,我们可以在DAMAI这个视图之上,创建其它视图,这样视图的名称,就可以随便定了。
例如:
CREATE VIEW BIGBIG AS SELECT * FROM DAMAI WHERE ……
不断往hbase中,添加数据,随着数据的增长,在phoenix建的视图中也可以看到的数据的条数,在同步增加。

综上所述,从上面可以看出,为了避免影响hbase的表信息,最好是创建一个视图。然后在视图的基础上,再创建其它视图。
也就是,先执行视图里面的(1),再执行视图里面的(3)。



欢迎大家如about云官方群371358502,更新咨询,更新资源,随时关注

已有(1)人评论

跳转到指定楼层
rsgg03 发表于 2015-5-4 22:23:44
在SQuirrel中使用Phoenix操作HBase——基本的sql查询






使用标准的sql命令查看一下视图或表中的数据

select * from damai

这时可以用大小写都行了。没有区分

1.png


虽然phoenix能够执行标准的sql,但是phoenix的语法,数据类型,和方法还是稍微有一些差别。

在执行sql语句时,会常需要查询一下官网。

下面显示的,是我写的一些例子,字段和表名不重要,只是看一下phoenix执行sql时,一些写法。

主要包括 phoenix对hbase日期操作,phoenix对hbase分组,phoenix对hbase排序等


注意一下,在SQuirrel中,执行sql语句时,按Ctrl + Enter键就可以执行了。


Phoenix中的语法

2.png

Phoenix中的数据类型

3.png

Phoenix中的方法

4.png

我自己使用过程中一些简单语句,如下


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;





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条