文章部分参考自:https://blog.csdn.net/dataiyangu/article/details/90648981
HBase第一天——HBase入门
自己的话:我愿平东海,身沉心不改;
大海无平期,我心无绝时。
一、HBase简介
1. 什么是 HBase
1.1 HBase的发展历程:
HBase 的原型是 Google 的 BigTable 论文,受到了该论文思想的启发,目前作为 Hadoop
的子项目来开发维护,用于支持结构化的数据存储。
官方网站:http://hbase.apache.org
– 2006 年 Google 发表 BigTable 白皮书
– 2006 年开始开发 HBase
– 2008 年北京成功开奥运会,程序员默默地将 HBase 弄成了 Hadoop 的子项目
– 2010 年 HBase 成为 Apache 顶级项目
– 现在很多公司二次开发出了很多发行版本,你也开始使用了。
1.2 HBase的特性:
HBase 是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用 HBASE 技术可在廉价 PC Server 上搭建起大规模结构化存储集群。
HBase 的目标是存储并处理大型的数据,更具体来说是仅需使用普通的硬件配置,就能
够处理由成千上万的行和列所组成的大型数据。
HBase 是 Google Bigtable 的开源实现,但是也有很多不同之处。比如:Google Bigtable
利用 GFS 作为其文件存储系统,HBase 利用 Hadoop HDFS 作为其文件存储系统;Google
运行 MAPREDUCE 来处理 Bigtable 中的海量数据,HBase 同样利用 Hadoop MapReduce 来处理HBase 中的海量数据;Google Bigtable利用Chubby作为协同服务,HBase利用 Zookeeper作为对应。
2. HBase 特点
2.1 海量存储*
Hbase 适合存储 PB 级别的海量数据,在 PB 级别的数据以及采用廉价 PC 存储的情况下,能在几十到百毫秒内返回数据。这与 Hbase 的极易扩展性息息相关。正式因为 Hbase 良好的扩展性,才为海量数据的存储提供了便利。
2.2 列式存储*
这里的列式存储其实说的是列族存储,Hbase 是根据列族来存储数据的。列族下面可以有非常多的列,列族在创建表的时候就必须指定。
2.3 极易扩展*
Hbase 的扩展性主要体现在两个方面,一个是基于上层处理能力(RegionServer)的扩展,一个是基于存储的扩展(HDFS)。
通过横向添加 RegionSever 的机器,进行水平扩展,提升 Hbase 上层的处理能力,提升 Hbsae服务更多 Region 的能力。
备注:RegionServer 的作用是管理 region、承接业务的访问,这个后面会详细的介绍通过横向添加 Datanode 的机器,进行存储层扩容,提升 Hbase 的数据存储能力和提升后端存储的读写能力。
2.4 高并发*
由于目前大部分使用 Hbase 的架构,都是采用的廉价 PC,因此单个 IO 的延迟其实并不小,一般在几十到上百 ms 之间。这里说的高并发,主要是在并发的情况下,Hbase 的单个IO 延迟下降并不多。能获得高并发、低延迟的服务。
2.5 稀疏
稀疏主要是针对 Hbase 列的灵活性,在列族中,你可以指定任意多的列,在列数据为空
的情况下,是不会占用存储空间的。
3. HBase架构
从图中可以看出 Hbase 是由 Client、Zookeeper、Master、HRegionServer、HDFS 等
几个组件组成,下面来介绍一下几个组件的相关功能:
3.1 Client
Client 包含了访问 Hbase 的接口,另外 Client 还维护了对应的 cache 来加速 Hbase 的访
问,比如 cache 的.META.元数据的信息。
3.2 Zookeeper
HBase 通过 Zookeeper 来做 master 的高可用、RegionServer 的监控、元数据的入口以及
集群配置的维护等工作。具体工作如下:
通过 Zoopkeeper 来保证集群中只有 1 个 master 在运行,如果 master 异常,会通过竞争
机制产生新的 master 提供服务
通过 Zoopkeeper 来监控 RegionServer 的状态,当 RegionSevrer 有异常的时候,通过回
调的形式通知 Master RegionServer 上下线的信息
通过 Zoopkeeper 存储元数据的统一入口地址
3.3 Hmaster
master 节点的主要职责如下:
为 RegionServer 分配 Region
维护整个集群的负载均衡
维护集群的元数据信息
发现失效的 Region,并将失效的 Region 分配到正常的 RegionServer 上 当 RegionSever 失效的时候,协调对应 Hlog 的拆分
3.4 HregionServer
HregionServer 直接对接用户的读写请求,是真正的“干活”的节点。它的功能概括如下:
管理 master 为其分配的 Region
处理来自客户端的读写请求
负责和底层 HDFS 的交互,存储数据到 HDFS
负责 Region 变大以后的拆分
负责 Storefile 的合并工作
3.5 HDFS
HDFS 为 Hbase 提供最终的底层数据存储服务,同时为 HBase 提供高可用(Hlog 存储在
HDFS)的支持,具体功能概括如下:
提供元数据和表数据的底层分布式存储服务
4.HBase 的组成
4.1 HMaster
功能
(1)监控 RegionServer
(2)处理 RegionServer 故障转移
(3)处理元数据的变更
(4)处理 region 的分配或转移
(5)在空闲时间进行数据的负载均衡
(6)通过 Zookeeper 发布自己的位置给客户端
4.2 RegionServer
功能
(1)负责存储 HBase 的实际数据
(2)处理分配给它的 Region
(3)刷新缓存到 HDFS
(4)维护 Hlog
(5)执行压缩
(6)负责处理 Region 分片
4.3 组件
4.3.1.Write-Ahead logs
HBase 的修改记录,当对 HBase 读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值可以设定)。但把数据保存在内存中可能有更高的概率引起数据丢失,为了解决这个问题,数据会先写在一个叫做 Write-Ahead logfile 的文件中,然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。
4.3.2.Region
Hbase 表的分片,HBase 表会根据 RowKey值被切分成不同的 region 存储在 RegionServer中,在一个 RegionServer 中可以有多个不同region。
4.3.3.Store
HFile 存储在 Store 中,一个 Store 对应 HBase表中的一个列族。
4.3.4.MemStore
顾名思义,就是内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在WAL 中之后,RegsionServer 会在内存中存储键值对。
4.3.5.HFile
这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。StoreFile 是以 Hfile的形式存储在 HDFS 的。
二、HBase与Hadoop的关系
1、HDFS
- 为分布式存储提供文件系统
- 针对存储大尺寸的文件进行优化,不需要对HDFS上的文件进行随机读写
- 直接使用文件
- 数据模型不灵活
- 使用文件系统和处理框架
- 优化一次写入,多次读取的方式
2、HBase
- 提供表状的面向列的数据存储
- 针对表状数据的随机读写进行优化
- 使用key-value操作数据
- 提供灵活的数据模型
- 使用表状存储,支持MapReduce,依赖HDFS
- 优化了多次读,以及多次写
三、RDBMS与HBase的对比
1、关系型数据库
结构:
- 数据库以表的形式存在
- 支持FAT、NTFS、EXT、文件系统
- 使用Commit log存储日志
- 参考系统是坐标系统
- 使用主键(PK)
- 支持分区
- 使用行、列、单元格
功能:
- 支持向上扩展
- 使用SQL查询
- 面向行,即每一行都是一个连续单元
- 数据总量依赖于服务器配置
- 具有ACID支持
- 适合结构化数据
- 传统关系型数据库一般都是中心化的
- 支持事务
- 支持Join
2、HBase
结构:
- 数据库以region的形式存在
- 支持HDFS文件系统
- 使用WAL(Write-Ahead Logs)存储日志
- 参考系统是Zookeeper
- 使用行键(row key)
- 支持分片
- 使用行、列、列族和单元格
功能:
- 支持向外扩展
- 使用API和MapReduce来访问HBase表数据
- 面向列,即每一列都是一个连续的单元
- 数据总量不依赖具体某台机器,而取决于机器数量
- HBase不支持ACID(Atomicity、Consistency、Isolation、Durability)
- 适合结构化数据和非结构化数据
- 一般都是分布式的
- HBase不支持事务
- 不支持Join
四、为什么HBase访问很快?
客户端去访问某一条数据的时候,先去内存里面找, MemStore是内存里面的结构化分区,MemStore和内存数据缓冲池,都是内存,只不过这两个东西在内存中的结构区分开了,客户端在访问数据的时候,会先去MemStore里面查看是否有数据,如果有的话直接就返回了,这种情况非常快,不会涉及到磁盘io,第二种情况是客户端去MemStore里面找数据没找到,会去内存缓冲池里面找,这个数据是怎么来的呢?是通过LRU算法,维护的都是最近操作的数据,因为他也是在内存中所以很快,如果没有的话,去region里面读,先读到内存缓冲池中,读完之后直接返回给客户端。如果新读进来内存缓冲池里面没有内存的话,就删除掉之前权重比较小的数据。