- 依赖环境说明
- CDH版本为5.10版本(但是Phoenix官网并没有提供与该版本对应的Phoenix)
- CDH中Hbase的版本为Hbase1.2版本
虽然我们集群中的Hbase的版本在官网上有对应的Hbase1.2版本的Phoenix但是该版本经过测试,显示错误为连接不上Hbase,所以我们选择从4.14.0-cdh5.11.2重新编译成4.14.0-cdh5.10.2。
Python版本说明:该编译版本需要在Python2.X版本上运行,如果想查询自己linux主机上的Python版本使用:命令python -v 查看
- Phoenix下载
官网地址为:http://phoenix.apache.org/download.html
- 编译
下载以后需要将该项目解压
打开IDEA然后导入项目,不过这个时候等待的时间有点长,需要下载大量的依赖,依赖加载完成以后,我们找到其中的build.txt文档,然后查看要求,之后通过IDEA中的ctrl+f查找pom.ml中的文档有没有版本说明,将其中的4.14.0-cdh5.11.2改为4.14.0-cdh5.10.2
如果搜索框中颜色为蓝色,则说明该文档中有搜索的内容,找到并修改它,同样的修改操作在整个项目中的每个小项目中都需要修改
并且在Hbase中.idea中不需要修改
继续下面操作,使用Windows中的已经安装好的maven进行打包。(由于公司下载不了官网的maven包只好找百度云下载了一个maven的3.3版本的,因为Phoenix中build.txt文档要求是maven3.x,之后添加环境依赖,但是3.3版本不行,后来换了3.6版本的,并且setting文件不要修改成ali的因为编译的过程中有一个jar包ali的仓库没有。)
找到我们Phoenix源码包下的第一个pom.xml文件之后在如下图中
输入cmd命令进入Windows小黑框,然后输入命令:mvn clean install –DskipTests 进行编译,编译的时间会比较长
但是不要着急,注意每个小项目的完成情况,一共有16个。
编译完成如下图:
编译完成以后需要找出压缩包
- 安装
将编译好的安装包放到CDH的集群中的lib目录下
解压目录
tar -zxvf phoenix-4.14.0-cdh5.10.2.tar.gz
并重命名mv phoenix-4.14.0-cdh5.10.2 phoenix
进入Phoenix如下内容:
拷贝phoenix-4.14.0-cdh5.10.2-server.jar 的包到hbase中的lib中 并且每个regenserver都需要拷贝一份
cp phoenix-4.14.0-cdh5.10.2-server.jar /opt/cloudera/parcels/CDH/lib/hbase/lib/
scp phoenix-4.14.0-cdh5.10.2-server.jar 主机名:/opt/cloudera/parcels/CDH/lib/hbase/lib/
重启hbase集群
重启之后进入Phoenix的bin目录下面执行(centos4,centos5,centos6为服务器主机名)
./sqlline.py centos4,centos5,centos6
执行结果如下:
执行!table命令得到原始表格如下:
安装完成,这时候还需要进行测试性能
- 测试
- 通过命令向Phoenix创建表格,并插入数据:
create table test (id varchar primary key,name varchar,age integer );
由于Phoenix中是区分大小写的所以在创建表格的时候没有用双引号“”所以会自动变成大写。
向Phoenix中插入数据:
upsert into test(id,name,age) values('000001','liubei',43);
结果如下:
这时候我们看Hbase中有没有产生映射
结果是我们刚刚插入的数据
这时候我们已经确定Phoenix已经和Hbase连接上了
- 测试JDBC连接
依赖如下:
<dependency>
<groupId>org.apache.phoenix</groupId>
<artifactId>phoenix-core</artifactId>
<version>4.14.0-cdh5.11.2</version>
</dependency>
测试代码如下:
package ahhx.com.Phoenix;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.Statement;
public class test {
public static void main(String[] args) throws SQLException {
Statement stmt = null;
ResultSet rset = null;
Connection con = DriverManager.getConnection("jdbc:phoenix:192.168.201.85,192.168.201.84,192.168.201.83");
System.out.println("连接成功!");
stmt = con.createStatement();
stmt.executeUpdate("create table test1 (mykey integer not null primary key, mycolumn varchar)");
stmt.executeUpdate("upsert into test1 values (1,'Hello')");
stmt.executeUpdate("upsert into test1 values (2,'World!')");
con.commit();
PreparedStatement statement = con.prepareStatement("select * from test1");
rset = statement.executeQuery();
while (rset.next()) {
System.out.println(rset.getString("mycolumn"));
}
statement.close();
con.close();
}
}
结果如下:
其中可能会出现的问题:
- Caused by: org.apache.hadoop.net.ConnectTimeoutException: 20000 millis timeout while waiting for channel to be ready for connect.
解决方案:
修改主机中的hosts文件,可能是Hbase连接出现的问题。网上也没有说明,但是改了hosts文件就好了
- Inconsistent namespace mapping properties. Cannot initiate connection as SYSTEM:CATALOG is found but client does not have phoenix.schema.isNamespaceMappingEnabled enabled
解决方案:
在java中的JDBC连接的时候,将Phoenix中的Hbase-site.xml配置文件放到resource文件中。
致谢:合肥兰智-数加大数据学院提供技术支持