Hbase和Hive集成以及性能优化
- Hive与HBase集成使用场景
- Hive与HBase集成原理
- Hive与HBase集成
- 示例
- 名称空间(NameSpace)
- 安全权限(Security with GRANT)
- 安全权限(revoke&user_permission)
- Region Split
- HBase Compaction-LSM
- HBase Compaction-实现
- HBase Compaction-Control
Hive与HBase集成使用场景
将HBase作为Hive数据源
- 让HBase支持类SQL操作
将Hive ETL数据存入HBase
- 便于快速查询
构建低延迟时的数据仓库
- 利用HBase快速读写能力
- 实现数据实时查询
Hive与HBase集成原理
通过两者本身对外的API接口互相通信完成
- 由Hive的lib目录中hive-hbase-*.jar工具类完成
HBaseStorageHandler
- 实现Hive与HBase集成的类
- 对HiveStorageHandler接口的实现
Hive与HBase集成
-- 在hive中创建外部表
create external table customer(
name string, order_numb string,order_date string,addr_city string,addr_state string)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties ("hbase.columns.mapping"=":key,order:numb,order:date,addr:city,addr:state")
tblproperties("hbase.table.name" = "customer");
-- Hive中只支持select和insert,不支持HBase中的版本控制
select * from customer;
select count(*) from customer where order_numb is not null;
insert into table customer values ('James','1121','2018-05-31','toronto','ON');
-- 在HBase shell中查询插入结果
scan 'customer'
示例
- 启动master
[root@hadoop100 ~]# hbase-daemon.sh start master
- 启动hive
[root@hadoop100 ~]# hive
- 插入表customer
create external table customer(
cust_id string,
addr_address string,
addr_country string,
addr_state string,
name_col1 string)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties
('hbase.columns.mapping'=':key,addr:address,addr:country,addr:state,name:col1')
tblproperties('hbase.table.name'='customer');
- 使用hive 查看数据
select * from customer;
- 启动hbase
[root@hadoop100 ~]# hbase shell
- 使用hbase查看数据
scan 'customer'
- 插入表emp_basic
create external table emp_basic(
emp_id string,
emp_name string,
company string,
job_title string,
start_date string,
end_date string)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties
('hbase.columns.mapping'='
:key,emp:name,emp:company,emp:job_title,time:sDate,time:eDate')
tblproperties('hbase.table.name'='emp_basic');
- 使用hbase查看数据
get 'emp_basic','1'
名称空间(NameSpace)
NameSpace:一种易于表管理的机制
- 可以创建、删除或更改NameSpace
#创建namespace
create_namespace 'my_ns’
#create my_table in my_ns namespace
create 'my_ns:my_table', 'fam'
#删除namespace
drop_namespace 'my_ns’
#更改namespace
alter_namespace 'my_ns', {METHOD => 'set', 'PROPERTY_NAME' => 'PROPERTY_VALUE'}
安全权限(Security with GRANT)
使用grant命令进行授权管理
- 如读、写、执行和管理等
- grant命令语法
grant <user> <permissions> <table> [<column family> [<column; qualifier>]]
我们可以为用户赋予RWXCA权限中的一个或多个
R - read privilege 读权限
W - write privilege 写权限
C - create privilege 创建权限
A - admin privilege 管理权限
X - execute 执行权限
示例:grant 'will', 'RWCA', 'my_hbase_table'
安全权限(revoke&user_permission)
使用revoke命令删除所有权限
语法:revoke <user> <table> [<column family> [<column; qualifier>]]
示例:revoke 'will', 'my_hbase_table'
使用user_permission查看用户对表所拥有的权限
语法:user_permission 'tablename'
示例:user_permission 'my_hbase_table'
Region Split
当一个Region变大,会被split成两个Region
- HBase通过Split达到负载均衡
Region Split策略
- 自动Split(最常用)
ConstantSizeRegionSplitPolicy
当storefile达到hbase.hregion.max.filesize值时,自动Split
- 手动Split(或按代码预分隔)
- 插入Split策略
可以自定义Split策略
HBase Compaction-LSM
Log-Structured Merge(LSM)
- 区别于传统数据库的更新现有数据
- 使用类似日志结构合并(LSM)的方式
- 只需要将值写到Log 的末尾然后进行排序
- 优点:插入和更新数据非常快
- 缺点:占用更多空间
传统数据库 | LSM系统 | |
特点 | 直接更新现有数据随机读写 | 将值写到Log末尾并合并通过顺序读写提高性能 |
示例 | Hello my name is Bruce(Heather) | Hello my name is Bruce Hello my name is Heather |
HBase Compaction-实现
Compaction分为Minor和Major两种
- Minor Compaction
将文件合并成更少的大型文件
- Major Compaction
将一个HStore中的所有文件合并成一个文件
每次触发compact检查时,系统自动决定执行哪一种
- 有三种情况会触发compact检查
MemStore被刷写到磁盘
执行shell命令compact、major_compact或被调用相应API
HBase后台线程周期性触发检查
HBase Compaction-Control
Compaction总结
- 重写log文件并清除旧值
- 节约空间,提高读写速度
- 会占用大量系统空间和I/O,一般在系统空闲时进行
Flush->Minor Compaction->Major Compaction
- Flush:将memstore写到一个新的存储文件中
- Minor一般由事件触发,Major一般由时间触发
相关控制
- Flush:hbase.hregion.memstore.flush.size文件大小
- Minor:hbase.hstore.compaction.min/max文件数
- Major:hbase.hregion.majorcompaction时间间隔