(一) hbase 基础 

1. 什么是 hbase

一个分布式的、面向列的开源数据库,该技术来源于 fay chang 所写

的 google 论文”Bigtable:一个结构化数据的分布式存储系统”

HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力,HBase 是 Apache

的 Hadoop 项目的子项目

HBase 不同于一般的关系数据库,它是一个适合于非结构化数存储的

数据库,另一个不同的是 HBase 是基于列而不是基于行

2. hbase 的特点

面向列 ž

多版本 ž

稀疏性 ž

扩展性 ž

高可靠性 ž

高性能ž

3. hbase 的作用

存储大量数据集结果并提供低延时的查询

4. HBase 跟 hive 有什么区别?

Hive 的定位是数据仓库,虽然也有增删改查,但其删改查对应的是整

张表而不是单行数据,查询的延迟较高。其本质是更加方便的使用 mr 的威

力来进行离线分析的一个数据分析工具。

HBase 的定位是 hadoop 的数据库,是一个典型的 Nosql,所以 HBase

是用来在大量数据中进行低延迟的随机查询的。

(二) NoSql

1. 什么是 nosql

非关系型数据库,NoSQL 数据库的出现,弥补了关系数据(比如 MySQL)

在某些方面的不足,在某些方面能极大的节省开发成本和维护成本

2. 常见的 nosql 和 sql

3. nosql

非关系型数据库——列存储(HBase)

非关系型数据库——文档型存储(MongoDb)

非关系型数据库——内存式存储(redis) KV

非关系型数据库——图形模型(Graph)

➢ sql

mysql

SQLserver

Oracle

4. NoSql 与 sql 的区别

◼ 概念

SQL (Structured Query Language) 数据库,指关系型数据库。主要代

表:SQL Server,Oracle,MySQL(开源),PostgreSQL(开源)。

NoSQL(Not Only SQL)泛指非关系型数据库。主要代表:MongoDB,Redis,

CouchDB。1809——RH

◼ 区别

1) 存储方式

◆ SQL 存储在特定结构的表中

◆ NoSQL 存储方式较为灵活

2) 表/数据集合的数据的关系

◆ 在 SQL 中,必须定义好表和字段结构后才能添加数据

◆ 在 NoSQL 中,数据可以在任何时候任何地方添加,不需要先

定义表

3) 外部数据存储

4) SQL 中的 JOIN 查询

5) 数据耦合性

◆ SQL 中不允许删除已经被使用的外部数据

◆ NoSQL 中则没有这种强耦合的概念,可以随时删除任何数据。

6) 事务

◆ SQL 中如果多张表数据需要同批次被更新,即如果其中一张表

更新失败的话其他表也不能更新成功

◆ NoSQL 中没有事务这个概念,每一个数据集的操作都是原子级

的。

5. hbase_shell 语法

基本操作

◆ -- 创建命名空间

-- 格式:create_namespace '命名空间'

create_namespace 'ps'

◆ -- 创建表

-- 格式:create '命名空间:表名','列族 1','列族 2','列族 3'

create 'ps:stu','info','rela','major'

◆ -- 添加数据

-- 格式:put '命名空间:表名','行键','列族:列','值'

/*查看数据*/

◆ 查看整张表的数据

scan '命名空间:表名'

◆ 查看某一个列族的数据

scan '命名空间:表名',{COLUMNS => ['列族名']}

◆ 查看某个列的值

scan '命名空间:表名',{COLUMNS => ['列族名:列限定符']}

组合使用

