HBase表结构设计(结构创建压缩分区命名空间等)

Posted Data+Science+Insight

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HBase表结构设计(结构创建压缩分区命名空间等)相关的知识,希望对你有一定的参考价值。

HBase表结构设计(结构、创建、分区、命名空间等)

 

任务表述:
如果用户点击某一行数据则触发接口写数据进入HBase。那么当用户再次读取数据的时候数据A和数据B返回的数据就需要给返回的数据另外增加一个字段说明,即当前信息是否已阅。

需要接口及参数:
记录已阅写入HBase表的接口,需要请求参数,userid及id[其中id以逗号分隔可以多个];其中的功能也包括删除该记录的功能。
修改原有数据A和数据B接口,请求参数增加userid字段,返回内容增加是否已阅字段;

HBase表结构设计
表名:USE_MARK_online
rk: userid`id
cf: c
cq: CREATETIME
value: 

注意:
TTL设置,三年;

备注:TTL(Time to Live生存周期)设置了一个基于时间戳的临界值,内部的管理会自动的检查该TTL的的值是否达到上限,超过TTL的值会被删除;TTL参数的设置单位为秒,默认值为Integer.MAX_VALUE,即2147483647秒。使用默认值时,数据为永久保留。
例如,设置TTL为10s,此时插入一条数据r1到t1表中,10s之后r1将会被删除,如果r1有其他列,则其他列保留,TTL的概念只针对CELL。但是TTL的设置在cf端。
disable ‘tablename’
alter ‘tablename’, NAME=>‘cfname’, TTL=>’500’
//3年为90000000s
enable ‘talbename’
describe ‘tablename’

Compression
Compression就是在用CPU换I/O吞吐量和磁盘空间,如果没有什么特殊原因推荐针对Column Famliy设置compression,压缩的算法主要有GZIP,LZO,Snappy,一般推荐使用Snappy,因为她具有较好的Encoding/Decoding速度以及可以接受的压缩率。


HBase的连接使用HTableInterface保持长连接;
hasExists进行判断即可;
使用数据B数据A程序中的QueryHBase. multiExist程序即可。其中,也包括了HBase的连接配置等,例如,HbaseManager mgr = new HbaseManager(); HTableInterface htb = mgr.getTable(tbName);
16-32分区,即HBase的预分区策略;
在创建HBase表的时候默认一张表只有一个region,所有的put操作都会往这一个region中填充数据,当这个唯一region过大的时候就会进行split。可是如果在HBase表创建的时候就进行预分区则会减少数据猛增时由于region split带来的资源消耗。
HBase表的预分区需要紧密结合业务场景来选择分区的key值,每个region都有一个startKey和一个endKey来标识该region的rowkey存储范围。
创建包含预分区表的命名如下:
Create ‘tablename’, ‘cfname’, SPLITS=>[‘202105’, ‘202106’, ’202107’, ‘202108’]

或者

Create ‘tablename’, ’cfname’, SPLITS_FILE =>’/home/hadoop/splitfile.txt’
其中/home/hadoop/splitfile.txt文件的内容为:
202105
202106
202107
202108

该语句会创建5个region:
startKey             endKey              region
---------              202105              region0
202105              202106             region1
202106              202107             region2
202107              202108             region3
202108              ---------              region4
其中region0没有startKey, region4没有endKey。则put的一条数据为20160612的时候则会放入region2中。


表设计的分区策略:

create 'TEST_TABLE','c',{NAME => 'c', VERSIONS => '1', COMPRESSION => 'SNAPPY'},SPLITS => ['00','01','02','03','04','05','06','07','08','09','0a','0b','0c','0d','0e','0f','10','11','12','13','14','15','16','17','18','19','1a','1b','1c','1d','1e','1f','20','21','22','23','24','25','26','27','28','29','2a','2b','2c','2d','2e','2f','30','31','32','33','34','35','36','37','38','39','3a','3b','3c','3d','3e','3f','40','41','42','43','44','45','46','47','48','49','4a','4b','4c','4d','4e','4f','50','51','52','53','54','55','56','57','58','59','5a','5b','5c','5d','5e','5f','60','61','62','63','64','65','66','67','68','69','6a','6b','6c','6d','6e','6f','70','71','72','73','74','75','76','77','78','79','7a','7b','7c','7d','7e','7f','80','81','82','83','84','85','86','87','88','89','8a','8b','8c','8d','8e','8f','90','91','92','93','94','95','96','97','98','99','9a','9b','9c','9d','9e','9f','a0','a1','a2','a3','a4','a5','a6','a7','a8','a9','aa','ab','ac','ad','ae','af','b0','b1','b2','b3','b4','b5','b6','b7','b8','b9','ba','bb','bc','bd','be','bf','c0','c1','c2','c3','c4','c5','c6','c7','c8','c9','ca','cb','cc','cd','ce','cf','d0','d1','d2','d3','d4','d5','d6','d7','d8','d9','da','db','dc','dd','de','df','e0','e1','e2','e3','e4','e5','e6','e7','e8','e9','ea','eb','ec','ed','ee','ef','f0','f1','f2','f3','f4','f5','f6','f7','f8','f9','fa','fb','fc','fd','fe','ff']

USE_MARK_online
分区策略,大小写区分?
数字分区?

建表语句:

create 'USE_MARK_online','c',{NAME => 'c', VERSIONS => '1', TTL=>'90000000' ,COMPRESSION => 'NONE'},SPLITS => ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9']

分解他们:divide and conquor
NAME => 'address'    ?就是当前的column famliy
DATA_BLOCK_ENCODING => 'NONE'
BLOOMFILTER => 'ROW'
REPLICATION_SCOPE => '0'
VERSIONS => '3'
COMPRESSION => 'NONE'
MIN_VERSIONS => '0'
TTL => 'FOREVER'
KEEP_DELETED_CELLS => 'FALSE'
BLOCKSIZE => '65536'
IN_MEMORY => 'false'
BLOCKCACHE => 'true'


HBase 创建表参数:
创建名字为dimensionsoft的namespace
create_namespace ‘dimensionsoft’
注意:这里的namespace类似于RDBMS中的数据库的概念。
创建dimensionsoft这个namespace下的user表,并且有一个列族名字为info
create ‘dimensionsoft:user’, ‘info’
查考该名字空间下的表结构
describe ‘dimensionsoft:user’
在使用最简单的建表语句后HBase会给一些参数设置默认值,这些参数都是针对列族而言的,如果一个表有多个列族,则每个列族都会有自己的参数列表。

NAME => 'address'    就是当前的column famliy的名字


DATA_BLOCK_ENCODING => 'NONE'
数据块的编码方式设置。

BLOOMFILT => 'ROW'

REPLICATION_SCOPE => '0'
配置HBase集群replication参数是需要将该参数设置为1.
REPLICATION_SCOPE is a column-family level attribute user has to alter each column family with the alter command shown above, for all all the columns he wants to replicate.

VERSIONS => '3'
设置保存的版本数。


COMPRESSION => 'NONE'
设置HBase表中的数据压缩算法。

MIN_VERSIONS => '0'
设置存贮的最小版本数。

TTL => 'FOREVER'

KEEP_DELETED_CELLS => 'FALSE'

BLOCKSIZE => '65536'
设置HFile数据块大小,默认为64K

IN_MEMORY => 'false'
设置激进缓存,优先考虑将该列族放入块缓存中。对于随机读操作相对较多的列族可以设置该属性为true;

BLOCKCACHE => 'true'
数据块缓存属性


如果表已经创建:
如果HBase表已经创建,则需要通过alter来更改现有表的属性。
更改表的列族的属性,比如版本,TTL时间等等。
例如:列族中的单元格的最大数目设置。
alter ‘tablename’, ‘cfname’, VERSIONS =>5
例如:修改表的列族中的TTL属性。
alter ‘tablename’, NAME=>‘cfname’, TTL=>’500’

使用alter,可以设置和删除表范围,运算符。
MAX_FILESIZE, READONLY, MEMSTORE_FLUSHSIZE, DEFERRED_LOG_FLUSH等

例如:设置某一张表为只读表。
Alter ‘tablename’, READONLY
例如:删除表范围运算符
Alter ‘tablename’, METHOD=>’table_att_unset’, NAME=>’MAX_FILESIZE’

使用alter删除列族
Alter ‘tablename’, ‘delete’=>’cfname’


 

以上是关于HBase表结构设计(结构创建压缩分区命名空间等)的主要内容,如果未能解决你的问题,请参考以下文章

HBase原理 | HBase内部探险

HBase常用命令(超全超详细)

hbase项目

hbase 创建多version的表 , 并预分区

Hbase项目(完整版)

hbase 表的设计与其它大数据框架的集成