在SQuirrel中使用Phoenix操作HBase——创建表和视图

来源:互联网 发布:西红柿pk10计划软件 编辑:程序博客网 时间:2024/06/05 14:07

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不能干嘛

①不支持事务处理

②不支持复杂的条件

③表之间的关联操作

 

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.xphoenix3.x

官网download页面有

1111111111111111111111

我选用的是phoenix3.1.0版本。

 

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

tar –zxvf phoenix.tar.gz

pwd

/root/phoenix

ll phoenix

201503111800

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

 

201503111803

如果出现这个画面,那就是成功了。如果不成功,可能是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

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

 

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

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)。

 

推荐阅读,系列文章

在SQuirrel中使用Phoenix操作HBase——创建表和视图

在SQuirrel中使用Phoenix操作HBase——基本的sql查询

用SHELL命令来操作phoenix

使用用Phoenix的Java api操作HBase

0 0