文章目录
一.HBase REST API
使用REST API操作HBase
- 1.start/stop rest service
./hbase-daemon.sh start rest -p 9081
./hbase-daemon.sh stop rest -p 9081
示例
http://localhost:9081/version
http://localhost:9081/<table_name>/schema
http://localhost:9081/<table_name>/<row_key>
二.Phoenix概述
Phoenix简介
- 构建在HBase上的SQL层
- 使用标准SQL在HBase中管理数据
- 使用JDBC来创建表,插入数据、对HBase数据进行查询
- Phoenix JDBC Driver容易嵌入到支持JDBC的程序中
Phoenix无法代替RDBMS
- 缺乏完整约束,很多领域尚不成熟
Phoenix使HBase更易用
Phoenix应用场景
- 1)Phoenix适合场景
- 2)快速而容易地构建基于HBase的应用程序
- 3)需要极大的规模、性能和并发性的SQL应用程序
- 4)在转换到Hadoop时重用已有的SQL技能
- 5)BI工具(对SQL支持较好)
Phoenix不适合场景
- 1)涉及大型Join操作或高级SQL特性的复杂SQL查询
- 2)Full-Table Scans
- 3)ETL jobs
- 4)Application Drivers/Interface
Phoenix支持类SQL语法
Phoenix支持的关键字类型
Standard SQL Data Types --标准SQL 数据类型
SELECT, UPSERT, DELETE --UPSERT与标准SQL不同 更新和插入都是一样的
JOINs: Inner and Outer
Subqueries
Secondary Indexes
GROUP BY, ORDER BY, HAVING
AVG, COUNT, MIN, MAX, SUM
Primary Keys, Constraints
CASE, COALESCE
VIEWs
PERCENT_RANK, LAST|FIRST VALUE
UNION ALL
Cross Joins
Windowing Functions --窗口函数
Transactions --事务
Authorization
Replication Management
Phoenix操作HBase
- 1)安装Phoenix
- 2)拷贝相关Jar包到RegionServer的HBase的lib目录
cp phoenix-4.14.0-cdh5.14.2-server.jar /opt/install/hbase/lib/
- 3)进入Phoenix的bin目录启动
./sqlline.py localhost -- 其中localhost为Zookeeper所在节点的主机名
/opt/install/phoenix/bin/sqlline.py
命令行操作
!tables -- 查看所有表,类似于beeline操作
CREATE TABLE company (COMPANY_ID INTEGER PRIMARY KEY, NAME VARCHAR(225)); --创建表操作
UPSERT INTO company VALUES(1, 'Microsoft'); -- 插入数据不支持插入多条数据
SELECT * FROM Company; --查看数据
三.Hive与HBase集成使用场景
将HBase作为Hive数据源,让HBase支持类SQL操作
将Hive ETL数据存入HBase,便于快速查询
构建低延时的数据仓库,利用HBase快速读写能力,实现数据实时查询
1.Hive与HBase集成原理
通过两者本身对外的API接口互相通信完成
- 由Hive的lib目录中hive-hbase-handler-*.jar工具类实现
HBaseStorageHandler
- 实现Hive与HBase集成的类
- 对HiveStorageHandler接口的实现
HBase作为Hive的数据源
- 创建Hive表映射HBase原有的表,实现HBase表更新后,Hive能获取到更新后的结果
Hive ETL结果存入HBase
- 创建Hive表映射HBase表,可以实现将Hive ETL后的结果被HBase访问
练习:
- 实现Hive中创建表hive_hbase_emp_table关联HBase
- 在Hive中插入数据,通过HBase查询
- 在HBase中插入数据,通过Hive查询
-- hbase表
CREATE TABLE emp(emp_id INTEGER PRIMARY KEY,emp_name varchar(20),age INTEGER);
UPSERT INTO emp VALUES (1,'zhangsan',20);
UPSERT INTO emp VALUES (2,'ls',21);
UPSERT INTO emp VALUES (3,'ww',22);
select * from emp;
-- hive
create external table emp(
emp_id int,
emp_name string,
age int
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.hbase.HBaseSerDe'
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES
(
"hbase.columns.mapping"=":key,0:emp_name,0:age"
)
tblproperties("hbase.table.name"="EMP");
-- hive 插入 hbase 查询
insert into emp values(1,'zs',21),(2,'zs',22),(3,'ls',23),(4,'ww',24),(5,'zl',25);
scan 'EMP'
-- hbase 插入 hive 查询
put 'EMP', '1001','0:age','20'
put 'EMP' ,'1001','0:emp_name','test01'
select * from emp;
三.Hbase常用命令
1.名称空间(NameSpace)
NameSpace:一种易于表管理的机制:可以创建、删除或更改NameSpace
#创建namespace语法
create_namespace '名称'
#列出所有namespace
list_namespace
#namespace下创建表语法
create 'namespace名字:表名', '列族名'
#删除namespace
drop_namespace '名称'
#更改namespace属性语法
alter_namespace 'namespace名称', {METHOD => 'set', 'PROPERTY_NAME' => 'PROPERTY_VALUE'}
#删除属性
alter_namespace 'test01',{METHOD=>"unset",NAME=>"author"}
2.安全权限(Security with GRANT)
使用grant命令进行授权管理:如读、写、执行和管理等
我们可以为用户赋予RWXCA权限中的一个或多个
R - read privilege 读权限
W - write privilege 写权限
C - create privilege 创建权限
A - admin privilege 管理权限
X - execute 执行权限
# 示例:给will用户赋予读写创建管理权限
grant 'will', 'RWCA', 'my_hbase_table'
3.权限管理命令(revoke & user_permission)
- 使用grant命令授权
语法:grant <user> <permissions> <table> [<column family> [<column:qualifier>]]
示例:grant 'will', 'RWCA', 'my_hbase_table'
- 使用revoke命令删除权限
语法:revoke <user> <table> [<column family> [<column:qualifier>]]
示例:revoke 'will', 'my_hbase_table'
- 使用user_permission查看用户对表所拥有的权限
语法:user_permission 'tablename'
示例:user_permission 'my_hbase_table'
四.Region管理
Region拆分
- 当一个Region大到一定程度,会进行分裂(split)
- HBase可以通过Region Split达到负载均衡
Region Split策略
- 1)自动拆分
- ConstantSizeRegionSplitPolicy
- IncreasingToUpperBoundRegionSplitPolicy(默认)
- 2)手动指定拆分点(或按代码预分割)
Region预拆分
- 指定拆分算法linux命令行运行
hbase org.apache.hadoop.hbase.util.RegionSplitter my_split_table HexStringSplit -c 10 -f mycf
其中:my_split_table:我们指定要新建的表名。
HexStringSplit:指定的拆分点算法为HexStringSplit。
-c:要拆分的Region数量。
-f:要建立的列族名称。
- 手动指定拆分点-hbase shell执行
#指定拆分点
create 'test_split2','mycf2',SPLITS=>['aaa','bbb','ccc','ddd','eee','fff']
#指定拆分文件 #splits文件中内容为aaa bbb ccc ddd eee fff (有换行)
create 'students','baseinfo',SPLITS_FILE => '/root/splits'
Region合并
- 如果删除了大量数据,很多Region变小,这时候分成多个Region就很浪费,可以把Region合并起来,Region的合并不是为了性能考虑,主要是出于维护的目的
五.HBase Compaction - LSM
1.Log-Structured Merge (LSM)
- 区别于传统数据库的更新现有数据
- 使用类似日志结构合并(LSM)的方式
- 只需要将值写到Log的末尾然后进行排序
- 优点:插入和更新数据非常快
- 缺点:占用更多空间
传统数据库 | LSM系统 | |
---|---|---|
特点 | 直接更新现有数据 | 将值写到Log末尾并合并 |
随机读写 | 通过顺序读写提高性能 | |
示例 | Hello my name is Bruce(Heather) | Hello my name is Bruce Hello my name is Heather |
2.HBase Compaction - 实现
Compaction分为Minor和Major两种
- Minor Compaction:将小文件合并成更少的大型文件
- Major Compaction:将一个HStore中的所有文件合并成一个文件
每次触发compact检查时,系统自动决定执行哪一种
- 有三种情况会触发compact检查
- 1)MemStore被刷写到磁盘
- 2)执行shell命令compact、major_compact或调用相应API
- 3)HBase后台线程周期性触发检查
3.HBase Compaction - Control
Minor一般由事件触发,Major一般由时间触发
相关控制
- Minor(1.2.0-cdh5.14.2版本)
- 1)hbase.hregion.memstore.flush.size 缓存阈值大小
- 2)hbase.hstore.compaction.max :每次compact的HFile的最大数目,默认是10
- 3)hbase.hstore.compaction.kv.max:compact时批量读取和写入KeyValue数据的数量,默认是10
- Major Compaction
- 1)hbase.hregion.majorcompaction 时间间隔
4.Flush和Compact操作
- flush操作
flush 'tablename'
flush 'regionname'
- compact操作
#compact一个表的所有regions
compact 't1'
#compact某个空闲的region
compact 'r1'
#compact一个region中的某个列族
compact 'r1', 'c1'
#compact一个表中的某个列族
compact 't1', 'c1'