create and alter table

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命中率,优化读性能 
b)节省Disk空间使用 

参考文档: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'

猜你喜欢

转载自blog.csdn.net/mnasd/article/details/81088755