大数据专题--HBase

一、简介

1.1组成:

Rowkey、列簇、列和列的value(单元格)

1、Rowkey

每一行的唯一标识。
不能直接用业务主键,会导致数据不平衡。
一般通用设计模式是加盐键,给键加上二进制字节作为前缀。

2、列簇

1)一张表通常有一个单独的列簇,1张表中的列簇不会超过5个(HBase作为Janusgraph的后端存储,有9个列簇)。
2)列簇必须在创建表时候定义,列只有在插入后才会存在,空值并不保存。
3)每一个列簇都会保存在自己的文件集合中,所有存储设置都需要在列簇级别指定。
HBase默认的块大小是64KB,版本数默认为3个版本,TTL可设置,一旦到底过期时间可自动删除旧行。
4)多重列簇类似于以Rowkey为连接条件的连接查询。

3、单元格:

列和行的交集,单元格是版本化的,最新版本号排咋最前面,所有单元格都会根据版本号降序排列。

1.2压缩

压缩是分区中HFile文件合并的过程,压缩过程分为2种,小量和全量。
XH 小量压缩阈值=3,如果分区HFile文件超过了预设值,就会启动小量压缩,压缩期间,不会发生持久化,如果Memsore写满,与该分区服务器交互的客户端就会被堵塞,直至压缩过程执行完毕。(BS连接HBase超时原因)
XH 全量压缩设置为7天一次。

二、相关操作

2.1hbase shell

进入HBase命令行页面
list:列出所有表

2.2namespace

HBase中没有database的概念,这里的namespace命名空间指对一组表的逻辑分组,类似RDBMS中的database;
HBase系统默认定义了两个缺省的namespace
hbase:系统内建表,包括namespace和meta表
default:用户建表时未指定namespace的表都创建在此

1)创建namespace
hbase>create_namespace 'test_ns'
2)列出所有namespace
hbase>list_namespace
3)查看namespace
hbase>describe_namespace 'test_ns'
4)在namespace下创建表
hbase>create 'test_ns:testtable', 'fm1'
5)查看namespace下的表
hbase>list_namespace_tables 'test_ns'
6)删除namespace ----必须空的namespace才能删除 要删除掉里面的表
hbase>disable 'test_ns:testtable'
hbase>drop 'test_ns:testtable'
hbase>drop_namespace 'test_ns'

2.3table DML

1、创建表
hbase>create 't_demo_tbl','f1','f2','f3' #-------t_demo_tbl是表名,f1,f2,f3是列簇名
2、查看表的结构:
hbase>describe 't_demo_tbl'
3、禁用,启用表
hbase>disable 't_demo_tbl'
hbase>enable 't_demo_tbl'
4、查看表结构是否启用【允许修改】 因为启用的表不允许修改:
hbase>is_enabled 't_demo_tbl'
5、增加一个列族:
hbase>disable 't_demo_tbl'
hbase>alter 't_demo_tbl', NAME=>'f1', VERSIONS=>3
hbase>enable 't_demo_tbl'
6、删除某个列族:
hbase>disable 't_demo_tbl'
hbase>alter 't_demo_tbl', NAME=>'f1', METHOD=>'delete' #--------注意大小写(简写:alter 't_demo_tbl', 'delete'=>'f1')
hbase>enable 't_demo_tbl'

7、查看所有的表
hbase>list
8、查看某一表是否存在:
hbase>exists 't_demo_tbl'

9、清空表:
hbase>truncate 't_demo_tbl'
10、删除某张表:
hbase>disable 't_demo_tbl'
hbase>drop 't_demo_tbl'

2.4table DDL

1、向表中插入数据:
hbase>put 't_demo_tbl', 'r1', 'f1:c1', 'value' #--------列族的列可以不存在,修改数据也是put,只需行健[rowkey]和列相同即可
2、删除某行数据的列[值]:
hbase>delete 't_demo_tbl', 'r1', 'c1', 'ts1' #--------删除t_demo_tbl表,行健为r1的c1列中,时间戳为ts1的值,如果不指定ts1就删除所有列值[默认保持三个版本]
3、删除某行数据:
hbase>deleteall 't_demo_tbl', 'r1'
注:删除并不会物理删除HBase中的记录,它会被标记被删除的记录。真正的物理删除在压缩过程中执行。

