前言
部署的各个服务及版本
服务 | 版本 | 说明 |
---|---|---|
Hbase | 2.1.10 | 查询高效的数据库 |
Phonenix | 5.1.2 | SQL方式操作Hbase |
Phoenix分为胖客户端和瘦客户端
- 瘦客户端通过Phoenix Query Server 来解析SQL语言。
- 胖客户端对SQL解析=>Hbase读写原理API=>直接作用于Zookeeper
注意
胖客户端不用启动Phoenix Query Server
代码连接
Thin Client(瘦客户端)
1)启动query server
1 | queryserver.py start |
2)创建项目并导入依赖
1 | <dependency> |
3)编写代码
1 | import java.sql.*; |
添加数据
1 | import java.sql.*; |
Thick Client(胖客户端)
1)在pom中加入依赖
1 | <dependency> |
2)编写代码
1 | import org.apache.phoenix.jdbc.PhoenixDriver; |
Kerberos环境下连接
Kerberos环境下使用胖客户端连接
1 | public static void loginPhoenix(String principal, String keytabPath) throws IOException, ClassNotFoundException, SQLException { |
获取配置
1 | private static Properties getProp() { |
连接的两种方式
1 | PhoenixConnection conn = DriverManager.getConnection(jdbcUrl, getProp()).unwrap(PhoenixConnection.class); |
或者
1 | PhoenixConnection conn = PhoenixDriver.INSTANCE.connect(jdbcUrl, PhoenixSqlUtil.getProp()); |
驱动名
1 | Class.forName(PhoenixDriver.class.getName()); |
或者
1 | Class.forName("org.apache.phoenix.jdbc.PhoenixDriver"); |
DBeaver连接
DBeaver中搜索phoenix
修改DBeaver配置
修改dbeaver.ini
文件,增加如下内容
1 | -vm |
连接配置
连接属性
驱动属性中也添加
属性
1 | phoenix.schema.isNamespaceMappingEnabled |
值
1 | true |
自动下载的Jar版本较老
我们要引用对应版本的Jar
1 | phoenix-client-hbase-2.1-5.1.2.jar |
服务配置
如果报错
CATALOG is found but client does not have phoenix.schema.isNamespaceMappingEnabled enabled
查询
1 | select * from SYSTEM."CATALOG"; |
查看表的 TABLE_SCHEM 发现有些表这个属性为空。 那么如果你没有指定自动映射命名空间,就会报错。
在 hbase 的 conf 目录下 hbase-site.xml
文件加入下面的属性:
1 | <property> |
然后,重启 hbase。
服务器上连接
连接Phoenix Shell
启动 Zookeeper => HDFS => Yarn => HBase 后
1 | sqlline.py hadoop01,hadoop02,hadoop03:2181 |
第一次启动比较慢,请耐心等待。
查询
1 | !tables |
Kerberos环境下连接
需要把服务端生成的密钥文件psvmc.keytab复制过来。
1 | kinit -kt /data/tools/bigdata/kerberos/hdfs.keytab hdfs/hadoop01@HADOOP.COM |
查看认证状态
1 | klist |
再连接
1 | sqlline.py hadoop01,hadoop02,hadoop03:2181 |
第一次启动比较慢,请耐心等待。
查询
1 | !tables |
报错
配置版本报错
java.lang.RuntimeException: hbase-default.xml file seems to be for an older
解决
在hbase-site.xml文件中添加如下内容
跳过版本检查
1 | <property> |
Jar冲突
查找jar
1 | find /data -name "phoenix*.jar" |
1 | find /root/zjhome -name "phoenix*.jar" |
Metrics名称冲突
在Flink中使用胖客户端运行Phoenix的时候会自动启动全局的metrics,并且名称为Phoenix
1 | 2023-08-23 14:51:43,215 INFO org.apache.hadoop.hbase.metrics.MetricRegistries [] - Loaded MetricRegistries class org.apache.hadoop.hbase.metrics.impl.MetricRegistriesImpl |
但是一但Phoenix没释放的时候又执行了任务,就会报错,导致任务无法被提交
Metrics source phoenix already exists!
起初我想的解决办法是禁用指标
1 | props.setProperty(QueryServices.GLOBAL_METRICS_ENABLED, "false"); |
官方是这样写的,但是实际并不生效。
通过排查源码发现GlobalMetricRegistriesAdapter
类中注册了全局的名称
1 | DefaultMetricsSystem.initialize("Phoenix"); |
并且这个类还是单例,我就想我们重新设置这个名称
我们知道只要调用下面的代码就会注册指标
1 | Connection con = DriverManager.getConnection(jdbcUrl, getProp()).unwrap(PhoenixConnection.class); |
所以我想的是在这之前修改
1 | public static Properties getProp() { |
这时运行时虽然打印的时新的指标名称但是实际注册的还是Phoenix
。
因为全局会再次修改这个单例的值。
我们继续看源码发现
1 | synchronized String newSourceName(String name, boolean dupOK) { |
我们只要修改miniClusterMode就行了
1 | DefaultMetricsSystem.setMiniClusterMode(true); |
所以最终的解决办法是
1 | public static Properties getProp() { |