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
有几点需要大家注意
- 启动后phoenix会自动在hbase上生成关于phoenix的系统表。
- phoenix上默认只能查看在phoenix上创建的表。
- 如果想让phoenix访问单独在hbase上创建的数据需要让这些数据在phoenix产生映射关系。
- 在phoenix上创建的表可以在hbase上查看
测试在hbase上提前创建好表,然后再建立映射让phoenix访问
- 首先我们在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);
- 然后我们在hbase上查看一下是否已经创建好
- 我们在未建立映射操作情况下去看一下phoenix上是否能够查看到刚刚在hbase上创建的表
进入phoenix命令行模式
执行查看所有表未发现T3表 - 在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的安装成功,总是启动一会儿主节点就挂掉。完事我还要测试一下,再仔细安装一次。