4、获取某个行健的所有列族的列值:
hbase>get 't_demo_tbl', 'r1'
5、获取某个行健的所有某个列族的列值:
hbase>get 't_demo_tbl', 'r1','f1'
6、获取某个行健的某两个列族的列值:
hbase>get 't_demo_tbl', 'r1','f1','f2'
7、获取某个行健的某个列族的某个列值:
hbase>get 't_demo_tbl', 'r1', 'f1:c1'
8、获取某个表的所有行健值:
hbase>scan 't_demo_tbl'
9、获取某个表的前3行:
hbase>scan 't_demo_tbl', {LIMIT=>3}
10、获取某个表的从指定位置开始的行:
hbase>scan 't_demo_tbl', {STARTROW=>'rowKey', LIMIT=>3}
11、获取某个表的指定列的所有行数据:
hbase>scan 'heroes', {COLUMNS =>'f1:c1'}
12、统计表的行数:
hbase>count 't_demo_tbl'
INTERVAL=>100000000 统计间隔

或者hbase org.apache.hadoop.hbase.mapreduce.RowCounter 't_demo_tbl'
比hbase shell 统计快一些

13、清空表:truncate ‘tablename’
14、移除整张表:drop ‘tablename’
以上两步骤,必须先禁用表(disable)。

2.5HBase API

Get类
Put类
Delete类
Scan类
过滤器

三、hbase 2.0及以上版本的优化:

1.flush和compaction支持到列簇级别

四、HBase 不同namespace下表的转移

1、disable 'TableName'

2、snapshot 'TableName', TableNameSnapshot1'

3、clone_snapshot 'TableNameSnapshot1', 'NewNameSpace:TableName'

4、delete_snapshot 'TableNameSnapshot1'

-------------------------------------分割线----------------------
一:hbase的存储形式
hbase的内部使用KeyValue的形式存在,其key是有rowkey:family:column:logTime,value是其存储的内容。


image.png

其在region的是大多以升序的形式排列,唯一的是logtime是以降序的形式进行排列。

所以,按照越靠近左边的信息越容易被检索到。其设计时,要考虑把重要的信息放左边,不重要的信息放到右边。这样可以提高查询数据的速度。这样,最重要的提高索引速度的就是设计合适的rowkey。

二:rowkey的设计原则
1:长度原则,最短越好,最大不能超过64K。太长的影响有两点,一是极大影响了HFile的存储效率。二是缓存memstore不能得到有效利用,缓存不能存放太多的信息,造成检索效率的降低。

2:唯一原则

保证rowkey的唯一性,这条没有什么要讲的。

3:自己一条原则

尽量保证经常一起用的rowkey存储在同一个region上,有助于提升检索效率。但要避免热点问题。

4:对于常用的检索的rowkey,尽量使用高表(行多列少),二部选择宽表(列多行少)。

三:rowkey引起热点问题的集中解决方法
1-加盐:在rowkey前面加一个冗余信息,这样可以把数据分散到不同的region中。

优点:可以有效的防止rowkey集中分配到一个或多个region中。有效避免了热点问题;

缺点:无形中增加了rowkey的长度;范围检索得不到有效使用。

2-字段交换,提升权重:如果rowkey中含有几个信息字段,可以调整信息字段的顺序。

缺点:对于单个信息字段,或者无论怎么调整都会遇到region热点的rowkey是解决不了的。

3-随机键:把rowkey进行hash化,在分配到不同的服务器上。和加盐的方式相似;

以下是顺序读的性能排行(由高到低,写性能与读性能相反):顺序键 -> 使用加盐键 -> 提升字段键 -> 随机键

强加几个知识点:

1-尽量使用范围查询代替前缀查询;

2-数据多时,用分页查询;

你可能感兴趣的:(大数据专题--HBase)