热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

第6章整合Phoenix

6.1Phoenix简介6.1.1Phoenix定义Phoenix是HBase的开源SQL皮肤。可以使用标准JDBCAPI代替HBase客户端API来创建表,插入
6.1 Phoenix简介

6.1.1 Phoenix定义

Phoenix是HBase的开源SQL皮肤。可以使用标准JDBC API代替HBase客户端API来创建表,插入数据和查询HBase数据。

6.1.2 Phoenix特点

1)容易集成:如Spark,Hive,Pig,Flume和Map Reduce;
2)操作简单:DML命令以及通过DDL命令创建和操作表和版本化增量更改;
3)支持HBase二级索引创建。

6.1.3 Phoenix架构

在这里插入图片描述

6.2 Phoenix快速入门

6.2.1 安装

1.官网地址
http://phoenix.apache.org/
2.Phoenix部署
1)上传并解压tar包
[sancheng@hadoop102 module]$ tar -zxvf apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz -C /opt/module/

[sancheng@hadoop102 module]$ mv apache-phoenix-5.0.0-HBase-2.0-bin phoenix
2)复制server包并拷贝到各个节点的hbase/lib
[sancheng@hadoop102 module]$ cd /opt/module/phoenix/

[sancheng@hadoop102 phoenix]$ cp /opt/module/phoenix/phoenix-5.0.0-HBase-2.0-server.jar /opt/module/hbase/lib/

[sancheng@hadoop102 phoenix]$ xsync /opt/module/hbase/lib/phoenix-5.0.0-HBase-2.0-server.jar
4)配置环境变量
#phoenix
export PHOENIX_HOME=/opt/module/phoenix
export PHOENIX_CLASSPATH=PHOENIXHOMEexportPATH=PHOENIX_HOME export PATH=PHOENIXHOMEexportPATH=PATH:PHOENIXHOME/bin5)重启HBase[shancheng@hadoop102]PHOENIX_HOME/bin 5)重启HBase [shancheng@hadoop102 ~]PHOENIXHOME/bin5)重启HBase[shancheng@hadoop102 ] stop-hbase.sh
[shancheng@hadoop102 ~]$ start-hbase.sh
6) 连接Phoenix
[shancheng@hadoop101 phoenix]$ /opt/module/phoenix/bin/sqlline.py hadoop102,hadoop103,hadoop104:2181
6.2.2 Phoenix Shell操作

  1. schema的操作
    1)创建schema
    默认情况下,在phoenix中不能直接创建schema。需要将如下的参数添加到Hbase中conf目录下的hbase-site.xml 和 phoenix中bin目录下的 hbase-site.xml中

    phoenix.schema.isNamespaceMappingEnabled
    true

    重新启动Hbase和连接phoenix客户端.
    [shancheng@hadoop102 ~]$ stop-hbase.sh
    [shancheng@hadoop102 ~]$ start-hbase.sh
    [shancheng@hadoop102 ~]$ /opt/module/phoenix/bin/sqlline.py hadoop102,hadoop103,hadoop104:2181
    创建schema
    create schema bigdata;
    注意:在phoenix中,schema名,表名,字段名等会自动转换为大写,若要小写,使用双引号,如"student"。
    2.表的操作
    1)显示所有表
    !table 或 !tables
    2)创建表
    直接指定单个列作为RowKey

CREATE TABLE IF NOT EXISTS student(
id VARCHAR primary key,
name VARCHAR,
addr VARCHAR);

指定多个列的联合作为RowKey

CREATE TABLE IF NOT EXISTS us_population (
State CHAR(2) NOT NULL,
City VARCHAR NOT NULL,
Population BIGINT
CONSTRAINT my_pk PRIMARY KEY (state, city));
3)插入数据
upsert into student values(‘1001’,‘zhangsan’,‘beijing’);
4)查询记录
select * from student;
select * from student where id=‘1001’;
5)删除记录
delete from student where id=‘1001’;
6)删除表
drop table student;
7)退出命令行
!quit
3.表的映射
1)表的关系
默认情况下,直接在HBase中创建的表,通过Phoenix是查看不到的。如果要在Phoenix中操作直接在HBase中创建的表,则需要在Phoenix中进行表的映射。映射方式有两种:视图映射和表映射。
2)命令行中创建表test
HBase 中test的表结构如下,两个列族info1、info2。
Rowkey info1 info2
id name address
启动HBase Shell
[atguigu@hadoop102 ~]$ /opt/module/hbase/bin/hbase shell
创建HBase表test
hbase(main):001:0> create ‘test’,‘info1’,‘info2’
3)视图映射
Phoenix创建的视图是只读的,所以只能用来做查询,无法通过视图对源数据进行修改等操作。在phoenix中创建关联test表的视图
0: jdbc:phoenix:hadoop101,hadoop102,hadoop103> create view “test”(id varchar primary key,“info1”.“name” varchar, “info2”.“address” varchar);
删除视图
0: jdbc:phoenix:hadoop101,hadoop102,hadoop103> drop view “test”;
4)表映射
使用Apache Phoenix创建对HBase的表映射,有两种方法:
(1)HBase中不存在表时,可以直接使用create table指令创建需要的表,系统将会自动在Phoenix和HBase中创建person_infomation的表,并会根据指令内的参数对表结构进行初始化。
(2)当HBase中已经存在表时,可以以类似创建视图的方式创建关联表,只需要将create view改为create table即可。
0: jdbc:phoenix:hadoop101,hadoop102,hadoop103> create table “test”(id varchar primary key,“info1”.“name” varchar, “info2”.“address” varchar) column_encoded_bytes=0;

