热门标签 | 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);

在这里插入图片描述


推荐阅读
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • 开发笔记:(002)spring容器中bean初始化销毁时执行的方法及其3种实现方式
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了(002)spring容器中bean初始化销毁时执行的方法及其3种实现方式相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文整理了Java中org.apache.pig.backend.executionengine.ExecException.<init>()方法的一些代码 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了Hive常用命令及其用途,包括列出数据表、显示表字段信息、进入数据库、执行select操作、导出数据到csv文件等。同时还涉及了在AndroidManifest.xml中获取meta-data的value值的方法。 ... [详细]
  • 03Spring使用注解方式注入
    基于注解的DI注入1.导包环境搭建:导入aop包(spring-aop-4.1.6.RELEASE.jar)2.创建类3.创建spring.xml配置文件(必须在src目录下)该配 ... [详细]
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社区 版权所有