首页 > 其他分享 >【大数据学习 | HBASE高级】hbase-phoenix 与二次索引应用

【大数据学习 | HBASE高级】hbase-phoenix 与二次索引应用

时间:2024-11-14 22:14:45浏览次数:3  
标签:hainiu varchar phoenix -- into hbase HBASE upsert

1. hbase-phoenix的应用

1.1 概述:

上面我们学会了hbase的操作和原理,以及外部集成的mr的计算方式,但是我们在使用hbase的时候,有的时候我们要直接操作hbase做部分数据的查询和插入,这种原生的方式操作在工作过程中还是比较常见的,以上这些方式需要使用外部的框架进行协助处理,其实hbase也对外提供了一个直接的操作方式接口插件Phoenix,它和mr不一样,是直接集成在hbase之中的,通过一个工具使得hbase可以完全支持sql操作,其实我们可以将Phoenix当成是一个sql插件,一个可以写sql完成hbase操作的插件,并且在hbase中通过regionserver直接执行,还可以做sql的优化,是hbase免费开源出来的一个插件。

 安装过程及配置环境变量过程略。

1.2 创建测试表

在phoenix中创建测试表,必须指定主键,主键对应hbase的rowkey(唯一且非空)

-- 表名不带双引号,默认转成大写
create table phtest1(
    pk varchar not null primary key,
    col1 varchar,
    col2 varchar,
    col3 varchar
);
-- 表名带双引号,不转大写
create table "phtest2"(
    pk varchar not null primary key,
    col1 varchar,
    col2 varchar,
    col3 varchar
);

-- 查看表列表
!tables

-- 查看表结构
!describe PHTEST1;

在hbase shell中查询(phoenix严格区分大小写,所有小写在phoenix中都会被翻译为大写)。

规则就是:如果表名没用双引号括起来,小写全会被翻译为大写;如果表用双引号括起来了,那么小写的话就用小写,大写就用大写。

1.3 插入/查询数据

0: jdbc:phoenix:hadoop106,hadoop107:2181> upsert into PHTEST1 values('x0001','1','2','3'
. . . . . . . . . . . . . . . . . . . .)> );
1 row affected (0.299 seconds)
0: jdbc:phoenix:hadoop106,hadoop107:2181> upsert into PHTEST1 values ('x0001','1','22','3');
1 row affected (0.024 seconds)
0: jdbc:phoenix:hadoop106,hadoop107:2181> upsert into PHTEST1 values ('x0002','1','2','3');
1 row affected (0.02 seconds)
0: jdbc:phoenix:hadoop106,hadoop107:2181> select * from PHTEST1;
+-------+------+------+------+
|  PK   | COL1 | COL2 | COL3 |
+-------+------+------+------+
| x0001 | 1    | 22   | 3    |
| x0002 | 1    | 2    | 3    |
+-------+------+------+------+
2 rows selected (0.103 seconds)

在hbase shell中查询:

1.4 测试删除

插入多行,删除其中某一行

-- 插入多行,一次只能插入一行,不能插入多行
upsert into PHTEST1 values ('x0002','2','3','4');
upsert into PHTEST1 values ('x0003','3','4','5');
upsert into PHTEST1 values ('x0004','4','5','6');
-- 查询验证
select * from PHTEST1;
-- 删除一行
delete from PHTEST1 where col1='2';
-- 查询验证
select * from PHTEST1;

1.5 查询导入

-- 使用select查询结果集批量更新表
-- 创建一张临时表PHTEST2
create table PHTEST2(
    pk varchar not null primary key,
    col1 varchar, 
    col2 varchar,
    col3 varchar
);
-- 临时表插入数据,比phtest1表多了'x0005'、'x0006'和'x0002'三行,其中'x0003'、'x0004'与phtest1的一致
upsert into PHTEST2 values ('x0001','newvalue','newvalue','newvalue');
upsert into PHTEST2 values ('x0002','newvalue','newvalue','newvalue');
upsert into PHTEST2 values ('x0003','3','4','5');
upsert into PHTEST2 values ('x0004','4','5','6');
upsert into PHTEST2 values ('x0005','newvalue','newvalue','newvalue');
upsert into PHTEST2 values ('x0006','newvalue','newvalue','newvalue');

-- 执行批量更新, 将PHTEST2表的数据覆盖到PHTEST1表
upsert into PHTEST1 select * from PHTEST2;

1.6  删除表

drop table PHTEST2;

1.7 数据导入

使用官方提供的数据样例,phoenix数据导入只支持csv文件格式。

