create talb
HBase建表是非常简单的,最简单举例如下:
hbase(main):005:0> help 'create'
Creates a table. Pass a table name, and a set of column family
specifications (at least one), and, optionally, table configuration.
Column specification can be a simple string (name), or a dictionary
(dictionaries are described below in main help output), necessarily
including NAME attribute.
Examples:Create a table with namespace=ns1 and table qualifier=t1
hbase> create 'ns1:t1', {NAME => 'f1', VERSIONS => 5}
而在实际生产环境中,由于数据量大小、环境差异、数据生命周期、业务特点等的区别,需要对简表语句进行额外的很多设置,主要的设置参数整理如下(这些参数都是作用到列族上):
参数 | 默认值 | 意义 | 备注 |
---|---|---|---|
DATA_BLOCK_ENCODING | NONE | 块的压缩(暂时不启用) a)节省LRU Cache的空间使用,提升cache命中率,优化读性能 |
参考文档:http://blog.csdn.net/javastart/article/details/51820212
|
COMPRESSION | NONE | 压缩方式。一般建议选择SNAPPY。 除此之外,还有GZ和LZO两种压缩方法。 |
1. 在任何场景下开启prefix_tree编码都是安全的 2. 在任何场景下都不要同时开启snappy压缩和prefix_tree编码 3. 通常情况下snappy压缩并不能比prefix_tree编码获得更好的优化结果,如果需要使用snappy需要针对业务数据进行实际测试 |
BLOOMFILTER | NONE | HBase的高级功能,能够减少特定访问模式下的查询时间,是一种“空间换时间”的策略。 建议使用“ROW” - 行键使用布隆过滤器 还有一个可选值“ROWCOL” - 列键使用布隆过滤器 |
|
REPLICATION_SCOPE | 0 | 0:本地范围,关闭实时同步 1:全局范围,开启实时同步 |
|
VERSIONS | 3 | 最大版本数,在断言删除过程中,HBase会移除超过最大版本数的数据。 在不访问旧数据的情况下,用户可以设置为1。 |
|
MIN_VERSIONS | 0 | 保存的最小版本的数据。 |
|
TTL | FOREVER | TTL设置一个基于时间戳的临界值,major合并过程中会删除超过TTL的数据。单位为秒。 | |
KEEP_DELETED_CELLS | FALSE | ||
BLOCKSIZE | 65536 | 块大小。类似于RDBMS中的存储单元页,这个参数用于指定HBase在一次读取过程中顺序读取多少数据到内存缓冲区。 | |
IN_MEMORY | false | 高优先级地将列族的数据常驻内存,除非堆压力过大,才会从内存卸载这部分数据。 适合数据量小的元数据表。 |
|
BLOCKCACHE | true | HBase顺序读取一个数据块到内存缓存中,再次读取时可以直接在内存中读取,减少IO。 |
|
NUMREGIONS | 预分区的个数。 | ||
SPLITALGO | HexStringSplit UniformSplit |
问题详细现象:程序写hbase时写压力都集中到某一个region server上。 基于以上现象研究了hbase region split机制。在默认情况下hbase会根据自动splitting机制进行region分片。当一个table刚被创建的时候,Hbase默认的分配一个region给table。也就是说这个时候,所有的读写请求都会访问到同一个regionServer的同一个region中,这个时候就达不到负载均衡的效果了,集群中的其他regionServer就可能会处于比较空闲的状态。解决这个问题可以用pre-splitting,在创建table的时候就配置好,生成多个region。 Hbase自带了两种pre-split的算法,分别是 HexStringSplit 和 UniformSplit 。如果我们的row key是十六进制的字符串作为前缀的,就比较适合用HexStringSplit,作为pre-split的算法。例如,我们使用HexHash(prefix)作为row key的前缀,其中Hexhash为最终得到十六进制字符串的hash算法。我们也可以用我们自己的split算法。 |
举例
hbase> create 't1', 'f1', 'f2', 'f3' ## 创建表't1',列簇'f1'、'f2'、'f3',各项列簇属性使用默认 hbase> create 't1', {NAME => 'f1', VERSIONS => 1, TTL => 1000, BLOCKCACHE => true} ## 创建表't1',列簇'f1',列簇属性(最大版本为1、TTL 时间1000s,启用 blockcache)
alter table
- 只放入想修改的属性即可,不用把所有属性填进去;
- 操作之前先 disable 表,以免出现异常;
- 可新增、删除、修改表的属性;
- 可新增/删除列簇、修改列簇的属性;
- 可同时操作多个列簇;
举例
hbase> disable 't1' ## 修改表之前建议先禁用
hbase> alter 't1', NAME => 'f1', VERSIONS => 5 ## 修改列簇'f1'的最大版本为5
hbase> alter 'ns1:t1', NAME => 'f1', METHOD => 'delete' ## 删除表’ns1:t1’的列簇‘f1’
hbase> alter 't1', {NAME => 'f2', IN_MEMORY => true}, {NAME => 'f3', VERSIONS => 5} ## 同时修改列簇‘f2’,‘f3’
create 'gt_dw:ad_phone_change', {NAME => 'inf', VERSIONS => 3},{NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
0 row(s) in 20.6560 seconds
为HBase表增加column family:
1.disable table(可选);
2.增加column family:
alter 'gt_dw:geohash7_lbs_gids',{NAME => 'cnf', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROWCOL', REPLICATION_SCOPE => '0', VERSIONS => '3', COMPRESSION => 'SNAPPY', MIN_VERSIONS => '0', TTL => 15552000, KEEP_DELETED_CELLS => 'FALSE', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}
操作日志如下:
Updating all regions with the new schema...
0/8 regions updated.
6/8 regions updated.
8/8 regions updated.
Done.
0 row(s) in 3.3800 seconds
3.describe table
hbase(main):048:0* desc 'gt_dw:geohash7_lbs_gids'
Table gt_dw:geohash7_lbs_gids is ENABLED
gt_dw:geohash7_lbs_gids
COLUMN FAMILIES DESCRIPTION
{NAME => 'cnf', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROWCOL', REPLICATION_SCOPE => '0', COMPRESSION => 'SNAPPY', V
ERSIONS => '3', TTL => '15552000 SECONDS (180 DAYS)', MIN_VERSIONS => '0', KEEP_DELETED_CELLS => 'FALSE', BLOCKSIZE => '6553
6', IN_MEMORY => 'false', BLOCKCACHE => 'true'}
{NAME => 'inf', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROWCOL', REPLICATION_SCOPE => '0', VERSIONS => '3', COMPRESSI
ON => 'SNAPPY', MIN_VERSIONS => '0', TTL => '15552000 SECONDS (180 DAYS)', KEEP_DELETED_CELLS => 'FALSE', BLOCKSIZE => '6553
6', IN_MEMORY => 'false', BLOCKCACHE => 'true'}
2 row(s) in 0.0370 seconds
删除inf列族:
alter 'gt_dw:geohash7_homework_gids','delete' => 'inf'