hbase 创建表 增删列

张映 发表于 2019-09-25

分类目录: hadoop/spark/scala

标签:,

看这篇文章前,先看看上篇,关于hbase namespace。因为hbase表是基于namespace

1,要创建的表模型

2,创建表

hbase(main):009:0* create 'test_ns:user','login','info'  //创建表和列族
0 row(s) in 2.4120 seconds

=> Hbase::Table - test_ns:user

//插入数据
hbase(main):010:0> put 'test_ns:user','1000120190925','login:username','Tank'
0 row(s) in 0.0820 seconds

hbase(main):011:0> put 'test_ns:user','1000120190925','login:password','Pass1'
0 row(s) in 0.0090 seconds

hbase(main):012:0> put 'test_ns:user','1000120190925','info:sex','Male'
0 row(s) in 0.0080 seconds

hbase(main):013:0> put 'test_ns:user','1000120190925','info:age','35'
0 row(s) in 0.0110 seconds

hbase(main):014:0> scan "test_ns:user"  //所有数据
ROW COLUMN+CELL
 1000120190925 column=info:age, timestamp=1569399396752, value=35
 1000120190925 column=info:sex, timestamp=1569399395266, value=Male
 1000120190925 column=login:password, timestamp=1569399395245, value=Pass1
 1000120190925 column=login:username, timestamp=1569399395200, value=Tank
1 row(s) in 0.0460 seconds

3,查看表

