HBase 框架学习之路

1 背景知识

1.1 解决问题

缓解HDFS不支持单条记录的长足搜索和更新的问题。

1.2 适用情状

  • 存在巨大条记下的数据库,唯有千万或者百万条记下使用RDBMS越发合适
  • 保障您的施用不须求利用RDBMS的高档特性(第二索引,事务机制,高级查询语言等)
  • 足足的硬件配备,即节点数,HDFS在简单5个节点时并不会展现得很好,HBase也设有一样景况。

2 设计理念

2.1 概述

2.1.1 简介

  • 应用Java语言开发的NoSQL类型的分布式数据库
  • 不帮助RDBMS的片段高等特性,如工作机制,第二索引,高级查询语言等
  • 辅助线性和模块化扩充,可以经过在商用机器上伸张RegionServer来线性进步性能

2.1.2 HBase特性:

  • 强读写一致性:适合高速计数聚合操作
  • 电动切分数据:分布式存储数据,随着数据增加进行机动切片
  • RegionServer自动失效备援
  • 与HDFS集成
  • 支撑MapReduce执行大规模并行操作
  • 提供Java Client API
  • 提供Thrift/REST API
  • 本着大容量查询优化的块缓存和Bloom Fliter
  • 可视化管理界面

2.1.3 劣势

  • WAL的重新履行进程迟滞
  • 故障苏醒缓慢且复杂
  • 主压缩会引起 I/O台风(巨量的I/O操作)

2.2 设计架构

2.2.1 基础概念

概念 中文 解释 备注 举例
Table 由多行组成
Row 由一个Key和一个或者多列组成
Column 由列族和列限定符组成 列族:列限定符 ;行与行之间的列可以相差很多
Column Family 列族 物理上存储多个列;为提高性能设计的; 表格创建时需要置顶 content
Column Qualifier 列限定符 列族中数据的索引 表格创建时不需要指定,可以在任何时候添加 content:html
Cell 单元 由行、列族、列限定符、值和代表版本的时间戳组成
TimeStamp 时间戳 用来表示数据的版本 可以使用系统时间也可以自己指定

2.2.1.2 例子本例子取自官方文档

Row Key Time Stamp ColumnFamily contents ColumnFamily anchor ColumnFamily people
"com.cnn.www" t9 anchor:cnnsi.com = "CNN"
"com.cnn.www" t8 anchor:my.look.ca = "CNN.com"
"com.cnn.www" t6 contents:html = "<html>…​
"com.cnn.www" t5 contents:html = "<html>…​"
"com.cnn.www" t3 contents:html = "<html>…​
com.example.www t5 contents:html: "<html>…" people:author: "John Doe"

说明

  1. 表格格式不是绝无仅有和最精确的表明形式,还是可以够用Json格式来抒发
  2. 报表中的空白单元不会占用物理存储空间,只是概念上存在

2.2.1.3 操作

操作 API 注意点 与版本的关系
Get Table.get 返回指定行的属性;Scan的第一行 若没有指定版本,则返回版本值最大(但可能不是最新的)的数据;可以通过设置MaxVersion的值修改返回的数据条数
Scan Table.scan 返回满足条件的多行 同上
Put Table.put Key存在则更新Key不在则插入;通过 Table.put (写缓存) 或者Table.batch (没有写缓存) 默认使用系统时间;只要key、column和version相同就可以实现覆盖;插入时可以指定版本
Delete Table.delete 1.删除指定列;2.删除列的所有版本;3.删除特定列族的所有列 1. 删除操作不会立刻执行,而是给该数据设置墓碑标签,在空间清理的时候再执行死亡数据和墓碑的清除工作;2.通过在 hbase-site.xml.中hbase.hstore.time.to.purge.deletes属性来设置TTL(生存时间)

说明

  1. 本子数的最大值和最小值是足以指定的,并且会影响操作
  2. 本子(时间戳)是用来管控数据的现有时间的,最好不用手动设置

2.2.1.4 局限

1)Delete操作会影响Put操作:原因在于Delete操作并不是即时实施,而是给已故多少设置墓碑标签,那么一旦当你执行了一个Delete版本低于等于T的操作,而后有插入Put了一个版本为T的数码,此时新Put的数额也会被打上标签,那么会在系统的下三回清理工作准将打上标签的多寡总体清理掉,执行查询时则会取得不到新Put的数据,若是你不手动设置版本的话,版本选用系统默许时间,则不会现出那种景况。

2)清理工作会影响查询:创造几个版本为t1,t2,t3的单元,并且安装最大版本数为2.所以当大家查询所有版本时,只会重回t2和t3。可是当您剔除版本t2和t3的时候,版本t1会再一次出现。显著,一旦紧要精简办事运行之后,那样的行事就不会再出新。

翻看越来越多关于数据模型的音信

2.2.2 架构

2.2.2.1 架构特点

1)主从架构
2)有几个零部件:

