一、Hbase简介

HBase(Hadoop Database)是一个开源非关系型分布式数据库,运行于HDFS文件系统之上,可以容错地存储海量稀疏的数据。HBase是一个高可靠高性能面向列可伸缩实时读写的分布式数据库,主要用来存储非结构化和半结构化的松散数据

HBase的目标是处理非常庞大的表,可通过水平扩展的方式,利用廉价计算机集群处理由超过10亿行数据和数百万列元素组成的数据表。

 

划重点:

HBase是基于存储的,主要用来存储非结构化和半结构化的松散数据,适合大数据实时查询;

利用HDFS作为其文件存储系统

利用MapReduce处理 HBase中的海量数据

利用Zookeeper作为其分布式协同服务

 

1.HDFS

(1).HDFS简介

对外部客户机而言,HDFS就像一个传统的分级文件系统。可以创建、删除、移动或重命名文件等。HDFS是Hadoop的核心子项目,是一个可以运行在普通硬件设备上的分布式文件系统,是分布式计算中数据存储和管理的基础,是基于流数据模式访问和处理超大文件的需求而开发的。它所具有的高容错、高可靠性、高可扩展性、高吞吐率等特征为海量数据提供了不怕故障的存储,给超大数据集的应用处理带来了很多便利。

(2).HDFS架构

HDFS由四部分组成,HDFS Client、NameNode、DataNode 和 Secondary NameNode。HDFS是一个主/从(Mater/Slave)体系结构,HDFS集群拥有一个NameNode和一些DataNode。

NameNode:管理文件系统的元数据;DataNode:存储实际的数据;

HDFS Client:就是客户端

1、提供一些命令来管理、访问 HDFS,比如启动或者关闭HDFS。

2、与 DataNode 交互,读取或者写入数据;读取时,要与NameNode交互,获取文件的位置信息;写入HDFS的时候,Client将文件切分成 一个一个的Block,然后进行存储

NameNode:即 Master

1、管理 HDFS 的名称空间。

2、管理数据块(Block)映射信息

3、配置副本策略

4、处理客户端读写请求。

DataNode:就是Slave;NameNode 下达命令,DataNode 执行实际的操作。

1、存储实际的数据块。

2、执行数据块的读/写操作。

Secondary NameNode:并非 NameNode 的热备。当NameNode 挂掉的时候,它并不能马上替换 NameNode 并提供服务。

1、辅助 NameNode,分担其工作量。

2、定期合并 fsimage和fsedits,并推送给NameNode。

3、在紧急情况下,可辅助恢复 NameNode。

 

2.MapReduce

(1).MapReduce简介

Mapreduce 是一个分布式运算程序的编程框架,是用户开发“基于 hadoop 的数据分析应用”的核心框架。主要分为 MapTask 和 ReduceTask 两部分。

Mapreduce 核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个 hadoop 集群上。

(2).为什么需要 MapReduce?

(1) 海量数据在单机上处理因为硬件资源限制,无法胜任。

(2) 一旦将单机版程序扩展到集群来分布式运行,将极大增加程序的复杂度和开发难度。

(3) 引入 MapReduce 框架后,开发人员可以将绝大部分工作集中在业务逻辑的开发上,而将分布式计算中的复杂性交由框架来处理。

(3).基本原理

MapReduce 程序的业务编码分为两个大部分,一部分配置程序的运行信息,一部分 编写该 MapReduce 程序的业务逻辑,并且业务逻辑的 map 阶段和 reduce 阶段的代码分别继承 Mapper 类和 Reducer 类。

MapReduce 是一种并行编程模型,将计算阶段分为两个阶段:Map阶段和Reduce阶段。首先把输入数据源分块,交给多个Map(局部处理)任务去执行,Map任务执行Map函数,根据某种规则对数据分类,写入本地硬盘。然后进入Reduce(汇总)阶段,该阶段由Reduce函数把Map阶段具有相同key值的中间结果收集到相同Reduce结点进行合并处理,并将结果写入本地磁盘。最终结果通过合并Reduce任务的输出得到。

 

3.Zookeeper

(1).Zookeeper简介

ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等,ZooKeeper 的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

官方解释:它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。

简单来说,zookeeper = 文件系统 + 监听通知机制​​​​

文件系统:

Zookeeper 维护一个类似文件系统的数据结构:

每个子目录项如 NameService 都被称作为 znode(目录节点),和文件系统一样,我们能够自由的增加、删除znode,在一个znode下增加、删除子znode,唯一的不同在于znode是可以存储数据的。

