简介
HBase是一个分布式的、面向列的开源数据库,源于google的一篇论文《bigtable:一个结构化数据的分布式存储系统》。HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服务。
HBase的表结构
HBase以表的形式存储数据。表有行和列组成。列划分为若干个列族/列簇(column family)。
|
|
如上图所示,key1,key2,key3是三条记录的唯一的row key值,column-family1,column-family2,column-family3是三个列族,每个列族下又包括几列。比如column-family1这个列族下包括两列,名字是column1和column2,t1:abc,t2:gdxdf是由row key1和column-family1-column1唯一确定的一个单元cell。这个cell中有两个数据,abc和gdxdf。两个值的时间戳不一样,分别是t1,t2, hbase会返回最新时间的值给请求者。
这些名词的具体含义如下:
Row Key
- 与nosql数据库们一样,row key是用来检索记录的主键。访问hbase table中的行,只有三种方式:
- 通过单个row key访问
- 通过row key的range
- 全表扫描
- Row key行键 (Row key)可以是任意字符串(最大长度是 64KB,实际应用中长度一般为 10-100bytes),在hbase内部,row key保存为字节数组。
- 存储时,数据按照Row key的字典序(byte order)排序存储。设计key时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性)
- 注意:字典序对int排序的结果是1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。要保持整形的自然序,行键必须用0作左填充。
- 行的一次读写是原子操作 (不论一次读写多少列)。这个设计决策能够使用户很容易的理解程序在对同一个行进行并发更新操作时的行为。
列族 column family
- hbase表中的每个列,都归属与某个列族。列族是表的chema的一部分(而列不是),必须在使用表之前定义。列名都以列族作为前缀。例如
courses:history
,courses:math
都属于courses
这个列族。 - 访问控制、磁盘和内存的使用统计都是在列族层面进行的。实际应用中,列族上的控制权限能帮助我们管理不同类型的应用:我们允许一些应用可以添加新的基本数据、一些应用可以读取基本数据并创建继承的列族、一些应用则只允许浏览数据(甚至可能因为隐私的原因不能浏览所有数据)。
单元 Cell
HBase中通过row和columns确定的为一个存贮单元称为cell。由{row key, column( =<family> + <label>), version}
唯一确定的单元。cell中的数据是没有类型的,全部是字节码形式存储。
时间戳 timestamp
- 每个cell都保存着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64位整型。时间戳可以由hbase(在数据写入时自动 )赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。每个cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。
- 为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担,hbase提供了两种数据版本回收方式。一是保存数据的最后n个版本,二是保存最近一段时间内的版本(比如最近七天)。用户可以针对每个列族进行设置。
列存储
列存储不同于传统的关系型数据库,其数据在表中是按行存储的,列方式所带来的重要好处之一就是,由于查询中的选择规则是通过列来定义的,因 此整个数据库是自动索引化的。按列存储每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取的数据量,一个字段的数据聚集存储,那就 更容易为这种聚集存储设计更好的压缩/解压算法。这张图讲述了传统的行存储和列存储的区别:
安装及使用
安装
从 Apache的HBase的镜像网站上下载一个稳定版本的HBase
http://mirrors.devlib.org/apache/hbase/stable/hbase-1.1.2-bin.tar.gz
, 下载完成后,对其进行解压缩。确定你的机器中已经正确的安装了Java SDK、SSH,否则将无法正常运行。
- 进入到hbase的安装目录编辑
conf/hbase-env.sh
文件,将JAVA_HOME
修改为你的JDK安装目录export JAVA_HOME=/JDK_PATH
- 编辑
regionservers
,里面改为你的Hbase所有服务器名,ip地址或者是代理名,如果是单机版的则是只需要localhost
即可。 - 然后编辑
hbase-site.xml
文件,在里面加入:
|
|
- 此外还可以输入一些配置:
hbase.master.port
HBase的Master的端口.默认:60000
hbase.cluster.distributed
HBase的运行模式。false是单机模式,true是分布式模式。若为false,HBase和Zookeeper会运行在同一个JVM里面。默认:false
.hbase.master.info.port
HBase Master web 界面端口. 设置为-1 意味着你不想让他运行。0.98 版本以后默认:16010
以前是60010
.hbase.zookeeper.quorum
Zookeeper集群的地址列表,用逗号分割。例如:”host1.mydomain.com,host2.mydomain.com,host3.mydomain.com”.默认是localhost,是给伪分布式用的。要修改才能在完全分布式的情况下使用。如果在hbase-env.sh设置了HBASE_MANAGES_ZK,这些ZooKeeper节点就会和HBase一起启动。默认:localhost
.hbase.zookeeper.property.clientPort
ZooKeeper的zoo.conf中的配置.客户端连接的端口,默认:2181
.
使用
- 启动:进入到bin目录,然后
./start-hbase.sh
即可启动hbase.- 可以通过web的方式查看hbase的运行状态:
ip:61010
- 可以通过web的方式查看hbase的运行状态:
- 停止:
./stop-hbase.sh
.
使用shell语言
进入bin目录下运行
hbase shell
命令可以HQL指模式:
基本命令:
名称 | 命令表达式 |
---|---|
查看所有表 | list |
创建表 | create ‘表名称’, ‘列名称1’,’列名称2’,’列名称N’ 或者规定版本有多少 create ‘表名称’,{NAME=>’表名称’,VERSIONS=>3}… |
添加记录 | put ‘表名称’, ‘行名称’, ‘列名称:*’, ‘值’ |
查看记录 | get ‘表名称’, ‘行名称’ |
查看表中的记录总数 | count ‘表名称’ |
删除记录 | delete ‘表名’ ,’行名称’ , ‘列名称’ |
删除一张表 | 先要屏蔽该表,才能对该表进行删除,第一步 disable ‘表名称’ 第二步 drop ‘表名称’ |
查看所有记录 | scan “表名称” |
查看某个表某个列中所有数据 | scan “表名称” , [‘列名称:*’] |
更新记录 | 就是重写一遍进行覆盖 |
- version 查看hbase版本号
- describe ‘表名’ 查看表结构
- hbase更新之后,以前的数据不丢失,分版本存起来,时间戳为版本的区分,老的版本存一个小时
- hbase中存储的都是byte数组,即使你写字符串进去也会转换成byte数组
java操作hbase
|
|
- 更多
|
|
hbase的集群架构和表存储机制
- 对事务的支持性很弱
- 支持简单的查询,但是对数据的支持很大
- hbase表结构:建表时,不需要限定表中的字段,只需要指定若干个列族
- 插入数据时,列族中可以存储任意多个列(KV,列名,列值)
- 一个value可以有多个版本,通过版本来区分(时间戳)
- 要查询某一个具体字段的值,需要指定的坐标:表名—–>行键—–>列族(ColumnFamily):列名(Qualifier)—–>版本
集群架构
- 存储的时候会把表分片,然后存在Region Server中,通常跟DataNode在一台机器上,然后Region Server存储在Hbase上。
- 还有一个协调者叫做,HMaster也叫做主节点,不负责存储表数据,负责:
- 管理RegionServer的状态
- 负责RegionServer的负载均衡
- 在查找数据的时候,会有一个专门记录信息在哪台Region的表叫做META表,然后这张表还会在分片放在Region中还有一张记录这张表的存储信息的表叫做ROOT表。
- Region中其实也是很丰富的,里面有HLogH,还有store,一个store存储一个region中的列族,store里面还有一块内存叫做Hfile表示访问频率多的数据。