在SQuirrel中使用Phoenix操做HBase——建立表和视图

HBase,一个NoSQL数据库,可存储大量非关系型数据。html

HBase,能够用HBase shell进行操做,也能够用HBase Java api进行操做。HBase虽然是一个数据库,可是它的查询语句,很不太好用。要是能像使用Mysql等关系型数据库同样用sql语句操做HBase,那就很Perfect了。java

 

现有工具备不少Hive,Tez,Impala,Shark/Spark,Phoenix等。今天主要记录Phoenix。node

 

phoenix,由saleforce.com开源的一个项目,后又捐给了Apache。它至关于一个Java中间件,帮助开发者,像使用jdbc访问关系型数据库一些,访问NoSql数据库HBase。mysql

 

phoenix,操做的表及数据,存储在hbase上。phoenix只是须要和Hbase进行表关联起来。而后再用工具进行一些读或写操做。linux

其实,能够把Phoenix只当作一种代替HBase的语法的一个工具。虽然能够用java能够用jdbc来链接phoenix,而后操做HBase,可是在生产环境中,不能够用在OLTP(在线事务处理)中。在线事务处理的环境中,须要低延迟,而Phoenix在查询HBase时,虽然作了一些优化,但延迟仍是不小。因此依然是用在OLAP(联机分析处理)中,再将结果返回存储下来。sql

 

Phoenix官网上,对Phoenix讲解已经很屌了。若是英语好,能够看官网,更正式一些。shell

phoenix能干吗:官网不少描述,总结一句,就是方便操做了。其余的,没有多少优点。数据库

phoenix不能干吗apache

①不支持事务处理api

②不支持复杂的条件

③表之间的关联操做

 

Phoenix安装

 

一、下载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.xphoenix3.x

官网download页面有

1111111111111111111111

我选用的是phoenix3.1.0版本。

 

二、上传到主节点linux就ok了,解压缩

tar –zxvf phoenix.tar.gz

pwd

/root/phoenix

ll phoenix

201503111800

phoenix目录结构可能会有点不一样,主要是bin目录的位置,可能在hadoop1下,也可能直接在 /root/phoenix下。不要紧,都差很少。

 

三、拷贝一些文件

既然用的hadoop1.x集群,那么咱们使用phoenix目录下,hadoop1目录下的内容。

将hadoop1下,phoenix-core-3.x.jar拷贝到hadoop集群各个节点HBase的lib目录下。

重启一下HBase (在这里能够看出,用phoenix须要重启hbase,因此选择hbase查询工具时,须要考虑一下

四、验证是否安成功

在主节点上,切换到/root/phoenix/hadoop1/bin目录下

输入:

./sqlline.py master:2181

 

201503111803

若是出现这个画面,那就是成功了。若是不成功,多是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

20140905150155281

 

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

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

201503111810

 

按上面的顺序,依次填写。

第一步,Name:随便写个名字,标记链接;

第二步,Example URL:至关于mysql的jdbc链接串,这里的alias写zookeeper的主机名称,端口号,能够写,能够不写,我通常不写;

第三步,选择Phoenix-core的jar包;

第四步,就是手动输入org.apache.phoenix.jdbc.PhoenixDriver。

而后点击OK。

配置链接

201503111812

 

Name:为随便起的名称。

Driver:选中③中添加的phoenix驱动。

URL:写如上内容,jdbc:phoenix:node1,node2,master等这里主要是zookeeper主机名。

User Name:要链接的主机的用户名

Password:要链接的主机的密码

点击Test能够进行测试,或点OK链接。

链接完毕,启动后,就能够看到以下的效果了。这里我已经建立了几个表了,这些表都是存在于HBase上的。

QQ截图20150311191101

 

四、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能够建立表

(1)若hbase中,不存在名为htablename或htablename2HTable:

1

2

3

4

5

6

create htablename(

    pk VARCHAR primary key not null,

    col1 VARCHAR null,

    col2 VARCHAR null,

    col3 VARCHAR null

)

 

1

2

3

4

5

6

7

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就能够了。就这样简单。

不过这个语句怎么写呢?怎样对应呢?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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中,主键以及一些包含汉字的字段,都是方块等乱码了。这个怎么解决???(暂未解决)

 

七、用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工具中,没有相同名称的表存在。

201503111847

 

那么,若是想针对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)。

相关文章
相关标签/搜索