1.Hbase的表结构
Hbase是面向列的非关系数据库,其数据模型如下所示:
一张表是由多行记录组成的,而每行记录是由多个列族组成的,每个列族又是由多个列组成的。
每行的Rowid在Hbase中也叫做RowKey,用来标识行记录,每条记录中都包含着多个列族,列族就如同一个部门,列族下是列,列就如同部门里面的不同职位。在Hbase中,还有一个比较特殊的地方,那就是版本号,也就是时间戳,每条记录的每个列族的列都有好多个版本,默认只显示当前最新的版本号(时间戳)下的数据。由于Hbase并不是关系型数据库,没有update,只有put,所以用时间戳的形式来标识最新的数据,put的数据在Hbase中是已经存储的,则由于put的数据是最新的版本,所以显示的就是put的数据,类似更新,如果put的数据在Hbase中没有存储,则相当于新建数据。
所以Hbase在查找数据的时候会进行三级定位:第一级:RowKey(找到行),第二级:列族+列(找到具体字段),第三级,找到当前字段的时间戳(默认最新版本)。
Hbase这种面向列的数据库的最大好处就是我们可以随时的向数据库中新建字段,不需要重构之前的数据库,不需要改变数据库的结构,比关系型数据库灵活很多,能够应对千变万化的数据。
2.基本操作(shell操作)
在Hbase中,数据的存储都是二进制,并且列族和列都会根据字典顺序排序
$>hbase shell //登录shell终端.
$hbase>help //帮助
$hbase>help 'list_namespace' //查看特定的命令帮助,命名空间就如同关系型数据库中的库
$hbase>list_namespace //列出名字空间(如同数据库)
$hbase>list_namespace_tables 'defalut' //列出名字空间(如同数据库下的表)
$hbase>create_namespace 'ns1' //创建名字空间
$hbase>help 'create'
$hbase>create 'ns1:t1','f1' //创建表,指定空间下,并且指明列族
$hbase>put 'ns1:t1','row1','f1:id',100 //插入数据,指明RowKey,列族:列
$hbase>put 'ns1:t1','row1','f1:name','tom' //
$hbase>get 'ns1:t1','row1' //查询指定RowKey
$hbase>scan 'ns1:t1' //扫描表
$hbase>flush 'ns1:t1' //清理内存数据到磁盘。
$hbase>count 'ns1:t1' //统计函数
$hbase>disable 'ns1:t1' //删除表之前需要禁用表
$hbase>drop 'ns1:t1' //
$hbase>scan 'hbase:meta' //查看元数据表
不论哪一个shell我们首先要做的就是学会使用它自带的帮助文档,help是Hbase的帮助命令,如果想查看某个命令的用法,就用help '命令'查看。
3.元数据表meta
HMaster在Hbase集群启动的时候将存放数据的区域region指定到区域服务器HRegionServer节点上,并且将这些信息写到了一张名为meta的元数据表,这张表就想目录一样,用户在存储或是查找数据的时候通过这张表进行查找比对,找到自己操作所在的HRegionServer的区域region进行操作。
这张表在哪里呢?
$hbase>list_namespace //列出名字空间(如同数据库)
发现有两个名字空间是默认的,default和hbase
我们看一下hbase名字空间下的表
$hbase>list_namespace_tables 'hbase' //列出名字空间(如同数据库下的表)
发现元数据meta表,使用scan来查看一下
$hbase>scan 'hbase:meta' //扫描表
发现我们建的所有表信息,都在这里面,包括在哪台HRegionServer节点上,我们拿出一些基本信息看一下
如上图所示,最左边的 ns2:t2,,1532055628871.c4f8bb62217c308f2844aa5fcd599f69. 是HRegionServer节点分配的一个区域region名。从左边开始ns2:t2是我们建的名字空间ns2以及该名字空间下的表t2,紧接着的逗号标识开始行RowKey,如果一张表没有被切割过,就是默认的逗号,表示这张表没有被切割,是一张完整的表,如果被切割了,则切割处或是在所在区域的开始行RowKey。而c4f8bb62217c308f2844aa5fcd599f69则是HRegionServer节点分配的一个区域region编码,由前面的一串字符串按照MD5加密而来。
区域名所对应的右边column=列族:列记录了这个区域的一些基本信息,包括所在的HRegionServer节点s11:16020,开始行STARTKEY=>,ENDKEY=>,(都是逗号表示这个表没有被切割,从开始到结束)以及区域编码c4f8bb62217c308f2844aa5fcd599f69。有了这些基本信息我们就能够实时的读写了,根据匹配最左边的(例如ns2:t2,开始行RowKey,1532055628871.c4f8bb62217c308f2844aa5fcd599f69.)找到区域所在地HRegionServer节点地址,然后从HRegionServer节点上所对应的区域中查找存储数据。
Hbase既然将数据存储到了HDFS上,那目录结构是什么样子的呢?我们在搭建集群时候,已经配置在了hbse-site.xml中
在我们的HDFS的webui界面查找一下,发现其表数据存储目录结构格式为:hdfs://s10:8020/hbase/data/${名字空间}/${表名}/${区域名称}/${列族名称}/${文件名}