要实现操作hbase数据表首先要了解它的原理:
第一部分: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操作示例(待续)