hbase存储相关浅析

​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 ‘

’, ‘

使用 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

参数后面用逗号分隔

权限用五个字母表示:"RWXCA".其中分别表示READ('R'), WRITE('W'), EXEC('X'), CREATE('C'), ADMIN('A')例如,给用户‘test'分配对表t1有读写的权限,hbase(main)> grant 'test','RW','t1'

查看权限

语法:user_permission

# 例如,查看表t1的权限列表hbase(main)> user_permission 't1'

收回权限

与分配权限类似,

语法:revoke

# 例如,收回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

你可能感兴趣的:(hbase存储相关浅析)