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 = "…
"com.cnn.www" t5 contents:html = "…"
"com.cnn.www" t3 contents:html = "…
com.example.www t5 contents: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

2.2.2.2 组件

hbase:meta:所有region的信息

1)结构:

Key

  • 格式:([table],[region start key],[region id])

Values

2)存储位置:ZooKeeper中

HMaster:控制者

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

HRegionServer:HBase实际读写者

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

本小节可参考Region Server详解

ZooKeeper:协调者

  • 保证集群中有且只有一个HMaster为Active
  • 存储hbase:meta,即所有Region的位置信息
  • 存储HBase中表格的元数据信息
  • 监控RegionServer状态,将RS的上下线情况汇报给HMaster
  • ZooKeeper集群本身使用一致性协议(PAXOS协议)保证每个节点状态的一致性

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的启动时间)

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个步骤,Google设计BigTable的目的在于它的数据量巨大,多层的schema结构能够存储更多的Region,但是随着而来的就是访问性能的下降。
2)一般公司的数据量没有Google那么大,所以去掉-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 声明

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

时间: 2024-08-01 10:44:30

HBase框架学习之路的相关文章

java框架学习之路——Spring的体系结构

分类: java框架学习 Spring的体系结构 Spring是一个开源的轻量级框架 Spring项目开发流程: 创建项目-->添加必须的类库jar包-->创建源文件编程调用库-->创建bean的配置文件-->运行调试 核心特征: 1.AOP:面向切面编程 2.IOC:控制反转,把对象的创建交给Spring管理,依赖注入DI,对象生成放在了XML定义 3.跨越javaEE三层 Web层:SpringMVC Service层:Spring IOC Dao层:jdbcTemplate

Hadoop学习笔记—15.HBase框架学习(基础知识篇)

HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问.HBase的目标是存储并处理大型的数据.HBase是一个开源的,分布式的,多版本的,面向列的存储模型,它存储的是松散型数据. 一.HBase:BigTable的开源实现 1.1 HBase出现的背景 (1)随着数据规模越来越大,大量业务场景开始考虑数据存储水平扩展,使得存储服务可以增加/删除,而目前的关系型数据库更专注于一台机器. (2)海量数据量存储成为瓶颈,单台机器无法负载大量数据. (3)单台机器IO读

框架学习之路一

学习工作当中用到了那么多的框架,难免会想搞清楚这些框架的底层到底是怎样实现的,借此机会从简单的写起,尝试着去实现一个框架 一,通过解析xml,获取其中的字段,用反射技术调用类中的方法 技术:dom4j,java反射 1,定义一个接口 package com.epro.framework; public interface Ihello { public void sayHello();} 2,实现类 package com.epro.framework; public class HelloJa

Hadoop学习笔记—15.HBase框架学习(基础实践篇)

一.HBase的安装配置 1.1 伪分布模式安装 伪分布模式安装即在一台计算机上部署HBase的各个角色,HMaster.HRegionServer以及ZooKeeper都在一台计算机上来模拟. 首先,准备好HBase的安装包,我这里使用的是HBase-0.94.7的版本,已经上传至百度网盘之中(URL:http://pan.baidu.com/s/1pJ3HTY7) (1)通过FTP将hbase的安装包拷贝到虚拟机hadoop-master中,并执行一系列操作:解压缩.重命名.设置环境变量 ①

c#框架学习之路(一)

对于刚毕业的学生来说,找工作是一件很难的事情,但是我们如何拥有项目经验呢? 刚开始我也不信,可自己根据http://url.cn/TgrIZT注册一下,然后通过这个网站获取了学习卡的用户名和密码之后,真的有200元抵用券到了自己的账户中,所以,我就买了一些课程,自从在北风网学习了一些课程之后,我感觉自己对于提成技能特别高,可能和自己刚刚毕业有关系,在学校每天都是理论知识,没有过多的时间,但是自从在北风网上学习了一些项目的知识之后,尤其和老师们一起做项目,我起初以为只是简单的视频教程,谁知道和培训

java框架学习之路之一

面对日益繁重的工作,我们的时间被老板压缩的快没有啦,但是自己想学新的东西,还不想只学基础知识,那现在应该怎么办呢? 所以,我向大家推荐一个东西,我学了一年多,在这一年多当中,学习了很多的知识.但是让我学到知识最多的知识是从网上买的一些教程,里面什么课程都有,一边工作,一边学习新的知识,让我面对项目不再害怕. 朋友向我推荐了一个好的出处:http://url.cn/TgrIZT,说是200元学习卡免费限量领取,刚开始我也不信,当我注册完之后,我一看,里面全是视频教程,我就买了一些教程,买完才知道,

框架学习之路二

上一章我们使用了xml解析技术和java反射技术实现了一个简单的功能,这一章我们更进一步,模仿mybatis,实现一个sql映射功能 1,安装mysql 2,新建数据库myemployees,并建下表employees 3,创建对应的实体类 package com.epro.domin; import java.util.Date; public class Employee { private int employee_id; private String first_name; privat

微服务框架surging学习之路——序列化

原文:微服务框架surging学习之路--序列化 1.对微服务的理解 之前看到在群里的朋友门都在讨论微服务,看到他们的讨论,我也有了一些自己的理解,所谓微服务就是系统里的每个服务都 可以自由组合.自由组合这个就很厉害了,这样一来,每个服务与服务之间基本的物理 耦合为0,横向扩展整个系统就会非常非常灵活. surging的厉害之处也恰恰是可以做到这些,所以surging 是.net core 里面一个非常不错的微服务框架. 2.surging的序列化方式 2.1 json.Net surging

阿里封神谈hadoop学习之路

阿里封神谈hadoop学习之路 封神 2016-04-14 16:03:51 浏览3283 评论3 发表于: 阿里云E-MapReduce >> 开源大数据周刊 hadoop 学生 spark 摘要: 在大数据时代,要想个性化实现业务的需求,还是得操纵各类的大数据软件,如:hadoop.hive.spark等.笔者(阿里封神)混迹Hadoop圈子多年,经历了云梯1.ODPS等项目,目前base在E-Mapreduce.在这,笔者尽可能梳理下hadoop的学习之路. 引言 当前,越来越多的同学进