组件名称 组件主要功能
HMaster 负责Region的分配和DDL操作(创建,删除表)
HRegionServer RegionServer负责数据的读写;和客户端通讯
ZooKeeper 维持集群的活动状态

3)底层储存是HDFS

HBase架构:图片来源Map-R网站

2.2.2.2 组件

hbase:meta:所有region的信息

1)结构:

Key
  • 格式:([table],[region start key],[region id])
Values
  • info:regioninfo (序列化HRegionInfo实例)
  • info:server (包含此Region的RegionServer的server:端口)
  • info:serverstartcode (包括此Region的RegionServer的启动时间)

hbase:meta结构图,图片来源于Map-R

2)存储地方:ZooKeeper中

HMaster:控制者

  • 分红Region:启动时分配,失效RegionServer上Region的再分配,Region切分时分配
  • 监察集群中的所有RegionServer,落成其负载均衡
  • DDL:Data Definition Language(表格的创导、删除和换代-列族的换代)
  • 管制namespace和table的元数据
  • 权限管理(ACL)
  • HDFS上的垃圾文件回收

HMaster的功效:图片来自Map-R网站

HRegionServer:HBase实际读写者

  • 响应client的读写请求,举行I/O操作(直接绕过HMaster)
  • 与HDFS交互,管理table数据
  • 当Region的分寸到达阀值时切分Region

HRegionServer:图片来自Map-R网站

本小节可参照Region Server详解

ZooKeeper:协调者

  • 担保集群中有且惟有一个HMaster为Active
  • 储存hbase:meta,即所有Region的地方音讯
  • 仓储HBase中表格的元数据新闻
  • 监控RegionServer状态,将RS的上下线情状汇报给HMaster
  • ZooKeeper集群本身使用一致性协议(PAXOS协议)有限支持每个节点状态的一致性

ZooKeeper,图片来自Map-R

Region:Region是HBase数据存储和保管的基本单位

本小节可参照Region详解

2.3 相关流程

2.3.1 第一次读写流程

本小节可参考Region
Server详解
中的首次读写流程

2.3.2 写流程

本小节可参考Region
Server详解
中的写流程

2.3.2 读流程

本小节可参照Region
Server详解
中的读流程

2.4 相关机制

2.4.1 Compaction机制(压缩合并)

2.4.1.1 次压缩

本小节可参照Region
Server详解
中的次缩减部分

2.4.1.2 主压缩

本小节可参看Region
Server详解
中的主压缩部分

2.4.2 WAL Replay机制

本小节可参看Region
Server详解
中的WAL Replay

2.5 版本更新内容

2.5.1 .META表 =>hbase:meta

2.5.1.1 -ROOT-和.META

在0.96.x从前是存在-ROOT-和.META八个表格来维系region的元数据

1)结构:
Key

• .META. region key (.META.,,1)

Values

• info:regioninfo (hbase:meta的系列化实例)
• info:server (存储 hbase:meta的RegionServer的server:port)
• info:serverstartcode (存储 hbase:meta的RegionServer的启航时间)

-ROOT-与.META

2)读取region地方音信的流程
  1. 从ZooKeeper中读取-ROOT- Table所在HRegionServer
  2. 从该HRegionServer中依据请求的TableName,RowKey读取.META.
    Table所在HRegionServer
  3. 从该HRegionServer中读取.META.
    Table的情节而获得此次请求须求拜访的HRegion所在的职分
  4. 走访该HRegionSever获取请求的多寡

2.5.1.2 hbase:meta

本小节可参看2.2.2.2 组件中的hbase:meta和2.3
相关流程中的第一次读写流程展开相比

2.5.1.3 升级的目的

1)0.96.x版本从前是参考Goole的BigTable设计的,从读取数据请求发起到实在读取到数量要经过4个步骤,谷歌设计BigTable的目的在于它的数据量巨大,多层的schema结构可以存储更加多的Region,不过随着而来的就是造访性能的狂跌。
2)一般公司的数据量没有谷歌那么大,所以去掉-ROOT-表,留下.META(hbase:meta)表,升高Region的深浅,不仅可以满意存储必要,而且访问性能得到提升。

2.5.2 HLog =>WAL

  • 0.94.x 事先HBase中的WAL已毕称为HLog,存储在/hbase/.logs/目录下
  • 0.94.x以后更名为WAL,存储在/hbase/WALs/目录下

2.6 跟别的框架的互换

待续…

2.7 性能调优

待续…

2.8 高级特性

待续…

3 项目实战

3.1 入门指南

3.1.1 环境搭建

本小节可参考HBase安插入门指南

3.1.2 入门程序

本小节可参看HBase Shell
练习
HBase Java API
练习
使用MapReduce操作HBase

3.2 技术难题

待续…

3.3 开发中遇见的题目

待续…

3.4 应用

3.4.1 OpenTSDB开发

待续…

4 声明

待续部分将会前期不定期更新,敬请期待。

参考小说:

Apache HBase Reference
Guide

An In-Depth Look at the HBase
Architecture

网站地图xml地图