4.表映射中数值类型的问题
Hbase中存储数值类型的值(如int,long等)会按照正常数字的补码进行存储. 而phoenix对数字的存储做了特殊的处理. phoenix 为了解决遇到正负数同时存在时&#xff0c;导致负数排到了正数的后面&#xff08;负数高位为1&#xff0c;正数高位为0&#xff0c;字典序0 <1&#xff09;的问题。 phoenix在存储数字时会对高位进行转换.原来为1,转换为0&#xff0c; 原来为0&#xff0c;转换为1.
因此&#xff0c;如果hbase表中的数据的写是由phoenix写入的,不会出现问题&#xff0c;因为对数字的编解码都是phoenix来负责。如果hbase表中的数据不是由phoenix写入的&#xff0c;数字的编码由hbase负责. 而phoenix读数据时要对数字进行解码。 因为编解码方式不一致。导致数字出错.

1&#xff09;在hbase中创建表&#xff0c;并插入数值类型的数据
hbase(main):001:0> create ‘person’,‘info’
hbase(main):001:0> put ‘person’,‘1001’, ‘info:salary’,Bytes.toBytes(123456)
注意: 如果要插入数字类型&#xff0c;需要通过Bytes.toBytes(123456)来实现。
2&#xff09;在phoenix中创建映射表并查询数据
create table “person”(id varchar primary key,“info”.“salary” integer )
column_encoded_bytes&#61;0;

select * from “person”

会发现数字显示有问题

3&#xff09;解决办法:
在phoenix中创建表时使用无符号的数值类型. unsigned_long
create table “person”(id varchar primary key,“info”.“salary” unsigned_long )
column_encoded_bytes&#61;0;

