hbase的sql组件之phoenix和phoenix的二级索引的使用

hbase的sql组件之phoenix

hbase是一个列式nosql分布式存储引擎,在javaapi中对hbase的操作都是基于对象的形式,也可以写mapreduce程序读取hbase上的数据和把数据写入数据,
phoenix组件给hbase添加了一个功能就是用sql来操作,这个组件可以在hbase上执行ddl和dml语句。
最重要的是支持二级索引,因为在hbase中只支持rowkey索引不支持其他列的索引,我们可以把其他列的索引建立phoenix引擎上
我们可以用phoenix上访问和创建结构化数据,在hbase上访问和创建非结构化数据
所以当我们选择了hbase,我们有个更多选择和操作可以操作hbase,也可以操作phoenix,
可以操作非结构化数据,也可以操作非结构化数据

phoenix的安装:
phoenix安装特别简单,只需在主节点上把它解压,将phoenix的jar包拷贝到HBase的lib目录,并启动phoenix引擎就可以了
安装步骤:
tar -zxvf apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz -C ~/training/
将phoenix的jar包拷贝到HBase的lib目录
cp *.jar ~/training/hbase-2.2.0/lib/
启动phoenix:bin/sqlline.py bigdata111:2181
启动的时候要指定连接hbase的zookeeper

有几点需要大家注意

  1. 启动后phoenix会自动在hbase上生成关于phoenix的系统表。
  2. phoenix上默认只能查看在phoenix上创建的表。
  3. 如果想让phoenix访问单独在hbase上创建的数据需要让这些数据在phoenix产生映射关系。
  4. 在phoenix上创建的表可以在hbase上查看

测试在hbase上提前创建好表,然后再建立映射让phoenix访问

  1. 首先我们在hbase上创建数据
			在HBase中
			create 'T3','INFO','GRADE'
			put 'T3','s001','INFO:NAME','Tom'
			put 'T3','s001','INFO:AGE','24'
			put 'T3','s001','GRADE:MATH','80'
			put 'T3','s002','INFO:NAME','Mary'

			在Phoniex中 创建视图
			CREATE VIEW t3(pk VARCHAR PRIMARY KEY, 
			info.name VARCHAR,
			info.age VARCHAR,
			grade.math VARCHAR);
  1. 然后我们在hbase上查看一下是否已经创建好
    在这里插入图片描述
  2. 我们在未建立映射操作情况下去看一下phoenix上是否能够查看到刚刚在hbase上创建的表
    在这里插入图片描述
    进入phoenix命令行模式
    执行查看所有表未发现T3表
  3. 在phoenix上建立关于T3的视图
CREATE VIEW t3(pk VARCHAR PRIMARY KEY, 
			info.name VARCHAR,
			info.age VARCHAR,
			grade.math VARCHAR);

经过测试phoenix可以忽略大小写的,所以这里的t3就是我们在hbase上创建的T3表
在这里插入图片描述
在这里插入图片描述
phoenix二级索引
phoenix二级索引分为全局索引、局部索引、覆盖索引
全局索引就是在每个节点上创建索引,用于读多写少的情况
局部索引就是在个别节点上创建索引,用于读少写多的情况
覆盖索引我感觉就像类搜索引起不但创建索引还创建索引的数据,一般索引是在索引表查这条数据的索引记录在表在什么位置,然后还需要去原来的表根据这条数据的位置再读取这条数据,而覆盖索引在读取索引的时候如果这个索引同时是覆盖索引那么就只需读取索引表就可以了不需要再读取原来的表了
为了方便测试我们提前往里边装在一些数据:

create table emp 
(empno integer primary key,
ename varchar,
job varchar,
mgr integer,
hiredate varchar,
sal integer,
comm integer,
deptno integer);

create table dept
(deptno integer primary key,
dname varchar,
loc varchar
);

