Hbase存储相关介绍
Region Server: 不同Region数据互斥(Table+StartKey+Time);Region数量不能低于集群节点数量
数据的高可用:内存
通过HLog及MemStore实现数据的高可用,具体设计如下:
HLog(WAL:预写日志===binlog,解决高可用、远程备份):HLog是WAL的实现,HLogKey、HLogSyncer(异步刷日志到H)、HLogRoller(生成新的Hlog、删除多余的Hlog)
MemStore:默认64M,每个列族对应一个Store(含一个MemStore及不定数StoreFile)
不可靠数据的持久化:落盘
通过StoreFile进行数据固化,StoreFile重点涉及Hfile及HBase Compaction的处理;刷磁盘的触发方式包含3种方式。
StoreFile
HFile:存储的最小单元;Data Block存Key-Val(KeyLength、ValueLength、Key、Value),删除是逻辑删除,不会真的删除
HBase Compaction:将小的StoreFile合并成大的StoreFile,包括MinorCompaction、MajorCompaction两类
触发方式
(1) flush操作(整个regin的StoreFile都会执行);
(2) 手动触发
(3) 后台线程周期检查触发(文件数超过阈值;最早更新时间是否超出某个值
设置hbase.hregion.majorcompaction及hbase.hregion.majorcompaction.jitter,在指定闭区别)
【hbase.hregion.majorcompaction-hbase.hregion.majorcompaction*hbase.hregion.majorcompaction.jitter,hbase.hregion.majorcompaction+hbase.hregion.majorcompaction*hbase.hregion.majorcompaction.jitter】
分类
(1) MinorCompaction:耗时相对较短,小的相邻的StoreFile合并
(2) MajorCompaction:耗时长,合并成一个StoreFile,会删除三类数据:ttl过期数据、版本号超过设定的版本数的数据(设置了version数的前提下)、被删除的数据(自动触发的配置在生产环境经常被禁掉,改手动操作--触发的是MajorCompaction)
数据存储过程
数据查询过程
Hbase的具体操作
前置
namespace对应mysql的db
创建带namespace(ns1)的表(t1)
create 'ns1:t1', {NAME => 'f1', VERSIONS => 5}
创建使用默认namespace的多个列族的表(f1、f2、f3)
create 't1', {NAME => 'f1'}, {NAME => 'f2'}, {NAME => 'f3'} 等价于 create 't1', 'f1', 'f2', 'f3'
创建带配置的表
create 't1', {NAME => 'f1', VERSIONS => 1, TTL => 2592000, BLOCKCACHE => true}
create 't1', {NAME => 'f1', CONFIGURATION => {'hbase.hstore.blockingStoreFiles' => '10'}}
带拆分信息的表
hbase> create 'ns1:t1', 'f1', SPLITS => ['10', '20', '30', '40']
hbase> create 't1', 'f1', SPLITS => ['10', '20', '30', '40']
hbase> create 't1', 'f1', SPLITS_FILE => 'splits.txt', OWNER => 'johndoe'
hbase> create 't1', {NAME => 'f1', VERSIONS => 5}, METADATA => { 'mkey' => 'myvalue' }
hbase> # Optionally pre-split the table into NUMREGIONS, using
hbase> # SPLITALGO ("HexStringSplit", "UniformSplit" or classname)
hbase> create 't1', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
hbase> create 't1', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit', REGION_REPLICATION => 2, CONFIGURATION => {'hbase.hregion.scan.loadColumnFamiliesOnDemand' => 'true'}}
hbase> create 't1', {NAME => 'f1', DFS_REPLICATION => 1}
Hbase的表结构
Table= RowKey + Family + Column + Timestamp + Value( RowKey + Family + Column + Timestamp) → Value
Row Key
Row key行键可以是任意字符串(最大长度是 64KB,实际应用中长度一般为 10-100bytes),在hbase内部,row key保存为字节数组。
列族 (column family)
hbase表中的每个列都归属于某个列族。列族是表的chema的一部分(列不是);
列族必须在使用表之前定义;
列名都以列族作为前缀(例如courses:history , courses:math 都属于 courses 这个列族)
时间戳
HBase中通过row和columns确定的cell为存储单元;
每个 cell都保存着同一份数据的多个版本,版本通过时间戳来索引;
时间戳的类型是 64位整型:可以由hbase(在数据写入时自动 )赋值(精确到毫秒的当前系统时间);时间戳也可以由客户显式赋值
每个 cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。
为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担,hbase提供两种数据版本回收方式:保存数据的最后n个版本;保存最近一段时间内的版本(比如最近七天)。用户可以针对每个列族进行设置。
对Hbase而言,表结构设计会对系统的性能以及开销上造成很大的区别;
Rowke排序+Column排序进行存储
hbase shell操作
数据存表中
put ‘t1’ ,‘col_f’, 'val-取值'
查看表中所有数据
scan ‘表名’
查询表中一行数据
get '表名', 'rowkey'
查询表中一行的指定列
get 'table name', ‘rowid’, {COLUMN => ‘column family:column name ’}
删除一行中所有cell
deleteall ‘<table name>’, ‘<row>’
使用 delete 命令,可以在一个表中删除特定cell
delete ‘’, ‘’, ‘’, ‘’
手工合并hfile
compact 't1'
查看表结构
describe 't1' / desc 't1'
修改表结构(修改表结构必须先disable)
alter 't1', {NAME => 'f1'}, {NAME => 'f2', METHOD => 'delete'}
disable 'test1'
alter 'test1',{NAME=>'body',TTL=>'15552000'},{NAME=>'meta', TTL=>'15552000'}
enable 'test1'
分配权限
语法 grant <user> <permissions> <table> <column family> <column qualifier> 参数后面用逗号分隔
权限用五个字母表示:"RWXCA".其中分别表示READ('R'), WRITE('W'), EXEC('X'), CREATE('C'), ADMIN('A')例如,给用户‘test'分配对表t1有读写的权限,hbase(main)> grant 'test','RW','t1'
查看权限
语法:user_permission <table>
# 例如,查看表t1的权限列表hbase(main)> user_permission 't1'
收回权限
与分配权限类似,
语法:revoke <user> <table> <column family> <column qualifier>
# 例如,收回test用户在表t1上的权限revoke 'test','t1'
Region管理
1)移动region
语法:move 'encodeRegionName', 'ServerName'
encodeRegionName指的regioName后面的编码,ServerName指的是master-status的Region Servers列表
示例
hbase(main)>move'4343995a58be8e5bbc739af1e91cd72d','db-41.xxx.xxx.org,60020,1390274516739'
2)开启/关闭region
语法:balance_switch true|false
hbase(main)>balance_switch
3)手动split
语法:split 'regionName', 'splitKey'
4)手动触发major compaction
Compact all regions in a table:
#hbase> major_compact't1'
Compact an entire region:
#hbase> major_compact'r1'
Compact a single column family within a region:
#hbase> major_compact'r1','c1'
Compact a single column family within a table:
#hbase> major_compact't1','c1'
配置管理及节点重启
1)修改hdfs配置
hdfs配置位置:/etc/hadoop/conf,同步hdfs配置
cat/home/hadoop/slaves|xargs -i -t scp /etc/hadoop/conf/hdfs-site.xml hadoop@{}:/etc/hadoop/conf/hdfs-site.xml
#关闭:
cat/home/hadoop/slaves|xargs -i -t ssh hadoop@{} "sudo /home/hadoop/cdh4/hadoop-2.0.0-cdh4.2.1/sbin/hadoop-daemon.sh --config /etc/hadoop/conf stop datanode"
#启动:
cat/home/hadoop/slaves|xargs -i -t ssh hadoop@{} "sudo /home/hadoop/cdh4/hadoop-2.0.0-cdh4.2.1/sbin/hadoop-daemon.sh --config /etc/hadoop/conf start datanode"
2)修改hbase配置
同步hbase配置
cat/home/hadoop/hbase/conf/regionservers|xargs -i -t scp /home/hadoop/hbase/conf/hbase-site.xml hadoop@{}:/home/hadoop/hbase/conf/hbase-site.xml
# graceful重启
cd~/hbase
bin/graceful_stop.sh--restart --reload --debug inspurXXX.xxx.xxx.org
网友评论