# 在客户端外
# 执行SQL文件
# 对标hive的-f test.sql ${hiveconf:batch_date}
# 创建sql文件 select * from PHTEST1
sqlline.py nn1:2181 /root/sql

# 创建表
create table user(id varchar primary key,name varchar,age varchar);
# 创建csv文件 /root/user.csv
# 输入文件内容
# 1,zhangsan,20
# 2,lisi,30
 psql.py -t USER nn1:2181 /root/user.csv
# 注意:
#   1)phoenix数据导入只支持后缀为.csv的文件, csv文件名称不需要和表名称一致,文件名可以小写
#   2)指定的表必须是大写,小写就报错

1.8 在phoenix建表时指定列族

-- 用 列族名.字段名
create table "cftest" (
    pk varchar not null primary key,
    cf1.col1 varchar,
    cf2.col2 varchar);

-- 查询时可以不用列族
select col1 from "cftest"

注:如果建表时这些列未指定列族,则会分配一个叫'0'的列族。

1.9 在phoenix建表时指定压缩格式

-- 在后面可指定压缩格式
create table "comptest" (
    pk varchar not null primary key,
    cf1.col1 varchar,
    cf2.col2 varchar) 
    compression='snappy';

1.10 在phoenix建表时预分region

-- 用 split on ('x0001','x0002','x0003','x0004','x0005') 来进行预分region
-- 其中 on 里面的 是 splitkey
create table "split_region_test" (
    pk varchar not null primary key,
    cf1.col1 varchar,
    cf2.col2 varchar) 
    compression='snappy' 
    split on ('x0001','x0002','x0003','x0004','x0005');

1. 11 phoenix与hbase表关联

1)在hbase中创建带有命名空间的表,并添加数据

create 'hainiu:relatetable_1',{NAME => 'cf1',COMPRESSION => 'snappy'},{NAME => 'cf2',COMPRESSION => 'snappy'}

# 添加数据
put 'hainiu:relatetable_1','x0001','cf1:name','user1'
put 'hainiu:relatetable_1','x0002','cf1:name','user2'
put 'hainiu:relatetable_1','x0001','cf1:age','20'
put 'hainiu:relatetable_1','x0002','cf1:age','21'
put 'hainiu:relatetable_1','x0001','cf2:address','beijing'
put 'hainiu:relatetable_1','x0002','cf2:address','shanghai'

2)在phoenix中创建schema(schema相当于命名空间)

-- 先在phoenix中创建schema,对应hbase的namespace
create schema if not exists "hainiu";

执行报错:

