1,下载 hbase 对应的 phoenix 安装包(有严格的版本限制)
2,解压 apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz
3,将 apache-phoenix-5.0.0-HBase-2.0-bin 中的 phoenix-5.0.0-HBase-2.0-server.jar 拷贝到 hbase-2.0.1/lib 中
4,修改 hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://bigdata:9000/hbase</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>bigdata</value>
</property>
<property>
<name>hbase.master.info.port</name>
<value>16010</value>
</property>
<property>
<name>hbase.table.sanity.checks</name>
<value>false</value>
</property>
<!-- phoenix开启映射表 -->
<property>
<name>phoenix.schema.isNamespaceMappingEnabled</name>
<value>true</value>
</property>
<property>
<name>phoenix.schema.mapSystemTablesToNamespace</name>
<value>true</value>
</property>
<!-- zookeeper超时时间 -->
<property>
<name>zookeeper.session.timeout</name>
<value>240000</value>
</property>
<!-- 支持创建二级索引 -->
<property>
<name>hbase.regionserver.wal.codec</name>
<value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>
<!-- phoenix查询时间设置 -->
<property>
<name>phoenix.query.timeoutMs</name>
<value>240000</value>
</property>
<property>
<name>hbase.rpc.timeout</name>
<value>240000</value>
</property>
</configuration>
5,将 core-site.xml 、hbase-site.xml、hdfs-site.xml 拷贝覆盖到 apache-phoenix-5.0.0-HBase-2.0-bin/bin 下
6,验证,在 apache-phoenix-5.0.0-HBase-2.0-bin/bin 下执行:./sqlline.py bigdata:2181
7,DBeaver 连接 phoenix
- 将 hbase-site.xml 通过压缩工具放到 phoenix-5.0.0-HBase-2.0-client.jar 中 ,DBeaver客户端连接用这个驱动包
8,springboot-phoenix5.0-hbase2.0
8.1,错误的引入方式(坑了我1整天。。。)
xml 和 jar
- core-site.xml 、hbase-site.xml、hdfs-site.xml (放到resource目录下)
- phoenix-5.0.0-HBase-2.0-client.jar(驱动包)
public class TestPhoenixJDBC {
private static String driver = "org.apache.phoenix.jdbc.PhoenixDriver";
public static void main(String[] args) throws SQLException {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Statement stmt = null;
ResultSet rs = null;
Connection con = DriverManager.getConnection("jdbc:phoenix:bigdata:2181");
stmt = con.createStatement();
String sql = "select * from test_sql";
rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out.print("id:"+rs.getString("id"));
System.out.println(",name:"+rs.getString("name"));
}
stmt.close();
con.close();
}
}
这种在main方法里可执行查询,但用client包放到springboot项目中会报 phoenix 驱动包不存在、jar冲突等异常,简而言之就是boot起不来呀。。
8.2,正确的引入方式:
核心:phoenix 作为一个数据源去连接hbase
pom.xml
<dependency>
<groupId>org.apache.phoenix</groupId>
<artifactId>phoenix-core</artifactId>
<version>5.0.0-HBase-2.0</version>
</dependency>
application.yml
spring:
datasource:
driver-class-name: org.apache.phoenix.jdbc.PhoenixDriver
url: jdbc:phoenix:bigdata:2181
core-site.xml、hbase-site.xml、hdfs-site.xml 放在 resource 根目录下
将以上配置放入一个springboot项目里即可正常查询
特别感谢!提供的思路:https://blog.youkuaiyun.com/Wing_kin666/article/details/109855358
9,phoenix 操作 hbase 遇到的问题
- 9.0,phoenix 与 hbase 表映射
- 9.1,hbase 的 rowkey 设计:需要考虑热点问题,hbase主要靠rowkey查询
- 9.2,hbae 的 二级索引:通过 phoenix 创建的二级索引,不通过 phoenix 直接插入数据到 hbase时,索引不会同步,开启二级索引后,如果录入口径不是 phoenix,hbase的那部分只能写代码更新索引
- 9.3,hbae 的 二级索引 开启之后的各种异常处理:清空数据最为快捷
清空方式
# cd /xxx/hbase-2.0.1/bin
删除自带zk里边的hbase记录
# ./hbase zkcli rmr /hbase
删除hadoop里边的hbase记录
# hadoop fs -rm -f -r /hbase/
然后重启 hbase
10,参考链接