看这篇文章前,先看看上篇,关于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