有四种类型的znode:

  • PERSISTENT-持久化目录节点

    客户端与zookeeper断开连接后,该节点依旧存在

  • PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点

    客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号

  • EPHEMERAL-临时目录节点

    客户端与zookeeper断开连接后,该节点被删除

  • EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点

    客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号

监听通知机制:

客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。

(2).zookeeper 能做什么

zookeeper功能非常强大,可以实现诸如分布式应用配置管理统一命名服务、状态同步服务集群管理等功能,假设我们的程序是分布式部署在多台机器上,如果我们要改变程序的配置文件,需要逐台机器去修改,非常麻烦,现在把这些配置全部放到zookeeper上去,保存在 zookeeper 的某个目录节点中,然后所有相关应用程序对这个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到 zookeeper 的通知,然后从 zookeeper 获取新的配置信息应用到系统中。

 

HBase 与 Hive 的区别:

1.Hive适合大数据离线查询,而Hbase适合大数据实时查询。

2.Hive一般只要有 Hadoop 便可以工作。而 HBase 则还需要 Zookeeper 的帮助。

3.Hive 可以直接使用 HQL,而HBase本身只提供了 Java 的 API 接口,并不直接支持 SQL 的语句查询。

 

HBase 与 关系型数据库(MySQL) 的区别:

1、数据类型:关系数据库采用关系模型,具有丰富的数据类型和存储方式,HBase则采用了更加简单的数据模型,它把数据存储为未经解释的字符串。

2、数据操作:关系数据库中包含了丰富的操作,其中会涉及复杂的多表连接。HBase操作则不存在复杂的表与表之间的关系,只有简单的插入、查询、删除、清空等,因为HBase在设计上就避免了复杂的表和表之间的关系。

3、存储模式:关系数据库是基于行模式存储的。HBase是基于存储的,每个列族都由几个文件保存,不同列族的文件是分离的。

4、数据索引:关系数据库通常可以针对不同列构建复杂的多个索引,以提高数据访问性能。HBase只有一个索引-行键,通过巧妙的设计,HBase中的所有访问方法,或者通过行键访问,或者通过行键扫描,从而使得整个系统不会慢下来。

5、数据维护:在关系数据库中,更新操作会用最新的当前值去替换记录中原来的旧值,旧值被覆盖后就不会存在。而在HBase中执行更新操作时,并不会删除数据旧的版本,而是生成一个新的版本,旧有的版本仍然保留

6、可伸缩性:关系数据库很难实现横向扩展,纵向扩展的空间也比较有限。相反,HBase和BigTable这些分布式数据库就是为了实现灵活的水平扩展而开发的,能够轻易地通过在集群中增加或者减少硬件数量来实现性能的伸缩。

 

二、Hbase数据模型

HBase以表的形式存储数据。表有行和列组成。列划分为若干个列族(row family)

这是一行,三列的数据,CF1、CF2、CF3是三个不同的列族,在t2时刻CF1下存入列名为q1,值为v1,rowkey为11248112;在t6时刻CF2、CF3下分别存入列名为q2,q3,值为v2,v3,rowkey为11248112;t3时刻没有存入 。

和关系数据库不同的是,这里的空白处是不占用空间的。

1.cell单元格

(1)cell由行和列的坐标交叉决定;

(2)单元格是有版本的;

(3)cell的内容是未解析的字节数组;

(4)cell由{rowkey, column( =<family> +<qualifier>), version} 唯一确定的单元。

(5)cell中的数据是没有类型的,全部是字节码形式存贮。

2.RowKey

(1)唯一标识一行数据,按行检索数据,相当于一级索引

(2) 按照字典顺序排序的,说明数据是有序的

(3)只能存储64k的字节数据,RowKey越短越好

3.列族(Column Family)

(1)HBase表中的每个列都归属于某个列族,列族必须作为表模式(schema)定义的一部分预先给出。如 create ‘tb’, ‘f’;

         列名以列族作为前缀,每个“列族”都可以有多个列(column);如f:a, f:b, 新的列族成员(列)可以随后按需、动态加入;

(2)权限控制、存储以及调优都是在列族层面进行的;

(3)HBase把同一列族里面的数据存储在同一目录下,由几个文件保存。
 

4.时间戳(Timestamp)

(1)在HBase每个cell存储单元对同一份数据可以有多个版本,根据唯一的时间戳来区分每个版本之间的差异,不同版本的数据按照时间倒序排序,最新的数据版本排在最前面。

(2)时间戳的类型是 64位整型,一般由HBase(在数据写入时自动)赋值,此时时间戳是精确到毫秒的当前系统时间。

         时间戳也可以由客户显式赋值,如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。
 

三、Hbase架构

