Phoenix映射HBase数据表

一、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数据表
 

二、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)

参考:phoenix建表映射有命名空间的hbase表

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)规则(会降低查询性能)。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小强签名设计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值