附上hbase-site.xml配置,有的配置我也不知道是和意思,更多的还是参考前辈们的文章。里面有坑
hbase.regionserver.wal.codec
org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec
hbase.region.server.rpc.scheduler.factory.class
org.apache.hadoop.hbase.ipc.PhoenixRpcSchedulerFactory
hbase.rpc.controllerfactory.class
org.apache.hadoop.hbase.ipc.controller.ServerRpcControllerFactory
phoenix.schema.mapSystemTablesToNamespace
true
phoenix.schema.isNamespaceMappingEnabled
true
hbase.rootdir
hdfs://mycluster/hbase
hbase.cluster.distributed
true
hbase.zookeeper.quorum
node02,node03,node04
hbase.zookeeper.property.clientPort
2181
Squirrel连接Phoenix只需要phoenix-x.x.x-HBase-x.x-client.jar一个驱动jar即可,我在虚机上面用的版本如下
hadoop | 2.6.5 |
zookeeper | 3.4.6 |
hbase | 1.3.6 |
phoenix | 4.14.3-HBase-1.3-bin |
各个版本最好保持一致,不一致也要版本近似。
如果连接过程中出现"Inconsistent namespace mapping properties. Cannot initiate connection as SYSTEM:CATALOG is found but client does not have phoenix.schema.isNamespaceMappingEnabled enabled\" 错误,就像报错信息提示的一样,是因为hbase-site.xml配置了命名空间,去掉即可,如下:
phoenix.schema.isNamespaceMappingEnabled
true
然后重启hbase,进入hbase shell,按照下面步骤进行操作,修改hbase中表SYSTEM:CATALOG名为SYSTEM.CATALOG
1)disable 'SYSTEM:CATALOG'
2)snapshot 'SYSTEM:CATALOG', 'cata_tableSnapshot'
3)clone_snapshot 'cata_tableSnapshot', 'SYSTEM.CATALOG'
4)drop 'SYSTEM:CATALOG'
重启phoenix便会连接成功。
但是项目需要HBASE的命名空间,就需要配置Phoenix的Schema与之对应,在hbase.site.xml配置如下:
phoenix.schema.isNamespaceMappingEnabled
true
phoenix.schema.mapSystemTablesToNamespace
true
配置之后,程序需要加到对应的改动,如下:
Properties props = new Properties();
props.setProperty("userName", "");
props.setProperty("password", "");
props.setProperty("phoenix.schema.isNamespaceMappingEnabled", "true");
props.setProperty("phoenix.schema.mapSystemTablesToNamespace", "true");
下面附上连接成功的截图
需要驱动包phoenix-4.14.3-HBase-1.3-client.jar,测试连接的代码如下
public static void testConn() throws Exception {
String driver = "org.apache.phoenix.jdbc.PhoenixDriver";
String url = "jdbc:phoenix:node02,node03,node04:2181";
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, "", "");
String sql = "select 1";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
System.out.println("连接成功");
}
}
在phoenix/bin目录下,通过./sqlline启动客户端操作phoenix,如果启动失败,需要指定zk,即./sqllinie zk:2181,注意点如下:
1、!tables
查看所有表
2、!desc tbl;
查看tbl元数据信息
3、create schema sch1;
Phoenix是区分大小写的,像上面的语句是建立了schema,自动转为大写SCH1,如果需要小写,需要套上双引号,即create schema "sch1"。
创建表时同样区分大小写。
4、客户端操作schemae或者table,需要区分大小写
比如,程序需要获取指定schema和table的字段信息,需要确定schema和table的大小写,不然获取为空