cannot create scheme because config phoenix.scheme.isNamespaceMappingEnabled for enabling name space mapping isn`t enabled.schemaName='hainiu'

在phoenix中创建schema报错解决方式:在hbase的hbase-site.xml中添加phoenix.schema.isNamespaceMappingEnabled=true和phoenix.schema.mapSystemTablesToNamespace=true

在hbase和Phoenix的配置文件hbase-site.xml中都要增加这个配置

增加以上配置

重启hbase集群

stop-hbase.sh

start-hbase.sh

重新进入Phoenix 客户端

-- 退出客户端
!q
-- 进入客户端
sqlline.py nn1:2181

-- 先在phoenix中创建schema,对应hbase的namespace
create schema if not exists "hainiu";

3)创建带有命名空间的表

-- 在phoenix创建'hainiu:relatetable'的关联表
-- 其中: column_encoded_bytes=0 是把字段名转成字符串,而不是原来的byte数组
create table "hainiu"."relatetable_2"(
    id varchar not null primary key,
    "cf1"."name" varchar,
    "cf1"."age" varchar,
    "cf2"."address" varchar
) column_encoded_bytes=0;

-- 在phoenix中插入一条数据测试
upsert into "hainiu"."relatetable_2" (id,"cf1"."name","cf1"."age","cf2"."address") values ('x0003','user3','22','guangzhou');

select * from "hainiu"."relatetable_2";
select "name" from "hainiu"."relatetable_2";
select "cf1"."name" from "hainiu"."relatetable_2";

-- 没有给进行BYTES.tostring
create table "hainiu"."relatetable_3"(
    id varchar not null primary key,
    "cf1"."name" varchar,
    "cf1"."age" varchar,
    "cf2"."address" varchar
);
upsert into "hainiu"."relatetable_3" (id,"cf1"."name","cf1"."age","cf2"."address") values ('x0003','user3','22','guangzhou');

建表语句中带有 column_encoded_bytes=0, 从hbase查询,字段名能看得懂,否则看不懂。

1. 12 phoenix建表时指定组合rowkey

-- 通过 CONSTRAINT pk primary key ( prefix,id )  设定联合主键,作为rowkey
-- 当prefix和id作为联合主键, 只在hbase的rowkey中存在, column里没有
-- 建表语句
create table "hainiu"."combinationkey_table1" (
    prefix varchar not null,
    id varchar not null,
    col1 varchar,
    col2 varchar
    CONSTRAINT pk primary key ( prefix,id ) 
) 
    column_encoded_bytes=0, 
    compression='snappy'  
    split on ('1','2','|');

-- 插入数据
upsert into "hainiu"."combinationkey_table1" (prefix,id,col1,col2) values ('1','001','user1','20');
upsert into "hainiu"."combinationkey_table1" (prefix,id,col1,col2) values ('1','002','user2','21');

-- 查看表结构
!describe "hainiu"."combinationkey_table"

1. 13 phoenix实现动态列

-- 创建表
create table "hainiu"."dynamic_table1"(
    pk varchar not null primary key,
    col1 varchar,
    col2 varchar
)column_encoded_bytes=0;

-- 插入数据
upsert into "hainiu"."dynamic_table1"  (pk,col1,col2) values ('x0001','user1','20');
upsert into "hainiu"."dynamic_table1"  (pk,col1,col2) values ('x0002','user1','21');
upsert into "hainiu"."dynamic_table1"  (pk,col1,col2) values ('x0003','user1','22');
upsert into "hainiu"."dynamic_table1"  (pk,col1,col2) values ('x0004','user1','23');

-- 动态插入列
-- 动态插入 col3 和 col4 列
upsert into "hainiu"."dynamic_table1" (pk,col1,col2,col3 varchar,col4 varchar) values ('x0005','user1','23','beijing','hainiu');
-- 动态插入 col4 和 col5 列
upsert into "hainiu"."dynamic_table1" (pk,col1,col2,col4 varchar,col5 varchar) values ('x0006','user2','32','huawei','30K');

-- 动态插入 col3、col4、col5 列
upsert into "hainiu"."dynamic_table1" (pk,col1,col2,col3 varchar,col4 varchar,col5 varchar) values ('x0007','user3','33','shanghai','ali','22K');
-- 动态插入 col3、col4、col5、col6 列 
upsert into "hainiu"."dynamic_table1" (pk,col1,col2,col3 varchar,col4 varchar,col5 varchar,col6 varchar) values ('x0008','user4','35','shanghai','baidu','12K','false');

-- phoenix中查询动态列
select * from "hainiu"."dynamic_table1"(col3 varchar,col4 varchar);
select * from "hainiu"."dynamic_table1"(col3 varchar,col4 varchar,col5 varchar) ;
select * from "hainiu"."dynamic_table1"(col3 varchar,col4 varchar,col5 varchar,col6 varchar) ;

2. 索引

2.1 开启索引

配置hbase的hbase-site.xml

<property>
    <name>hbase.regionserver.wal.codec</name>
    <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>
#分发到不同的机器

#重启hbase集群
stop-hbase.sh
start-hbase.sh
# 删除Phoenix中的配置文件
hbase-site.xml 
# 将hbase的配置文件给Phoenix
数据准备
-- 创建测试表
create table "hainiu"."testindex"(
    pk varchar not null primary key,
    col1 varchar
)column_encoded_bytes=0;

-- 插入数据
upsert into "hainiu"."testindex" values ('x1','1');
……
upsert into "hainiu"."testindex" values ('x20000','20000');
-- 编写脚本,生成SQL文件
[root@worker-1 hdfs_test]# vim s1.sh 
#! /bin/bash

for((i=1;i<=20000;i++))
do
        echo "upsert into \"hainiu\".\"testindex\" values ('x${i}','${i}');" >> testindex.sql
done

-- 执行SQL文件导入表
sqlline.py nn1:2181 testindex.sql
索引开启前查询
-- 查看执行计划,发现全表扫描
explain select * from "hainiu"."testindex1" where COL1 = '200';
-- 查询
select * from "hainiu"."testindex1" where COL1 = '200';

通过执行计划可以发现,查询为FULL SCAN。全表扫描。

索引操作
-- 基于 COL1字段 创建索引, 当创建完后,索引里存的是已经排序好的COL1数据
-- local index 适用于写操作频繁的场景。索引数据和数据表的数据是存放在相同的服务器中的,避免了在写操作的时候往不同服务器的索引表中写索引带来的额外开销
create local index myindex1 on "hainiu"."testindex" (COL1);

-- 查看执行计划,发现不全表扫描
explain select * from "hainiu"."testindex" where COL1 = '200';
select * from "hainiu"."testindex" where COL1 = '200';

-- 删除索引
drop index myindex on "hainiu"."testindex";

标签:hainiu,varchar,phoenix,--,into,hbase,HBASE,upsert
From: https://blog.csdn.net/2301_80912559/article/details/143755207

相关文章

  • HBase基础知识分享(二)
    HBase的Split机制Region的分裂策略HBase中的Region存储的是一张表的数据。当Region中的数据条数过多时,会直接影响查询效率,过大的Region会被拆分为两个Region,HMaster会将这些分裂的Region分配到不同的RegionServer上,最终达到负载均衡的目的,这是HBase的一个优点。常见的Region分......
  • HBase基础知识分享(一)
    写在前面今天来学习Hbase部分的知识!Zookeeper的ZAB协议ZAB(ZookeeperAtomicBroadcast)协议是Zookeeper的核心协议之一,用于保证集群中数据的一致性、顺序性和容错性。它包括以下几个关键阶段:Leader选举:选举出一个Leader节点来协调集群内的操作。事务提案:客户端提交的事务会......
  • Hbase讲解与安装与配置部署
    目录1.讲解一、HBase的起源与背景二、HBase的特点三、HBase的架构四、HBase的数据模型五、HBase的访问接口六、HBase的使用场景2.安装3.配置部署1.讲解HBase是一个分布式的、面向列的开源数据库,它是ApacheHadoop项目的子项目。以下是对HBase的详细讲解:一、H......
  • 存储数据库的传输效率提升-ETLCloud结合HBASE
    一、大数据存储数据库--HBASEHBase,作为一个开源的分布式列存储数据库,基于Google的Bigtable设计而成,专为处理大规模结构化数据而优化。使用HBase打造大数据解决方案的好处主要包括:高可扩展性,能够处理PB级的数据;实时读取和写入能力,适合实时数据分析;灵活的模式设计,支持动态列的添加,......
  • 【大数据技术基础 | 实验七】HBase实验:部署HBase
    文章目录一、实验目的二、实验要求三、实验原理四、实验环境五、实验内容和步骤(一)验证Hadoop和ZooKeeper已启动(二)修改HBase配置文件(三)启动并验证HBase六、实验结果七、实验心得一、实验目的掌握HBase基础简介及体系架构;掌握HBase集群安装部署及HBaseShell的一些......
  • 016_HBase
    1HBase分布式介绍分布式用户​ 使用负载均衡,把请求分发给不同的服务器。​ redis16384​负载均衡器​​ session共享​ 向session放入数据​ SESSION共享内存。checkServer-redis​ RPC协议=》RMI》EJB=》Spring框架分布式系统​ 将服务器拆分。​ 多台电脑,多......
  • HBase 的安装与简单操作
    #HBase的安装与简单操作HBase是一个开源的、分布式的NoSQL数据库,基于Hadoop的HDFS(HadoopDistributedFileSystem)构建,适用于大规模数据存储和快速随机访问。以下是HBase的安装步骤以及一些简单的操作示例。##一、环境准备###1.系统要求-**操作系统**:Linux(......
  • 我有三台ubuntu服务器,手把手教我从0搭建HBase,然后往里存一些数据。
    好的,我们可以一步步来搭建一个基本的HBase集群,并在里面存储一些数据。这里的步骤包括在三台Ubuntu服务器上配置HBase所需的依赖、安装HBase、配置和启动集群、测试存储和查询数据。假设这三台服务器的IP地址分别为192.168.1.101、192.168.1.102和192.168.1.103,其中第......
  • 再学HBase,关于HBase的一些基础知识 | 如何集成在java中
    HBase简介在使用方面:HBase是一种数据仓库,是基于hdfs的nosql数据源,数据都是存放在hdfs上的,不需要像hive一样再去运行MapReduce进行长时间运算。特点:在phonenix/hive的集成下才可以支持sql,本身是有自己的dql语言的。具有一级索引rowKey,基于一级索引查询hbase的表都是物理表,......
  • Hive表 Hadoop HBase 初了解
    生态圈HiveHive是基于Hadoop的一个数据分析工具,没有数据存储能力,只有数据使用能力,是将结构化的数据文件映射为一张数据库表,通过MapReduce实现,本质是将查询语句转换为MapReduce的任务进行数据访问,提供类SQL查询功能。搭建Hive数仓时,将相关常用指令如select,from,where和函数......