HBase + Phoenix + SQuirreL SQL Client + JavaAPI
记录一次被运维坑了两天多的故事。。。项目需要开发HBase和Phoenix的插件,需要通过JDBC连接两个库,只要向运维要连接,结果给的连接第一天连不上HBase,第二天JavaAPI可以操作HBase,但是第三方Squirrel却连不上Phoenix,第三天只好自己搭建环境(Hadoop+Zookeeper+HBase+Phoenix),下面说一下具体的坑。一、HBase配置附上hbase-si
一、HBase配置
附上hbase-site.xml配置,有的配置我也不知道是和意思,更多的还是参考前辈们的文章。里面有坑
<configuration>
<property>
<name>hbase.regionserver.wal.codec</name>
<value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>
<property>
<name>hbase.region.server.rpc.scheduler.factory.class</name>
<value>org.apache.hadoop.hbase.ipc.PhoenixRpcSchedulerFactory</value>
</property>
<property>
<name>hbase.rpc.controllerfactory.class</name>
<value>org.apache.hadoop.hbase.ipc.controller.ServerRpcControllerFactory</value>
</property>
<property>
<name>phoenix.schema.mapSystemTablesToNamespace</name>
<value>true</value>
</property>
<!-- 此段配置可能引起连接失败,参考二 -->
<property>
<name>phoenix.schema.isNamespaceMappingEnabled</name>
<value>true</value>
</property>
<!-- 指定hbase在HDFS上存储的路径 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://mycluster/hbase</value>
</property>
<!-- 指定hbase是分布式的 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 指定zk的地址,多个用“,”分割 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>node02,node03,node04</value>
</property>
<!--指定Zookeeper端口号-->
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
</configuration>
二、SQuirreL
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配置了命名空间,去掉即可,如下:
<property>
<name>phoenix.schema.isNamespaceMappingEnabled</name>
<value>true</value>
</property>
然后重启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配置如下:
<property>
<name>phoenix.schema.isNamespaceMappingEnabled</name>
<value>true</value>
</property>
<property>
<name>phoenix.schema.mapSystemTablesToNamespace</name>
<value>true</value>
</property>
配置之后,程序需要加到对应的改动,如下:
Properties props = new Properties();
props.setProperty("userName", "");
props.setProperty("password", "");
props.setProperty("phoenix.schema.isNamespaceMappingEnabled", "true");
props.setProperty("phoenix.schema.mapSystemTablesToNamespace", "true");
下面附上连接成功的截图

三、JDBC连接Phoenix
需要驱动包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("连接成功");
}
}
四、sqlline
在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的大小写,不然获取为空
更多推荐



所有评论(0)