文章目录
一、Phoenix映射HBase数据表
1.说明:
安装好phoenix后对于Hbase中已经存在的数据表不会自动进行映射,所以想要再phoenix中操作HBase已有数据表就需要手动进行配置。
2.创建HBase表:
hbase(main):002:0> create 'phoenix','info'
3.插入数据:
hbase(main):004:0> put 'phoenix', 'row001','info:name','phoenix'
hbase(main):005:0> put 'phoenix', 'row002','info:name','hbase'
4.创建Phoenix表:
预警高能:这里一定要注意的是表名和列族以及列名需要用双引号括起来,因为HBase是区分大小写的,如果不用双引号括起来的话Phoenix在创建表的时候会自动将小写转换为大写字母,这样HBase中会创建另外一张表PHOENIX。
0: jdbc:phoenix:h40,h41,h42:2181> create table "phoenix"("ROW" varchar primary key, "info"."name" varchar);
注:可以没有第2、3步,直接在 Phoenix 中创建表并插入数据:
UPSERT INTO "phoenix"("ROW", "name") values ('row003', 'spark');
5.验证:
0: jdbc:phoenix:h40,h41,h42:2181> select * from "phoenix";
+------------------------------------------+------------------------------------------+
| ROW | name |
+------------------------------------------+------------------------------------------+
| row001 | phoenix |
| row002 | hbase |
+------------------------------------------+------------------------------------------+
二、phoenix建表映射有命名空间的hbase表
1.先开启schema与namespace的对应关系:
在phoenix中与hbase的命名空间相对应的是schema概念,默认是没有开启的,需要在hbase的hbase-site.xml中增加以下配置项:
<property>
<name>phoenix.schema.isNamespaceMappingEnabled</name>
<value>true</value>
</property>
<property>
<name>phoenix.schema.mapSystemTablesToNamespace</name>
<value>true</value>
</property
如果你是用apache原生框架搭的集群,只能去每台集群的hbase目录下手动修改了,要是搭建的cdh集群,则可以在cloudera manager界面去修改,一般我会把hbase的服务端和客户端都改一下:
注意:在实际工作中,上图的客户端配置后如果代码中连接 Phoenix 的也需要配置,要不然会报错:java.sql.SQLException: ERROR 726 (43M10): Inconsistent namespace mapping properties. Cannot initiate connection as SYSTEM:CATALOG is found but client does not have phoenix.schema.isNamespaceMappingEnabled enabled
解决方法:(1)代码中把 hbase-site.xml
文件拖到 resources 中;(2)上图中的服务端和客户端那两个配置参数都删掉;(目前实际工作中的状态)(3)代码中添加这两个参数;
Properties pros = new Properties();
pros.setProperty("phoenix.schema.isNamespaceMappingEnabled", "true");
pros.setProperty("phoenix.schema.mapSystemTablesToNamespace", "true");
// 创建连接池
druidDataSource = new DruidDataSource();
druidDataSource.setConnectProperties(pros);
参考:
Inconsistent namespace mapping properties. Cannot initiate connection as SYSTEM:CATALOG is found but
Inconsistent namespace mapping properties.
解决phoenix胖客户端中的异常:client does not have phoenix.schema.isNamespaceMappingEnabled
如果是hdp集群,则可以在Ambari中修改(服务端无法修改,只能在客户端添加):
2.hbase中建有命名空间的表:
3.phoenix映射操作:
首先创建与命名空间对应的schema,如果不创建的话,会报错Schema does not exist schemaName=test_schema1 (state=43M05,code=722)
0: jdbc:phoenix:192.168.1.10:2181> CREATE SCHEMA IF NOT EXISTS "test_schema1";
No rows affected (0.02 seconds)
# 映射视图view。视图只是供查询操作,不能修改数据,当删除视图的时候,对hbase中的源表不会有影响
create VIEW "test_schema1"."t1"(
"ROW" varchar primary key,
"F"."a" varchar,
"F"."b" varchar
);
# 映射表table,表可以查询及修改数据,当删除表的时候,hbase中的源数据表也会被删除(view无法upsert ,table可以upsert)
create table "test_schema1"."t1"(
"ROW" varchar primary key,
"F"."a" varchar,
"F"."b" varchar
) column_encoded_bytes=0; // 禁用列映射
0: jdbc:phoenix:192.168.1.10:2181> select * from "test_schema1"."t1";
+------------------+------+-----------+
| ROW | a | b |
+------------------+------+-----------+
| -103829163_116 | 116 | name116 |
| -1406838352_113 | 113 | name5 |
| -1511909649_130 | 130 | name130 |
+------------------+------+-----------+
3 rows selected (0.061 seconds)
4.不禁用列映射会查询不到数据:
参考:phoenix查不到数据_Phoenix 映射已存在 HBase 表,查询不到数据
问题描述:phoenix 映射已存在的 hbase 表映射正常,但是使用 phoenix 查询时,一直查询不到数据。
0: jdbc:phoenix:192.168.1.10:2181> select count(*) from "test_schema1"."t1";
+-----------+
| COUNT(1) |
+-----------+
| 3 |
+-----------+
1 row selected (0.265 seconds)
0: jdbc:phoenix:192.168.1.10:2181> select * from "test_schema1"."t1";
+------+----+----+
| ROW | a | b |
+------+----+----+
+------+----+----+
No rows selected (0.056 seconds)
问题原因:经过阅读官方文档发现,phoenix 4.10 版本后,对列映射做了优化,采用一套新的机制,不在基于列名方式映射到 hbase。
解决办法:如果只做查询,强烈建议使用 phoenix 视图方式映射,删除视图不影响 hbase 源数据;必须要表映射,需要禁用列映射(column_encoded_bytes=0
)规则(会降低查询性能)。