使用 Phoenix-4.11.0连接 Hbase 集群 ,并使用 JDBC 查询测试
什么是 Phoenix ?
Apache Phoenix 是运行在Hbase之上的高性能关系型数据库,通过Phoenix可以像使用jdbc访问关系型数据库一样访问hbase。
Phoenix,操作的表以及数据存储在hbase上。phoenix只需要和hbase进行表关联。然后在用工具进行一些读写操作。
可以把Phoenix 只看成一种代替Hbase语法的工具。虽然Java可以用jdbc来连接phoenix,然后操作hbase,但是在生产环境中,不可以用OLTP中。
phoenix在查询hbase时,虽然做了一些优化,但是延迟还是不小。所以依然用在OLAT中,在将结果返回存储下来。
准备工作
环境
JDK:1.8
Hadoop Release:2.7.4
centos:7.3
node1(master) 主机: 192.168.252.121
node2(salve) 从机: 192.168.252.122
node3(salve) 从机: 192.168.252.123
node4(ZooKeeper) 主机: 192.168.252.124
依赖环境
Hadoop
HBase
安装
下载解压
在 ndoe1 上操作
su hadoop
cd /home/hadoop/
wget https://mirrors.tuna.tsinghua.edu.cn/apache/phoenix/apache-phoenix-4.11.0-HBase-1.3/bin/apache-phoenix-4.11.0-HBase-1.3-bin.tar.gz
tar -zxvf apache-phoenix-4.11.0-HBase-1.3-bin.tar.gz
mv apache-phoenix-4.11.0-HBase-1.3-bin phoenix-4.11.0
配置 Phoenix
复制 JAR
进入 /phoenix-4.11.0
文件目录
cd /home/hadoop/phoenix-4.11.0/
把两个 jar 包 phoenix-4.11.0-HBase-1.3-client.jar
,phoenix-core-4.11.0-HBase-1.3.jar
拷贝至 Hbase
的/lib
文件夹。
cp phoenix-4.11.0-HBase-1.3-client.jar /home/hadoop/hbase-1.3.1/lib/
cp phoenix-core-4.11.0-HBase-1.3.jar /home/hadoop/hbase-1.3.1/lib/
复制 base-site.xml
进入 Hbase conf
配置目录
cd /home/hadoop/hbase-1.3.1/conf/
把 Hbase 的配置文件 base-site.xml
拷贝至 Phoenix
根目录中的 /bin
文件夹下到此就完成了配置。
cp hbase-site.xml /home/hadoop/phoenix-4.11.0/bin
配置集群
复制节点
将 phoenix-4.11.0文件夹重打包后复制到其他子节点
cd /home/hadoop/
tar zcvf phoenix.tar.gz phoenix-4.11.0
scp phoenix.tar.gz hadoop@node2:/home/hadoop/
scp phoenix.tar.gz hadoop@node3:/home/hadoop/
在 node2,node3 节点解压
cd /home/hadoop/
tar -zxvf phoenix.tar.gz
进入 node2,node3 节点 phoenix-4.11.0
文件目录
cd /home/hadoop/phoenix-4.11.0/
把两个 jar 包 phoenix-4.11.0-HBase-1.3-client.jar
,phoenix-core-4.11.0-HBase-1.3.jar
拷贝至 Hbase
的/lib
文件夹。
cp phoenix-4.11.0-HBase-1.3-client.jar /home/hadoop/hbase-1.3.1/lib/
cp phoenix-core-4.11.0-HBase-1.3.jar /home/hadoop/hbase-1.3.1/lib/
启动
cd /home/hadoop/phoenix-4.11.0/bin
./sqlline.py 192.168.252.124:2181
如果看到如下信息,证明,配置没毛病
Setting property: [incremental, false]
Setting property: [isolation, TRANSACTION_READ_COMMITTED]
issuing: !connect jdbc:phoenix:node4:2181 none none org.apache.phoenix.jdbc.PhoenixDriver
Connecting to jdbc:phoenix:node4:2181
17/09/21 13:58:09 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Connected to: Phoenix (version 4.11)
Driver: PhoenixEmbeddedDriver (version 4.11)
Autocommit status: true
Transaction isolation: TRANSACTION_READ_COMMITTED
Building list of tables and columns for tab-completion (set fastconnect to true to skip)...
92/92 (100%) Done
Done
sqlline version 1.2.0
0: jdbc:phoenix:node4:2181>
命令行测试
创建表
create table test (mykey integer not null primary key, mycolumn varchar);
增加,修改表数据
upsert into test values (1,'Hello');
upsert into test values (2,'www.ymq.io');
查询表数据
select * from test;
响应
+--------+-------------+
| MYKEY | MYCOLUMN |
+--------+-------------+
| 1 | Hello |
| 2 | www.ymq.io |
+--------+-------------+
2 rows selected (0.083 seconds)
删除表
drop table test;
JDBC 测试
github-源码:https://github.com/souyunku/ymq-example/tree/master/ymq-example/ymq-apache-phoenix
public static void main(String[] args) throws Throwable {
try {
Class.forName("org.apache.phoenix.jdbc.PhoenixDriver");
//这里配置zookeeper的地址,可单个,多个(用","分隔)可以是域名或者ip
String url = "jdbc:phoenix:node4:2181";
Connection conn = DriverManager.getConnection(url);
Statement statement = conn.createStatement();
long time = System.currentTimeMillis();
ResultSet rs = statement.executeQuery("select * from test");
while (rs.next()) {
String myKey = rs.getString("MYKEY");
String myColumn = rs.getString("MYCOLUMN");
System.out.println("myKey=" + myKey + "myColumn=" + myColumn);
}
long timeUsed = System.currentTimeMillis() - time;
System.out.println("time " + timeUsed + "mm");
// 关闭连接
rs.close();
statement.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
响应
myKey=1myColumn=Hello
myKey=2myColumn=www.ymq.io
time 127mm
如果有报错,请参考,反正我是没报错 http://www.cnblogs.com/huxinga/p/6875929.html
Contact
- 作者:鹏磊
- 出处:http://www.ymq.io
- Email:admin@souyunku.com
- 版权归作者所有,转载请注明出处
- Wechat:关注公众号,搜云库,专注于开发技术的研究与知识分享
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 传智播客OA项目学习--阶段三(Struts中Action书写)
- 九、函数与函数式编程
- 关于Hibernate懒加载----Spring filter
- 十、详解函数柯里化
- Unable to load file:*struts.xml-[unknown location]
- 使用hooks重新定义antd pro想象力(一)
- 传智播客OA项目学习--阶段三(级联操作)
- 七日Python之路--第十一天
- 使用hooks重构antd pro的想象力(三)我是如何利用hooks干掉redux的
- 七日Python之路--第十天
- 初学Vue.js,用 vue ui 创建项目会不会被鄙视
- 十三、jQuery过时的今天,你还会使用它吗
- 0005 Java 包扫描实现和应用(Jar篇)
- python基础 -- acm
- 十四、深入核心,详解事件循环机制