[原]初识HBase

周攀 17/08/07 09:38:13

HBase是一个开源的,分布式的,多版本的,面向列的存储模型。

面向列:简单来说,就是指在存储数据库中的数据时,以列为单位来存储,把一列的数据串在一起存储起来,而非把一行的数据作为一个单元存储起来。
HBase的特点:

  • HBase是构建在HDFS上的列式存储系统
  • 基于Google的BigTable模型开发,典型的key/value系统
  • 逻辑上,HBase将数据按照表,行和列进行存储
  • HBase主要靠横向的扩展,通过不断地增加廉价的商用服务器来增加计算和存储能力。

HBase表的特点

  • 大:一个表可以有十几亿行,上百万列
  • 无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,而同一张表中不同的行可以有截然不同的列
  • 面向列:面向列的存储和权限控制,列独立的检索
  • 稀疏:空(null)列不占用存储空间,可以设计的非常稀疏
  • 数据多版本:每个单元的数据有多个版本,自动的分配版本号
  • 类型单一:一切都是字符串,无其他类型

HBase的体系结构

这里写图片描述
HBase服务器体系结构遵从简单的主从服务器架构,由HRegion服务器集群和HMaster服务器构成。

HRegion

当表大小超过设置值,会自动分配不同的域,称为HRegion

HRegion服务器

一般一台机器上面只运行一个HRegion服务器,每一个区段的HRegion只会被一个HRegion服务器维护
HRegion服务器主要由两大部分:HLOG部分和HRegion部分。HLOG用来存储数据日志,采用的是先写日志的方式,即数据来的时候,先会记录进日志里面,后才存入HRegion中。HRegion服务器由多个HRegion组成,而HRegion则是由多个store组成,一个store存储的是同一列族下的数据。每个HRegion都有一个Memstore,作为数据缓冲,当数据发送来的时候,会先写入 Memstore中,等到缓冲区满了之后,再更新到对应的storefile中,store中包含多个storefile,storefile负责实际数据的存储,为HBase的最小单元。

HBase Master服务器

每台HRegion服务器都会与HMaster服务器进行通讯,而HMaster的主要任务就是告诉每个HRegion服务器它需要维护的HRegion。
HMaster主要负责Table和HRegion的管理工作,具体包括:

  1. 管理用户对Table的增删改查
  2. HRegion服务器的负载均衡,调整HRegion的分布
  3. HRegion分裂后,负责新的HRegion的分配
  4. HRegion服务器停机后,负责实效的HRegion服务器上HRegion的迁移

ROOT表和META表

保存元数据的表,我们称之为META表,随着元数据的增长,META表会被分割成几个HRegion,为定位这些HRegion,需要一个表,这个表就称之为ROOT表,ROOT表不能被分割,永远只存在一个,且名称固定。

ZooKeeper

ZooKeeper集群是协调系统,存储的为HBase中ROOT表和META表的位置,并负责监控机器状态,当HMaster出故障后,ZooKpeer负责HMaster的恢复工作。

HBase的常用命令

以一个例子来展示HBase常用操作

Person 表内容如下:

这里写图片描述

  1. 列出当前都有哪些表
$ show

这里写图片描述
2. 创建表

$ create <table name>,<column family>,...
$ create 'person','private data','public data'

这里写图片描述
3. 显示表的详细信息

$ desc/describe <table name>
$ desc 'person'

这里写图片描述
4. 插入数据

$ put <table name>,<row name>,<colfamily : colname>,<value>
$ put 'person','1','private data:age','25'
$ put 'person','1','private data:birthday','08-05'
$ put 'person','1','public data:name','xiaoming'
$ put 'person','1','public data:sex','man'
$ put 'person','2','private data:age','23'
$ put 'person','2','private data:birthday','04-20'
$ put 'person','2','public data:name','limei'
$ put 'person','2','public data:sex','woman'

这里写图片描述
5. 更新数据
同插入数据,直接覆盖原值就可以
6. 显示已存在的数据

$ get <table name>,<row name>
$ get 'person','1'
$ get 'person','2'

这里写图片描述
7. 删除数据

$ delete <table name>,'row name',<colfamily : colname>,timestamp
$ delete all <table name>,'row name'
$ delete 'person','1','public data:name', 1501940429288
$ delete all 'person','1'

这里写图片描述
这里写图片描述
8. 删除表

$ disable <table name> # 先禁用表
$ drop <table name>
$ disable 'person'
$ drop 'person'

这里写图片描述

作者:IT_DREAM_ER 发表于 2017/08/07 09:38:13 原文链接 https://blog.csdn.net/IT_DREAM_ER/article/details/76691415
阅读:336