◆ scan '命名空间:表名',{COLUMNS => ['列族名:列限定符

','列族名']}

◆ 查看某个值

get '命名空间:表名','行键'

get '命名空间:表名','行键',{COLUMNS => ['列族名']}

get '命名空间:表名','行键',{COLUMNS => ['列族名:列限定符

','列族名']}1809——RH

◆ 查看一行的多个列族

get '命名空间:表名','行键','列族','列族'

◆ 查看某一个单元数据值

get '命名空间:表名','行键','列族:列限定符','列族:列限定

符'

/*count 统计:*/

◆ 统计表的行数:

count '命名空间:表名'

/*表的启用和禁用*/

◆ 禁用

disable '命名空间:表名'

◆ 启用

enable '命名空间:表名'

◆ 查看是否启用

is_enabled '命名空间:表名'

6. 查询性能

在相同水平的系统设计的前提下,因为 NoSQL 中省略了 JOIN 查询的消耗,

故理论上性能上是优于 SQL 的

(三)

1. 结构化数据和非结构化数据

结构化数据:即行数据,存储在数据库里,可以用二维表结构来逻

辑表达实现的数据

非结构化数据:包括所有格式的办公文档,文本、图片、XML、HTML、

各类报表、图像和音频/视频信息等

2. 如何确定一个单元格

一个单元格是行、列族和列限定符的结合,也就是说,通过这三个值(也

称之为坐标)来唯一确定一个单元格。

二、 HBase 架构

(一) hbase 架构

1. hbase 负载均衡基本单位

hbase 负载均衡的基本单位是 region,region 的本质是以行键排序的连续存储

的区间,它的负载均衡是自动的,region 的默认大小是 10GB1809——RH

2. HRRegionServer 意外终止后怎么处理

1) HMaser 通过 zookeeper 感知到 HRegionServer 失效,HMaster 首先处理遗留的 HLog

文件

2) 将其中不同的 Region 的 Log 数据进行拆分,分别放到相应的 region 目录下

3) 然后再将失效的 region 重新分配,领取到这些 region 的 HRegionServer 在

LoadRegion 的过程中会发现有历史 HLog 需要处理,加些会 ReplayHLog 中的数据到

Memstore 中,然后 Flush 到 StoreFiles,完成数据恢复

3. hfile 是什么文件

是一个二进制文件,是 hbase 最底层的数据存储文件,每个列族的 HFile 都是独立管理

(二) hbase 读写删流程 

读流程

通过 BlockCache 缓存技术,它将经常读取的文件缓存至 BlockCache,避免硬盘读,

Block 是从硬盘完成一次数据读取的重要单位。

从 HBase 中读出一行,首先会检查 MemStore 等待修改的队列,然后检查 BlockCache

包含该行的 Block 是否最近被访问过,最后访问硬盘上的对应 HFile

写流程

执行写入时会写到两个地方,(write-ahead log,也称 HLog)和

MemStore。这是默认操作,目的是保证数据持久化,只有这两个地方的

变化信息都写入并确认后,才认为写动作完成。

MemStore 是内存里的写入缓存区,当 MemStore 填满后,其中的数据

会刷写到硬盘,生成一个 HFile,HFile 是 HBase 使用的底层数据存储格

式。HFile 对应于列族,一个列族可以有多个 HFile,但一个 HFile 不能

存储多个列族的数据,在集群的每个节点上,每个列族有一个 MemStore

WAL 实现了 HBase 的容错机制,它在写动作完成之前先写入 WAL,

HBase 集群中每台服务器维护一个 WAL 来记录发生的变化,直到 WAL 新

记录成功写入后,写动作才被认为成功完成。这样可以保证 HBase 和支

撑它的文件系统满足持久性。

如果 HBase 服务器宕机,可以通过 WAL 来恢复,不需要手动执行

删流程

HBase 不会立即删除内容,只是给记录打上删除的标记,在进行大合

并的时候,这些被标记的记录才会被删除,这也是唯一一次机会

(三)

rowkey

1. rowkey 设计原则

长度原则:避免因 rowkey 过大而导致 HFile 的存储效率低下及内存有效利用率和

检索效率变低

唯一原则:按照字典顺序排序存储,将经常读取的数据存储到一块,将最近可能会

被访问的数据放到一块

散列原则:通过 row 或时间戳,提高数据均衡分布,避免热点 问题

2. rowkey 不超过 16 字节原因 ž

rowkey 过长影响 HFile 存储效率 ž

降低检索效率 ž

利用了操作系统的最佳特性