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读hbase太慢 hive查询hbase慢_hadoop

  • 使用hive 查看数据
select * from customer;

hive读hbase太慢 hive查询hbase慢_hive读hbase太慢_02

  • 启动hbase
[root@hadoop100 ~]# hbase shell
  • 使用hbase查看数据
scan 'customer'

hive读hbase太慢 hive查询hbase慢_hive读hbase太慢_03

  • 插入表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'

hive读hbase太慢 hive查询hbase慢_大数据_04

名称空间(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后台线程周期性触发检查

hive读hbase太慢 hive查询hbase慢_大数据_05

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时间间隔