博客已转移,请借一步说话,http://www.weixuehao.com/archives/111

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,       -------这句话直接写就可以了,这样的话,HBase中的RowKey转换成phoenix中的主键,列名就叫 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;
}

OK 搞定了。

Phoenix实现用SQL查询HBase的更多相关文章

  1. Phoenix的安装使用与SQL查询HBase

    一. Phoenix的简介 1. 什么是phoenix 现有hbase的查询工具有很多如:Hive,Tez,Impala,Shark/Spark,Phoenix等.今天主要说Phoenix.phoen ...

  2. Phoenix(sql on hbase)简单介绍

    Phoenix(sql on hbase)简单介绍 介绍: Phoenix is a SQL skin over HBase delivered as a client-embedded JDBC d ...

  3. Phoenix(SQL On HBase)

    1.简介 Phoenix是一个HBase框架,可以通过SQL的方式来操作HBase. Phoenix是构建在HBase上的一个SQL层,是内嵌在HBase中的JDBC驱动,能够让用户使用标准的JDBC ...

  4. Phoenix(SQL On HBase)安装和使用报告

    一.为什么使用Phoenix二.安装Phoenix2.1 兼容问题?2.2 编译CDH版本的Phoenix2.3 安装Phoenix到CDH环境中三.Phoenix的使用3.1 phoenix的4种调 ...

  5. Trafodion:Transactional SQL on HBase

    Trafodion: Transactional SQL on HBase HBase上实时分布式事务处理 介绍 HBase的SQL能力一直不足.Phoenix缺乏Join能力,eBay提出的kyli ...

  6. Phoenix连接安全模式下的HBase集群

    Phoenix连接安全模式下的HBase集群 HBase集群开启安全模式(即启用kerberos认证)之后,用户无论是用HBase shell还是Phoenix去连接HBase都先需要通过kerber ...

  7. SQL常见优化Sql查询性能的方法有哪些?

    常见优化Sql查询性能的方法有哪些? 1.查询条件减少使用函数,避免全表扫描 2.减少不必要的表连接 3.有些数据操作的业务逻辑可以放到应用层进行实现 4.可以使用with as 5.使用“临时表”暂 ...

  8. 记一个简单的sql查询

    在我们做各类统计和各类报表的时候,会有各种各样的查询要求.条件 这篇主要记录一个常见的统计查询 要求如下: 统计一段时间内,每天注册人数,如果某天没有人注册则显示为0 现在建个简单的表来试试 建表语句 ...

  9. Oracle常用SQL查询(2)

    三.查看数据库的SQL 1 .查看表空间的名称及大小 select  t.tablespace_name,  round ( sum (bytes / ( 1024 * 1024 )), 0 ) ts ...

随机推荐

  1. POJ1037A decorative fence(动态规划+排序计数+好题)

    http://poj.org/problem?id=1037 题意:输入木棒的个数n,其中每个木棒长度等于对应的编号,把木棒按照波浪形排序,然后输出第c个; 分析:总数为i跟木棒中第k短的木棒 就等于 ...

  2. shell与变量的声明的操作

    1.给命令起别名:alias 执行下面命令后,可以使用dir代替ls –l 命令,显示目录中的文件详细信息: 还可以用一个别名表示几个命令 的结合: 2.ps:显示当前登录会话的所有活动进程: 3.更 ...

  3. 在ECSHOP后台左侧导航中增加新菜单

    在ECSHOP后台左侧导航中增加新菜单 ECSHOP教程/ ecshop教程网(www.ecshop119.com) 2011-11-08   有个别高级用户(懂PHP的),提到这样的问题: 在后台管 ...

  4. DOM-based xss

    这个漏洞往往存在于客户端脚本,如果一个Javascript脚本访问需要参数的URL,且需要将该信息用于写入自己的页面,且信息未被编码,那么就有可能存在这个漏洞. (一)DOM—based XSS漏洞的 ...

  5. poj2642 The Brick Stops Here(DP基础题)

    比基础的多一点东西的背包问题. 链接:POJ2642 大意:有N种砖,每种花费p[i],含铜量c[i],现需要用M种不同的砖融成含铜量在Cmin到Cmax之间(可等于)的砖,即这M种砖的含铜量平均值在 ...

  6. 微信内置浏览器的 User Agent的判断

    如何判断微信内置浏览器,首先需要获取微信内置浏览器的User Agent,经过在 iPhone 上微信的浏览器的检测,它的 User Agent 是: Mozilla/5.0 (iPhone; CPU ...

  7. 微信也有土豪版 针对iPhone 6/6 Plus进行优化

    土豪们最近都上手iPhone 6/6 Plus了,烦恼的是iPhone 6/Plus增大了屏幕和分辨率,由此带来了不少应用的适配问题,排版乱了,app周边多了一片空白,是不是很煞风景?微信团队昨天放出 ...

  8. BC.36.Gunner(hash)

    Gunner  Accepts: 391  Submissions: 1397  Time Limit: 8000/4000 MS (Java/Others)  Memory Limit: 65536 ...

  9. nginx-upload-module模块实现文件断点续传

    导读 每当我们想简单的实现文件上传功能,而又不使用其他的语言(比如PHP.Java),或者想实现文件的断点续传.这个时候Nginx的一个模块nginx-upload-module就能满足我们的需求. ...

  10. Linux常用热键(持续更新)

    (这些文章都是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) --圣诞节怎么过, --略过. 今天装ubuntu的时候把windows覆盖了, 凌乱,TX童 ...