CH5 HBase
HBase 基本工作原理
HBase设计目标和功能特点
- 针对HDFS缺少结构化半结构化数据存储访问能力的缺陷,提供一个分布式数据管理系统,解决大规模的结构化和半结构化数据存储访问问题
- HBase试图提供随机和实时的数据读写访问能力。具有高可扩展性、高可用性、容错处理能力、负载平衡能力、以及实时数据查询能力
- 是Google Big Table的开源实现
- 提供基于列存储模式的大数据表管理能力
RDBMS 实现具有局限性:实现和操作都有局限性
RDBMS也有理论局限性:
- ACID,但是网络分片(Network Partitions)在分布式系统中不可避免系统扩展时性能和可靠性下降
使用NoSQL
- 每行的属性attribution可以不同,模式自由,但是尽量像表
- 能处理BigData
HBase是在HDFS基础上抽象出来的 Column DB,可与MapReduce协同工作,为MapReduce提供数据输入输出,以完成数据的并行化处理
Hbase 数据模型
逻辑数据模型:数据存储逻辑模型与BigTable类似,但实现上有一些不同之处是一个分布式多维表,表中的数据通过一个**行关键字(row key)一个列关键字(column family + column name)一个时间戳(time stamp)**进行索引和查询定位的
物理存储格式
按照列存储的稀疏矩阵,物理存储格式上按照逻辑模型种的行进行分隔,按照列族存储,值为空的列不存,节省空间
基本架构
由一个MasterServer和由一组子表数据区服务器RegionServer构成,分别存储逻辑大表中的部分数据,大表中的底层数据存于HDFS中
也是主从结构 Master Server + Region Server
大表被分为很多个子表(Region) 每个子表存储在一个子表服务器Region Server上,Region 又分成store,store里面又有memSector和StoreFile,一个block size = 64MB,Region达到一定程度会分裂,每个列族对应一个store,写storeFile其实就是在写HDFSFile 是一个东西,并且HBase不用显式写副本,HDFS会自动对HFile 流水复制
每个Store数据块又由存放在内存中的memStore和存放在文件中的StoreFile构成
当客户端需要进行数据更新时,先查到子表服务器,然后向子表提交数据更新请求。提交的数据并不直接存储到磁盘上的数据文件中,而是添加到一个基于内存的子表数据对象memStore中,当memStore中的数据达到一定大小时,系统将自动将数据写入到文件数据块StoreFile中,类似于Lazy Write,每个文件数据块StoreFile最后都写入到底层基于HDFS的文件中
需要查询数据时,子表先查memStore。如果没有,则再查磁盘上的StoreFile。每个StoreFile都有类似B树的结构,允许进行快速的数据查询。StoreFile将定时压缩,多个压缩为一个,两个小的子表可以进行合并,子表大到超过某个指定值时,子表服务器就需要调用HRegion.closeAndSplit(),把它分割为两个新的子表。
HBase主服务器
与BigTable类似,HBase使用主服务器HServer来管理所有子表服务器。主服务器维护所有子表服务器在任何时刻的状态
当一个新的子表服务器注册时,主服务器让新的子表服务器装载子表
若主服务器与子表服务器连接超时,那么子表服务器将自动停止,并重新启动;而主服务器则假定该子表服务器已死机,将其上的数据转移至其它子表服务器,将其上的子表标注为空闲,并在重新启动后另行分配使用
关于元数据:
描述所有子表和子表中数据块的元数据都存放在专门的元数据表中,并存储在特殊的子表中。子表元数据会不断增长,因此会使用多个子表来保存。
所有元数据子表的元数据都保存在根子表中。主服务器会扫描根子表,从而得到所有的元数据子表位置,再进一步扫描这些元数据子表即可获得所寻找子表的位置
HBase 使用三层类似于B+树的结构保存Region位置(索引?)
简言之:三层索引结构: 根子表->用户表的元数据表->用户表
- 第一层,保存zookeeper里面文件,它保存root region位置
- 爹日次,root region是META表第一个Region,里面保存了META表和其他region位置,访问Root Region从而访问META表数据
- META是第三层,是一个特殊表,保存了HBASE所有表的Region位置信息
HBase 基本操作与编程方法
Shell 操作
Create、Describe、Disable、enable、drop、list、scan、put、get、delete、count、status等
create 'student','ID','Description','Course','Home'
第一个是表明,然后后面 注意 每一行的列可以不一样,换言之:列是实例,列簇是模式,列簇要一样
插入数据
put 'students','001','Description:Name','LL'
put 'students','001','Description:Height','LL'
put 'students','001','Course:Chinese','LL'
Disable和enable
- 很多对table的修改都需要表在disable的状态下才能进行
- disable ‘students′将表students的状态更改为disable的时候,HBase会在zookeeper中的table结点下做记录
- 在zookeeper记录下修改该表的同时,还会将表的region全部下线,region为offline状态
- enable的过程和disable相反,会把表的所有region上线,并删除zookeeper下的标志。如果在enable前,META中有region的server信息,那么此时会在该server上将该region 上线;如果没有server的信息,那么此时还要随机选择一台机器作为该region的server
so Region and Server maybe is Separated?
HBase Java编程
-
HBaseConfiguration是每一个hbase client都会使用到的对象,它代表的是HBase配置信息 -
默认的构造方式会尝试从hbase-default.xml和hbase-site.xml中读取配置 -
创建表:通过HBaseAdmin,提供了createTable -
插入数据:HTable通过put方法来插入数据 -
删除表也通过HBaseAdmin来操作,删除表之前首先要disable表。这是一个非常耗时的操作,所以不建议频繁删除表。disableTable和deleteTable分别用来disable和delete表 -
查询:单条查询是通过rowkey在table中查询某一行的数据。HTable提供了get方法来完成单条查询。 批量查询是通过制定一段rowkey的范围来查询。HTable提供了个getScanner方法来完成批量查询 -
切分表:参数hbase.hregion.max.filesize指示在当前ReigonServer上单个Reigon的最大存储空间,单个Region超过该值时,这个Region会被自动split成更小的region 还可以手工split,如果提供tableName,那么会将table所有region进行split ;如果提供region Name,那么只会split这个region -
当然HBase 支持MapReduce编程
HBase 实验
Big-Data-Analysis/Lab1
|