在上一篇已经介绍过了hbase安装及结构,下面我在说一下hbase的基本使用及优化方面的问题。
一、基本使用(操作)
1.首先hbase中有一个namespace(命名空间)的概念,namespace命名空间指的是对一组表的逻辑分组,类似于rdbms中的database,方便对表在业务上划分。Apache HBase从0.98.0,0.95.2两个版本开始支持namespace级别的授权操作,HBase全局管理员可以创建、修改和回收namespace的授权。
namespace介绍引用自:https://blog.csdn.net/maligebazi/article/details/79952459
在HBase系统中,默认定义了两个缺省的namespace
(1)hbase:系统内建表,包括namespace和meta表
(2)default:用户建表时未指定namespace的表都创建在此
关于namespace的一些基本用法:
①创建namespace
create_namespace 'mynamespace'
②删除namespace
drop_namespace 'mynamespace'
③查看namespace
describe_namespace 'mynamespace'
④列出所有的namespace
list_namespace
⑤在namespace下创建表
create 'mynamespace:mytable', 'info'
⑥查看namespace下的表
list_namespace_tables 'mynamespace'
2.hbase使用
①list:
list命令可以查看当前命名空间下所有的表,也可以查看特定命名空间下的表。
list 'ns:abc.*' --->查看命名空间ns下面的所有的以表名以abc开头的表的列表
list ---> 查看hhase中所有的表
②创建表
create 't1', 'cf1' --->在默认的命名空间下创建一张表名为t1,只有一个列族,列族名为cf1
③查看一张表的所有内容
scan 't1' -->查看表中的所有数据
scan 'ns1:t1' --> 查看表中某个列族的所有数据
④ 往表中增加一条记录
put 't1'(表名), '1'(rowkey), 'cf1:name'(列族:字段名), 'zhangsan'(value)
⑤查看行键
get 't1', '1', 'cf1:name'
⑥ 查看表的属性信息
describe/desc 't1'
⑦根据行键删除某条记录
delete 't1', '1', 'cf1:age' -->删除某一个rowkey对应的cf1:age对应的单元格
deleteall 't1', '2' -->删除rowkey=2对应的所有的单元格
⑧删除一张表
注意:删除表之前,需要先确认表状态是否为disable,如果不是,需要disable '表名'
disable 't1'
drop 't1'
二、行键和列族的设计
1.行键
在hbase中可能会出现行键的热点问题,那什么是热点问题呢?
热点问题指的是:由于行键相似,连续且数据量过大,造成了单个region的数据量过大,从而影响了对这个region 的读写效率。所以在我们设计行键的时候,如果数据量特别大,应该尽量的去随机,一定不要出现连续的
2.列族
(1)在我们设计hbase中表的时候,建议将我们的表做成高表,及减少列族数量,增加列族中的列。因为如果一个表拥有很多列族的话,那就代表操作表时,跨越的文件(HFile)就会很多,对我们的操作效率会有很大的影响。(当然如果数据量不大的话,那就随意喽)
(2)在设计表的时候,各个列/列族的名称不宜过长,因为hbase需要对这些数据在内存中做缓存,做索引,如果名称太长的话,可能会影响我们内存的容量。如下:
f1----->"cccccccccccccffffffff"
cf2----->"cf"
三、使用hive操作HBase
1.启动hive,进入hive的终端
hive --auxpath /opt/hive/lib/hive-hbase-handler-2.1.0.jar,/opt/hive/lib/zookeeper-3.4.6.jar
--hiveconf hbase.master=master:16010
--hiveconf hbase.zookeeper.quorum=master,slave01,slave02
2.在hive中创建hbase的表
①如果hbase重不存在该表,那么我们只能在hive中使用创建内部表的方式,来创建一张表,同时也会在hbase中创建相关的表。例如:
create table hbase_of_hive(
id int,
name string,
age int
)row format delimited
fields terminated by ','
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties (
"hbase.columns.mapping" = ":key,cf:name,cf:age",
"hbase.table.name" = "hbase_of_hive"
);
sql解释:在hive中创建了一张hbase_of_hive表,有三列内容id,name,age,同时映射到hbase中的表hbase_of_hive,其中id对应行键,并有一个列族cf,该列族下有两个字段name、age
②如果hbase中已经存在该表
如果使用上述建表语句创建的时候,则会报错,因为在hbase中已经存在了一张表为hbase_of_hive,所以这时只能创建外部表,去映射hbase中的一张表。例如:
create external table hbase_of_hive
(id int,
name string,
age int
)row format delimited
fields terminated by ','
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties (
"hbase.columns.mapping" = ":key,cf:name,cf:age",
"hbase.table.name" = "t"
);
以上已经将hbase中基本的操作已经介绍完了,其实hbase中是可以创建二级索引的,其实说白了就是为除主键以外的字段添加索引。这个在我以后的文章中会做介绍,此处就不进行说明了~