从HBase的架构图上可以看出,HBase中的组件包括 Client、Zookeeper、HMaster、HRegionServer、HRegion、Store、MemStore、StoreFile、HFile、HLog 等;

1.Client 

 (1)HBase 有两张特殊表

   .META.:记录了用户所有表拆分出来的的 Region 映射信息,.META.可以有多个 Regoin

   -ROOT-:记录了.META.表的 Region 信息,-ROOT-只有一个 Region,无论如何不会分裂

(2)Client 访问用户数据前需要首先访问 ZooKeeper,找到-ROOT-表的 Region 所在的位置,

  然后访问-ROOT-表,接着访问.META.表,最后才能找到用户数据的位置去访问,中间需要多次网络操作,不过 client 端会做 cache 缓存。

2.ZooKeeper 

(1)ZooKeeper 为 HBase 提供 Failover 机制,选举 Master避免单点 Master 单点故障问题

(2)存储所有 Region 的寻址入口:-ROOT-表在哪台服务器上。-ROOT-这张表的位置信息

(3)实时监控 RegionServer 的状态,将 RegionServer 的上线和下线信息实时通知给 Master

(4)存储 HBase 的 Schema,包括有哪些 Table,每个 Table 有哪些 Column Family

3.Master 

(1)为 RegionServer 分配 Region

(2)负责 RegionServer 的负载均衡

(3)发现失效的 RegionServer 并重新分配其上的 Region

(4)HDFS 上的垃圾文件(HBase)回收

(5)处理 Schema 更新请求(表的创建,删除,修改,列簇的增加等等)

4.RegionServer 

(1)RegionServer 维护 Master 分配给它的 Region,处理对这些 Region 的 IO 请求

(2)RegionServer 负责 Split 在运行过程中变得过大的 Region,负责 Compact 操作

可以看到,client 访问 HBase 上数据的过程并不需要 master 参与(寻址访问 zookeeper 和 RegioneServer,数据读写访问 RegioneServer),Master 仅仅维护者 Table 和 Region 的元数据信息,负载很低。.META. 存的是所有的 Region 的位置信息,那么 RegioneServer 当中 Region 在进行分裂之后 的新产生的 Region,是由 Master 来决定发到哪个 RegioneServer,这就意味着,只有 Master 知道 new Region 的位置信息,所以,由 Master 来管理.META.这个表当中的数据的 CRUD,结合以上两点表明,在没有 Region 分裂的情况,Master 宕机一段时间是可以忍受的。

5.HRegion

table 在行的方向上分隔为多个Region。Region是HBase中分布式存储和负载均衡的最小单元,即不同的region可以分别在不同的Region Server上,但同一个Region是不会拆分到多个server上。Region按大小分隔,每个表一般是只有一个region。随着数据不断插入表,region不断增大,当region的某个列族达到一个阈值时就会分成两个新的region。每个region由以下信息标识:< 表名,startRowkey,创建时间>,由目录表(-ROOT-和.META.)记录该region的endRowkey。

6.Store

每一个region由一个或多个store组成,至少是一个store,hbase会把一起访问的数据放在一个store里面,即为每个 ColumnFamily(列族)建一个store,如果有几个ColumnFamily,也就有几个Store。

一个Store 由一个 memStore 和 0 或者 多个StoreFile 组成。 HBase以store的大小来判断是否需要切分region。

7.MemStore

memStore 是放在内存里的。保存修改的数据即keyValues。当memStore的大小达到一个阀值(默认128MB)时,memStore会被flush到文 件,即生成一个快照。目前hbase 会有一个线程来负责memStore的flush操作。

8.StoreFile

memStore内存中的数据写到文件后就是StoreFileStoreFile底层是以HFile的格式保存。当storefile文件的数量增长到一定阈值后,系统会进行合并(minor、major compaction),在合并过程中会进行版本合并和删除工作(majar),形成更大的storefile。

9.HFile

 HBase中KeyValue数据的存储格式,HFile是Hadoop的 二进制格式文件,实际上StoreFile就是对Hfile做了轻量级包装,即StoreFile底层就是HFile。

10.HLog

HLog(WAL log):WAL意为write ahead log,用来做灾难恢复使用,HLog记录数据的所有变更,一旦region server 宕机,就可以从log中进行恢复。HLog文件就是一个普通的Hadoop Sequence File, Sequence File的value是key时HLogKey对象,其中记录了写入数据的归属信息,除了table和region名字外,还同时包括sequence number和timestamp,timestamp是写入时间,sequence number的起始值为0,或者是最近一次存入文件系统中的sequence number。Sequence File的value是HBase的KeyValue对象,即对应HFile中的KeyValue。

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