6.2.3 Phoenix JDBC操作
1.Thin Client
1&#xff09;启动query server
[shancheng&#64;hadoop102 ~]$ queryserver.py start
2&#xff09;创建项目并导入依赖


org.apache.phoenix
phoenix-queryserver-client
5.0.0-HBase-2.0


3&#xff09;编写代码
package com.atguigu;

import java.sql.*;
import org.apache.phoenix.queryserver.client.ThinClientUtil;

public class PhoenixTest {
public static void main(String[] args) throws SQLException {

String connectionUrl &#61; ThinClientUtil.getConnectionUrl("hadoop102", 8765);Connection connection &#61; DriverManager.getConnection(connectionUrl);PreparedStatement preparedStatement &#61; connection.prepareStatement("select * from student");ResultSet resultSet &#61; preparedStatement.executeQuery();while (resultSet.next()) {System.out.println(resultSet.getString(1) &#43; "\t" &#43; resultSet.getString(2));}//关闭connection.close();

}
}
2.Thick Client
1&#xff09;在pom中加入依赖


org.apache.phoenix
phoenix-core
5.0.0-HBase-2.0


org.glassfish
javax.el


org.glassfishjavax.el3.0.1-b06

2&#xff09;编写代码
package com.atguigu.phoenix.thin;

import java.sql.*;
import java.util.Properties;

public class TestThick {

public static void main(String[] args) throws SQLException {String url &#61; "jdbc:phoenix:hadoop102,hadoop103,hadoop104:2181";Properties props &#61; new Properties();props.put("phoenix.schema.isNamespaceMappingEnabled","true");Connection connection &#61; DriverManager.getConnection(url,props);PreparedStatement ps &#61; connection.prepareStatement("select * from \"test\"");ResultSet rs &#61; ps.executeQuery();while(rs.next()){System.out.println(rs.getString(1)&#43;":" &#43;rs.getString(2));}
}

}

6.3 Phoenix二级索引

6.3.1 二级索引配置文件

1.添加如下配置到HBase的HRegionserver节点的hbase-site.xml


hbase.regionserver.wal.codec
org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec

hbase.region.server.rpc.scheduler.factory.classorg.apache.hadoop.hbase.ipc.PhoenixRpcSchedulerFactoryFactory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates
hbase.rpc.controllerfactory.classorg.apache.hadoop.hbase.ipc.controller.ServerRpcControllerFactoryFactory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates


6.3.2 全局二级索引

Global Index是默认的索引格式&#xff0c;创建全局索引时&#xff0c;会在HBase中建立一张新表。也就是说索引数据和数据表是存放在不同的表中的&#xff0c;因此全局索引适用于多读少写的业务场景。
写数据的时候会消耗大量开销&#xff0c;因为索引表也要更新&#xff0c;而索引表是分布在不同的数据节点上的&#xff0c;跨节点的数据传输带来了较大的性能消耗。
在读数据的时候Phoenix会选择索引表来降低查询消耗的时间。
1.创建单个字段的全局索引
CREATE INDEX my_index ON my_table (my_col);

在这里插入图片描述
在这里插入图片描述
2.创建携带其他字段的全局索引
CREATE INDEX my_index ON my_table (v1) INCLUDE (v2);
在这里插入图片描述
6.3.3 本地二级索引
Local Index适用于写操作频繁的场景。
索引数据和数据表的数据是存放在同一张表中&#xff08;且是同一个Region&#xff09;&#xff0c;避免了在写操作的时候往不同服务器的索引表中写索引带来的额外开销。
CREATE LOCAL INDEX my_index ON my_table (my_column);

在这里插入图片描述


推荐阅读
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 使用ArcGIS for Java和Flex浏览自定义ArcGIS Server 9.3地图
    本文介绍了如何在Flex应用程序中实现浏览自定义ArcGIS Server 9.3发布的地图。这是一个基本的入门示例,适用于初学者。 ... [详细]
  • com.sun.javadoc.PackageDoc.exceptions()方法的使用及代码示例 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 基于iSCSI的SQL Server 2012群集测试(一)SQL群集安装
    一、测试需求介绍与准备公司计划服务器迁移过程计划同时上线SQLServer2012,引入SQLServer2012群集提高高可用性,需要对SQLServ ... [详细]
  • 本文详细介绍了在 Ubuntu 系统上搭建 Hadoop 集群时遇到的 SSH 密钥认证问题及其解决方案。通过本文,读者可以了解如何在多台虚拟机之间实现无密码 SSH 登录,从而顺利启动 Hadoop 集群。 ... [详细]
  • Spark与HBase结合处理大规模流量数据结构设计
    本文将详细介绍如何利用Spark和HBase进行大规模流量数据的分析与处理,包括数据结构的设计和优化方法。 ... [详细]
  • 思科IOS XE与ISE集成实现TACACS认证配置
    本文详细介绍了如何在思科IOS XE设备上配置TACACS认证,并通过ISE(Identity Services Engine)进行用户管理和授权。配置包括网络拓扑、设备设置和ISE端的具体步骤。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 【实例简介】本文详细介绍了如何在PHP中实现微信支付的退款功能,并提供了订单创建类的完整代码及调用示例。在配置过程中,需确保正确设置相关参数,特别是证书路径应根据项目实际情况进行调整。为了保证系统的安全性,存放证书的目录需要设置为可读权限。值得注意的是,普通支付操作无需证书,但在执行退款操作时必须提供证书。此外,本文还对常见的错误处理和调试技巧进行了说明,帮助开发者快速定位和解决问题。 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
  • 本文详细介绍了批处理技术的基本概念及其在实际应用中的重要性。首先,对简单的批处理内部命令进行了概述,重点讲解了Echo命令的功能,包括如何打开或关闭回显功能以及显示消息。如果没有指定任何参数,Echo命令会显示当前的回显设置。此外,文章还探讨了批处理技术在自动化任务执行、系统管理等领域的广泛应用,为读者提供了丰富的实践案例和技术指导。 ... [详细]
  • 在Ubuntu上安装MySQL时解决缺少libaio.so.1错误及libaio在MySQL中的重要性分析
    在Ubuntu系统上安装MySQL时,遇到了缺少libaio.so.1的错误。本文详细介绍了如何解决这一问题,并深入探讨了libaio库在MySQL性能优化中的重要作用。对于初学者而言,理解这些依赖关系和配置步骤是成功安装和运行MySQL的关键。通过本文的指导,读者可以顺利解决相关问题,并更好地掌握MySQL在Linux环境下的部署与管理。 ... [详细]
author-avatar
禁令2502861143
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有