upsert into emp values(7369,'SMITH','CLERK',7902,'1980/12/17',800,0,20);
upsert into emp values(7499,'ALLEN','SALESMAN',7698,'1981/2/20',1600,300,30);
upsert into emp values(7521,'WARD','SALESMAN',7698,'1981/2/22',1250,500,30);
upsert into emp values(7566,'JONES','MANAGER',7839,'1981/4/2',2975,0,20);
upsert into emp values(7654,'MARTIN','SALESMAN',7698,'1981/9/28',1250,1400,30);
upsert into emp values(7698,'BLAKE','MANAGER',7839,'1981/5/1',2850,0,30);
upsert into emp values(7782,'CLARK','MANAGER',7839,'1981/6/9',2450,0,10);
upsert into emp values(7788,'SCOTT','ANALYST',7566,'1987/4/19',3000,0,20);
upsert into emp values(7839,'KING','PRESIDENT',-1,'1981/11/17',5000,0,10);
upsert into emp values(7844,'TURNER','SALESMAN',7698,'1981/9/8',1500,0,30);
upsert into emp values(7876,'ADAMS','CLERK',7788,'1987/5/23',1100,0,20);
upsert into emp values(7900,'JAMES','CLERK',7698,'1981/12/3',950,0,30);
upsert into emp values(7902,'FORD','ANALYST',7566,'1981/12/3',3000,0,20);
upsert into emp values(7934,'MILLER','CLERK',7782,'1982/1/23',1300,0,10);

upsert into dept values(10,'ACCOUNTING','NEW YORK');
upsert into dept values(20,'RESEARCH','DALLAS');
upsert into dept values(30,'SALES','CHICAGO');
upsert into dept values(40,'OPERATIONS','BOSTON');

我们也可以把上面的这些语句保存为一个脚本,然后用phoenix的运行脚本的命令来运行这个脚本
查看phoenix所用的命令
在这里插入图片描述
使用run命令执行脚本
在这里插入图片描述
查看一下这个表是否创建成功
在这里插入图片描述
在这里插入图片描述
phoenix也支持执行计划,我们使用执行计划查看没有创建二级索引的时候查询过程
没有创建索引的时候,俩张表都是全表扫描
在这里插入图片描述
创建一个索引
在这里插入图片描述
我们在创建二级索引的时候报一个错:
Error: ERROR 1029 (42Y88): Mutable secondary indexes must have the hbase.regionserver.wal.codec property set to org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec in the hbase-sites.xml of every region server. tableName=INDEX001 (state=42Y88,code=1029)
它的意思是在创建二级索引的时候需要在hbase-site.xml中设置一个属性hbase.regionserver.wal.codec的值为org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec 。
然后我们退出phoenix和hbase,修改hbase-site.xml
在这里插入图片描述
然后再启动phoenix命令行模式并创建刚才那条创建索引的命令
在这里插入图片描述
在这里插入图片描述
我们创建了索引但是查看了执行计划好像是没有什么变化,我们再看一下所以表中有没有索引,

在这里插入图片描述
确实有但是没有看到有关使用了索引的问题,这个问题待后续再查查是什么引起的。
然后我们测试覆盖索引

没有创建索引之前:
在这里插入图片描述
然后我们在dept中建立一个覆盖索引

create index index002 on dept(deptno) include(dname);

在这里插入图片描述
然后我们再测试一下
在这里插入图片描述
从查询过程中感觉已经不再扫描全表只是扫描一下,但是时间上花也并不低,这个是由于另一个表太小表现不出什么优势,当表很大的时候就有优势了!

注意一点:
我hbase用的是2.2的
phoenix用的是5.0-2.0的在创建索引后出现添加数据或删除数据后报索引更新出错问题,我安装了几次没有把hbase2.0的安装成功,总是启动一会儿主节点就挂掉。完事我还要测试一下,再仔细安装一次。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

枣泥馅

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

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

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

打赏作者

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

抵扣说明:

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

余额充值