要实现操作hbase数据表首先要了解它的原理:
1,Hbase原理篇
HBASE就是基于Hadoop的一个开源项目,也是对Google的BigTable的一种实现。
BigTable最浅显来看就是一张很大的表,表的属性可以根据需求去动态增加,但是又没有表与表之间关联查询的需求。
BigTable是Google为分布存储和管理内部大规模结构化数据而设计的分布式数据库系统,是Google云 基础架构组成之一,具有良好的可扩展性,可在上千台廉价服务器上存储petabyte级别的数据。它不提供完整的关系数据模型,只提供简单的数据模型,这使得客户端可以动态控制数据的布局和格式。
BigTable就是张大表,这张表其实和我们想象的传统数据库的表还是有些差别的。这个表是一个稀疏的多维度映射表,排序后分布式地永久存储在硬盘上。这张映射表以行关键字、列关键字和时间戳作为索引,每个值是一个未作解释的字节数组。行关键字可以是任意字符串,在行关键字下的每个读写操作都是原子性的,不管读写行中有多少不同的列。BigTable通过行关键字的字典序来维护数据,一张表可动态划分成多个连续行,连续行称为Tablet,它是数据分布和负载均衡的基本单位。BigTable把列关键字分成组,每组为一个列族,列族是BigTable的基本访问控制单元。通常,同一列族下存放的数据具有相同的类型。在创建列关键字存放数据之前,必须先创建列族。在一张表中列族的数量不能太多,列的数量则不受限制。BigTable表项可以存储不同版本的内容,用时间戳来索引,按时间戳倒序排列。
BigTable非常适合于存放松散数据,松散数据可以说是介于Map Entry(key & value)和DB Row之间的一种数据。在使用Memcache的时候,有时候的需求是需要存储的不仅仅是简单的一个key对应一个value,可能需要类似于数据库表结构中多属性的存储,但是又不会像传统数据库表结构中那样,需要那么多关联关系,其实这类数据就是所谓的松散数据。
在Google云计算基础架构里,BigTable并不是孤立的,它建立在其他数个Google框架上。BigTable使用GFS来存储日志和数据文件;与其它分布式应用共享机器集群;依赖集群管理系统来调度任务、管理资源、处理失效机器、监视机器状态等。BigTable采用Google SSTable格式存储数据,SSTable提供永久存储的、有序的、不可改写的关键字到值的映射,以及相应的查询操作。在SSTable尾部包含一个块索引,用来定位数据。此外,BigTable还使用Google分布式锁服务Chubby来解决一系列问题,如:保证任何时间最多只有一个活跃的主备份;存储BigTable数据的启动位置;发现Tablet服务器;存储BigTable模式信息、存储访问权限等。
互联网应用有一个最大的特点,就是速度,功能再强大,速度慢,还是会被舍弃。因此在大访问量的网站都采取前后的缓存来提升性能和响应时间。对于Map Entry类型的数据,集中式分布式Cache都有很多选择,对于传统的关系型数据,从MySQL到Oracle都给了很好的支持,唯有松散数据这类数据,采用前后两种解决方案都不能最大化它的处理能力。因此BigTable才有了它用武之地。
HBASE作为Apache的开源项目,也是出于起步阶段,因为其实它所依赖的Hadoop也不能说已经到了成熟阶段,所以都有很大的发展空间,这也为我们这些开源爱好者提供了更多空间去贡献。这里主要会谈到HBASE的框架设计方面的知识和它的一些特点,不论是否采用HBASE去解决工作中的问题,一种好的流程设计总会给开发者和架构设计者带来一些思想上的火花。
HBASE中的每一张表,就是所谓的BigTable。BigTable会存储一系列的行记录,行记录有三个基本类型的定义:Row Key,Time Stamp,Column。Row Key是行在BigTable中的唯一标识,Time Stamp是每次数据操作对应关联的时间戳,可以看作类似于SVN的版本,Column定义为:<family>:<label>,通过这两部分可以唯一的指定一个数据的存储列,family的定义和修改需要对HBASE作类似于DB的DDL操作,而对于label的使用,则不需要定义直接可以使用,这也为动态定制列提供了一种手段。family另一个作用其实在于物理存储优化读写操作,同family的数据物理上保存的会比较临近,因此在业务设计的过程中可以利用这个特性。
2、连接hbase的常见接口
连接HBase主要使用了HBase以下几个重要概念:
HBaseConfiguration: 用于告诉client如何连接,连接到哪个HBase的服务器上。
HTable:代表一个HBase表格。
BatchUpdate:用于表格中一行的更新。包括添加某个列,修改某列的值,删除某列等。
commit:table的一个方法。代表某个BatchUpdate操作可以生效了。类似于数据库中的commit操作。
Cell:table中对应某个(行key, 列值,时间戳)下的单元格值。获取Cell的方法。For example: table.get("myRow", "myColumnFamily:columnQualifier1");
scanner:用于遍历表格。
rowResult:遍历过程当中保存某行信息。
我们在程序中连接并使用Hbase表时,所需要做的一些step如下:
首先,我们使用HBaseConfiguration来获取表的基本信息
接着,我们通过HTable定义好我们需要连接表的表名
然后,我们通过表的row与column来访问表,对应于不同的操作目的有不同的方法:如BatchUpdate、scanner、rowResult等
3、HBase操作示例
HBase是Hadoop中的一个简单数据库。它与Google的Bigtable特别相似,但也存在许多的不同之处。
数据模型
HBase数据库使用了和Bigtable非常相似的数据模型。用户在表格里存储许多数据行。每个数据行都包括一个可排序的关键字,和任意数目的列。表格是稀疏的,所以同一个表格里的行可能有非常不同的列,只要用户喜欢这样做。
列名是“<族名>:<标签>”形式,其中<族名>和<标签>可以是任意字符串。一个表格的<族名>集合(又叫“列族”集合)是固定的,除非你使用管理员权限来改变表格的列族。不过你可以在任何时候添加新的<标签>。HBase在磁盘上按照列族储存数据,所以一个列族里的所有项应该有相同的读/写方式。
写操作是行锁定的,你不能一次锁定多行。所有对行的写操作默认是原子的。
所有数据库更新操作都有时间戳。HBase对每个数据单元,只存储指定个数的最新版本。客户端可以查询“从某个时刻起的最新数据”,或者一次得到所有的数据版本。
概念模型
从概念上,一个表格是一些行的集合,每行包含一个行关键字(和一个可选的时间戳),和一些可能有数据的列(稀疏)。下面的例子很好的说明了问题:
物理模型
在概念上表格是一个稀疏的行/列矩阵,但是在物理上,它们按照列存储。这是我们的一个重要设计考虑。
上面“概念上的”表格在物理上的存储方式如下所示:
请大家注意,在上面的图中,没有存储空的单元格。所以查询时间戳为t8的“content:”将返回null,同样查询时间戳为t9,“anchor:”值为“my.look.ca”的项也返回null。
不过,如果没有指明时间戳,那么应该返回指定列的最新数据值,并且最新的值在表格里也时最先找到的,因为它们是按照时间排序的。所以,查询“contents:”而不指明时间戳,将返回t6时刻的数据;查询“anchor:”的“my.look.ca”而不指明时间戳,将返回t8时刻的数据。