hbase(main):015:0> describe 'test_ns:user'
Table test_ns:user is ENABLED
test_ns:user
COLUMN FAMILIES DESCRIPTION
{NAME => 'info', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
{NAME => 'login', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
2 row(s) in 0.0200 seconds

列族说明:

3.1, BLOOMFILTER

布隆过滤可以每列族单独启用 使用 HColumnDescriptor.setBloomFilterType(NONE | ROW | ROWCOL) 对列族单独启用布隆

Default = ROW 对行进行布隆过滤

对 ROW,行键的哈希在每次插入行时将被添加到布隆

对 ROWCOL,行键 + 列族 + 列族修饰的哈希将在每次插入行时添加到布隆

使用方法: create 'table',{BLOOMFILTER =>'ROW'}

作用:用布隆过滤可以节省读磁盘过程,可以有助于降低读取延迟

3.2, VERSIONS

默认是 1 这个参数的意思是数据保留 1 个 版本,如果我们认为我们的数据没有这么大 的必要保留这么多,随时都在更新,而老版本的数据对我们毫无价值,那将此参数设为 1 能 节约 2/3 的空间

使用方法: create 'table',{VERSIONS=>'2'}

附:MIN_VERSIONS => '0'是说在 compact 操作执行之后,至少要保留的版本

3.3. COMPRESSION

默认值是 NONE 即不使用压缩,这个参数意思是该列族是否采用压缩,采用什么压缩算 法,方法: create 'table',{NAME=>'info',COMPRESSION=>'SNAPPY'} ,建议采用 SNAPPY 压缩算 法 ,HBase 中,在 Snappy 发布之前(Google 2011 年对外发布 Snappy),采用的 LZO 算法,目标是达到尽可能快的压缩和解压速度,同时减少对 CPU 的消耗;

3.4,IN_MEMORY

inMemory:优先级最高,常驻cache,因此一般只有hbase系统的元数据,如meta表之类的才会放到inMemory队列中。普通的hbase列族也可以指定IN_MEMORY属性,方法如下:
create 'table', {NAME => 'f', IN_MEMORY => true}
修改上表的inmemory属性,方法如下:
alter 'table',{NAME=>'f',IN_MEMORY=>true}

3.5,MIN_VERSIONS

MIN_VERSIONS=>'0' 这样设置之后,TTL 时间戳过期后,将全部 彻底删除该 family 下所有的数据,如果 MIN_VERSIONS 不等于 0 那将保留最新的 MIN_VERSIONS 个版本的数据,其它的全部删除,比如 MIN_VERSIONS=>'1' 届时将保留一个 最新版本的数据,其它版本的数据将不再保存。

3.6,BLOCKCACHE的大小

当前blockcache的大小可以从regionserver页的block cache信息栏查看到。
调整参数hfile.block.cache.size可以修改block cache的大小,默认是0.4,表示使用整个堆大小(hbase-env.sh中配置的-Xmx)的40%作为block cache,当内存紧张时可以考虑调小此值,但是不推荐。
hbase的blockcache机制是采用LRUBlockCache实现的。

3.7,BLOCKSIZE

每个列族可配BlockSize(默认64KB)。当cell较大时需加大此配置。且该值和StoreFile的索引文件大小成反比。

4,禁用,启用表

hbase(main):016:0> is_enabled 'test_ns:user'  //检查是否启用
true
0 row(s) in 0.0070 seconds

hbase(main):017:0> disable 'test_ns:user'  //禁用
0 row(s) in 2.3520 seconds

hbase(main):018:0> is_enabled 'test_ns:user'   //在检查一下
false
0 row(s) in 0.0080 seconds

5,添加列族

hbase(main):022:0> alter 'test_ns:user',NAME=>'contact'  //添加列族
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 3.5590 seconds

hbase(main):023:0> enable 'test_ns:user'
0 row(s) in 2.2930 seconds
//新列族添加数据
hbase(main):024:0> put 'test_ns:user','1000120190925','contact:mobile','15854654215'
0 row(s) in 0.0160 seconds

hbase(main):025:0> put 'test_ns:user','1000120190925','contact:tel','02112345678'
0 row(s) in 0.0060 seconds

hbase(main):026:0> scan 'test_ns:user'  //查看数据
ROW COLUMN+CELL
 1000120190925 column=contact:mobile, timestamp=1569401820233, value=15854654215
 1000120190925 column=contact:tel, timestamp=1569401821139, value=02112345678
 1000120190925 column=info:age, timestamp=1569399396752, value=35
 1000120190925 column=info:sex, timestamp=1569399395266, value=Male
 1000120190925 column=login:password, timestamp=1569399395245, value=Pass1
 1000120190925 column=login:username, timestamp=1569399395200, value=Tank
1 row(s) in 0.0450 seconds

官方明确说明,一个列族,2-3个字段

6,删除列族

hbase(main):029:0> alter 'test_ns:user',NAME=>'test1'  //添加列族
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 2.4390 seconds

hbase(main):030:0> alter 'test_ns:user',NAME=>'test2'  //添加列族
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 2.4490 seconds

hbase(main):031:0> alter 'test_ns:user', NAME => 'test1', METHOD => 'delete' //删除列族
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 2.6970 seconds

hbase(main):032:0> alter 'test_ns:user', 'delete' => 'test2'  //删除列族
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 2.7800 seconds

hbase(main):033:0> enable 'test_ns:user'
0 row(s) in 3.0250 seconds

7,查看所有表

hbase(main):034:0> list
TABLE
test
test_ns:user
2 row(s) in 0.0210 seconds

=> ["test", "test_ns:user"]
hbase(main):035:0> exists 'test_ns:user'
Table test_ns:user does exist
0 row(s) in 0.0040 seconds

每个表都有namespace,上面test表没有显示namespace就是默认空间

8,清空并删除表

hbase(main):037:0> truncate 'test'  //清空表
Truncating 'test' table (it may take a while):
 - Disabling table...
 - Truncating table...
0 row(s) in 4.2190 seconds

hbase(main):038:0> disable 'test'
0 row(s) in 2.2920 seconds

hbase(main):039:0> drop 'test'  //删除表之前,要禁用表
0 row(s) in 1.2940 seconds

9,表预分区

默认情况下,在创建 HBase 表的时候会自动创建一个 region 分区,当导入数据的时候, 所有的 HBase 客户端都向这一个 region 写数据,直到这个 region 足够大了才进行切分。一 种可以加快批量写入速度的方法是通过预先创建一些空的 regions,这样当数据写入 HBase 时,会按照 region 分区情况,在集群内做数据的负载均衡。

# 创建了t1表的f列族,有4个预分区
hbase(main):043:0> create 'test_ns:test1','t1',SPLITS => ['10','20','30']

# 指定切分点建预分区表
hbase(main):044:0> create 'test_ns:test1','t2',SPLITS => ['\x10\x00', '\x20\x00', '\x30\x00', '\x40\x00']

# 建表,使用随机字节数组来进行预分4个Region
hbase(main):045:0> create 'test_ns:test1','t3', { NUMREGIONS => 4 , SPLITALGO => 'UniformSplit' }

# 建表,假设RowKey都是十六进制字符串来进行拆分,预分5个Region
hbase(main):046:0> create 'test_ns:test1','t4', { NUMREGIONS => 5, SPLITALGO => 'HexStringSplit' }

HexStringSplit

假设RowKey都是十六进制字符串来进行拆分。
只需传入要拆分的Region数量,会将数据从00000000到FFFFFFFF之间的数据长度按照N等分,并算出每一分段的startKey和endKey来作为拆分点。

UniformSplit

假设RowKey都是随机字节数组来进行拆分。与HexStringSplit不同的是,起始结束不是String而是byte[]。

DecimalStringSplit

假设RowKey都是00000000到99999999范围内的十进制字符串
可使用SplitAlgorithm开发自定义拆分算法



转载请注明
作者:海底苍鹰
地址:http://blog.51yip.com/hadoop/2186.html