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 官网 http://phoenix.apache.org/ 上, 对 Phoenix 讲解已经很屌了. 如果英语好, 可以看官网, 更正式一些.
Phoenix 安装
1, 下载 phoenix http://phoenix.apache.org/download.html .
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 http://www.squirrelsql.org/ , 是一个连接数据库的客户端工具. 一般支持 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 中的语法 http://phoenix.apache.org/language/index.html
Phoenix 中的数据类型 http://phoenix.apache.org/language/datatypes.html
Phoenix 中的方法 http://phoenix.apache.org/language/functions.html
我自己使用过程中一些简单语句, 如下:
- 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 搞定了.
来源: http://www.92to.com/bangong/2018/05-31/33861091.html