欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

HBase学习(一):认识HBase

程序员文章站 2022-04-25 22:12:05
一.大数据发展背景 现今是数据飞速膨胀的大数据时代,大数据强调3V特征,即Volume(量级)、Varity(种类)和Velocity(速度)。 ·Volume(量级):TB到ZB。 ·Varity(种类):结构化到结构化和非结构化。 ·Velocity(速度):批量数据到流数据处理。 据统计全球8 ......

一.大数据发展背景

现今是数据飞速膨胀的大数据时代,大数据强调3V特征,即Volume(量级)、Varity(种类)和Velocity(速度)。

HBase学习(一):认识HBase

 

  ·Volume(量级):TB到ZB。

  ·Varity(种类):结构化到结构化和非结构化。

  ·Velocity(速度):批量数据到流数据处理。

据统计全球80%的数据是非结构化的或者半结构化的,剩下的才是传统的结构化数据。传统关系型数据库处理能力有限。HBase的出现弥补了Hadoop只能离线批处理的不足,同时能够存储小文件,提供海量数据的随机检索。

 

二.NoSQL

NoSQL,是Not only SQL的缩写,泛指非关系型的数据库。与关系型数据库相比,NoSQL存在许多显著的不同点,其中最重要的是NoSQL不使用SQL作为查询语言。
其数据存储可以不需要固定的表模式,也通常会避免使用SQL的JOIN操作,一般又都具备水平可扩展的特性。NoSQL的实现具有两个特征:使用硬盘和把随机存储器作存储载体。

1.传统关系型数据库的缺陷

(1)高并发读写的瓶颈关系型数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写数据请求,硬盘I/O却无法承受。

例如,人人网的实时统计在线用户状态,记录热门帖子的点击次数,投票计数等,都是相对高并发写请求的需求。
(2)可扩展性的限制
对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移,而不能通过横向添加节点的方式实现无缝扩展。
(3)事务一致性的负面影响
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。保证数据库一致性是指当事务完成时,必须使所有数据都具有一致的状态。在关系型数据库中,所有的规则必须应用到事务的修改上,以便维护所有数据的完整性,这随之而来的是性能的大幅度下降。因此数据库事务管理成了高负载下的一个沉重负担。
(4)复杂SQL查询的弱化
任何大数据量的Web系统都非常忌讳几个大表间的关联查询,以及复杂的数据分析类型的SQL查询,更多的情况往往只是单表的主键查询,以及单表的简单条件分页查询,SQL的功能被极大地弱化了,所以这部分功能不能得到充分发挥。


2.NoSQL数据库的优势
(1)扩展性强
NoSQL数据库种类繁多,但是一个共同的特点就是去掉关系型数据库的关系特性,若数据之间是弱关系,则非常容易扩展。例如,HBase、Cassandra等系统的水平扩展性能非常优越,非常容易实现支撑数据从TB到PB级别的过渡。
(2)并发性能好
NoSQL数据库具有非常良好的读写性能,这得益于它的弱关系性,数据库的结构简单。一般MySQL使用QueryCache,这是一种大粒度的Cache,而NoSQL的Cache是记录级的,是一种细粒度的Cache,
(3)数据模型灵活
NoSQL无须事先为要存储的数据建立字段,随时可以存储自定义的数据格式。NoSQL允许使用者随时随地添加字段,并且字段类型可以是任意格式。Hadoop最适合的应用场景是离线批量处理数据,其离线分析的效率非常高,HBase的列式存储的特性支撑它实时随机读取、基于KEY的特殊访问需求。

 

三.HBase是什么
HBase(Hadoop Database)是一个高可靠、高性能、面向列、可伸缩的分布式数据库,利用HBase技术可在廉价PC上搭建起大规模结构化存储集群。HBase参考Google的BigTable建模,使用类似GFS的HDFS作为底层文件存储系统,在其上可以运行MapReduce批量处理数据,使用ZooKeeper作为协同服务组件。HBase的整个项目使用Java语言实现,HBase还是一种非关系型数据库,即NoSQL数据库。发行版本中偶数版本是稳定发布版,而奇数版本都是开发版,基本不对外发布,存在0.94、0.96、0.98三个大版本。其中stable文件夹包含了最新的稳定发布版本。与Hadoop的关系,HBase严重依赖Hadoop的HDFS组件,HBase使用HDFS作为底层存储系统。Hadoop的组件之一MapReduce可以直接访问HBase,但是,这不是必需的,因为HBase中最重要的访问方式是原生JavaAPI,而不是MapReduce这样的批量操作方式。

HBase学习(一):认识HBase

 

HBase的特性
HBase作为一个典型的NoSQL数据库,可以通过行键(Rowkey)检索数据仅支持单行事务,主要用于存储非结构化和半结构化的松散数据。与Hadoop相同,HBase设计目标主要依靠横向扩展,通过不断增加廉价的商用服务器来增加计算和存储能力。HBase具备的一些非常显著的特点:

1.容量巨大
HBase的单表可以有百亿行、百万列,数据矩阵横向和纵向两个维度所支持的数据量级都非常具有弹性。
传统的关系型数据库,如Oracle和MySQL等,如果数据记录在亿级别,查询和写入的性能都会呈指数级下降,所以更大的数据量级对传统数据库来讲是一种灾难。
而HBase对于存储百亿、千亿甚至更多的数据都不存在任何问题。更加多的列:千万和亿级别,这种非常特殊的应用场景,并不是说HBase不支持,而是这种情况下访问单个Rowkey可能造成访问超时,如果限定某个列则不会出现这种问题。

2.面向列
HBase是面向列的存储和权限控制,并支持列独立检索,列式存储数据库。
列式存储不同于传统的关系型数据库,其数据在表中是按某列存储的,这样在查询只需要少数几个字段的时候,能大大减少读取的数据量,比如一个字段的数据聚集存储,那就更容易为这种聚集存储设计更好的压缩和解压算法。

传统行式数据库的特性如下:
  ·数据是按行存储的。
  ·没有索引的查询使用I/O。
  ·建立索引和物化视图需要花费的时间和资源。
  ·面对查询需求,数据库必须被膨胀才能满足需求。

列式数据库的特性如下:
  ·数据按列存储,即每一列单独存放。
  ·数据即索引。
  ·只访问查询涉及的列,可以降低系统I/O。
  ·每一列由一个线索来处理,即查询的并发处理性能高。
  ·数据类型一致,数据特征相似,可以高效压缩。

列式存储不但解决了数据稀疏性问题,最大程度上节省存储开销,而且在查询发生时,仅检索查询涉及的列,能够降低磁盘I/O

3.稀疏性
在大多数情况下,采用传统行式存储的数据往往是稀疏的,即存在为空(NULL)的列,而这些列都是占用存储空间的,这就造成存储空间的浪费。对于HBase来讲,为空的列并不占用存储空间,因此,表可以设计得非常稀疏。

4.扩展性
HBase底层文件存储依赖HDFS,从“基因”上决定了其具备可扩展性。
同时,HBase的Region和RegionServer的概念对应的数据可以分区,分区后数据可以位于不同的机器上,所以在HBase核心架构层面也具备可扩展性。HBase的扩展性是热扩展,在不停止现有服务的前提下,可以随时添加或者减少节点。

5.高可靠性
HBase提供WAL和Replication机制。前者保证了数据写入时不会因集群异常而导致写入数据的丢失;后者保证了在集群出现严重问题时,数据不会发生丢失或者损坏。而且HBase底层使用HDFS,HDFS本身的副本机制很大程度上保证了HBase的高可靠性。同时,协调服务的ZooKeeper组件是经过工业验证的,具备高可用性和高可靠性。

6.高性能
底层的LSM数据结构和Rowkey有序排列等架构上的独特设计,使得HBase具备非常高的写入性能。Region切分、主键索引和缓存机制使得HBase在海量数据下具备一定的随机读取性能,该性能针对Rowkey的查询能够达到毫秒级别。

 

四.HBase的核心功能模块

Hadoop框架包含两个核心组件:HDFSMapReduce,其中HDFS是文件存储系统,负责数据存储MapReduce是计算框架,负责数据计算
HBase数据库的核心组件共有4个,它们分别是:客户端Client协调服务模块ZooKeeper主节点HMasterRegion节点RegionServer

HBase学习(一):认识HBase

 

(1)客户端Client
客户端Client是整个HBase系统的入口。使用者直接通过客户端操作HBase。客户端使用HBase的RPC机制与HMaster和RegionServer进行通信。对于管理类操作,Client与HMaster进行RPC通信;对于数据读写类操作,Client与RegionServer进行RPC交互。
这里客户端可以是多个,并不限定是原生Java接口,还有Thrift、Avro、Rest等客户端模式,甚至MapReduce也可以算作一种客户端。

(2)协调服务组件ZooKeeper
ZooKeeperQuorum(队列)负责管理HBase中多HMaster的选举、服务器之间状态同步等。
HBase中ZooKeeper实例负责的协调工作有:存储HBase元数据信息实时监控RegionServer存储所有Region的寻址入口,当然还有最常见的功能就是保证HBase集群中只有一个HMaster节点

(3)主节点HMaster

HMaster没有单点问题,在HBase中可以启动多个HMaster,通过ZooKeeper的Master选举机制保证总有一个Master正常运行并提供服务,其他HMaster作为备选时刻准备(当目前HMaster出现问题时)提供服务。
HMaster主要负责Table和Region的管理工作:
  ·管理用户对Table的增、删、改、查操作。
  ·管理RegionServer的负载均衡,调整Region分布。
  ·在Region分裂后,负责新Region的分配。
  ·在RegionServer死机后,负责失效RegionServer上的Region迁移。

(4)Region节点HRegionServer

HRegionServer主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBase中最核心的模块。HRegionServer内部管理了一系列HRegion对象,每个HRegion对应了Table中的一个RegionHRegion由多个HStore组成,每个HStore对应了Table中的一个ColumnFamily的存储。可以看出每个ColumnFamily其实就是一个集中的存储单元,因此最好将具备共同I/O特性的列放在一个ColumnFamily中,这样能保证读写的高效性。
HStore存储是HBase存储的核心,由两部分组成:MemStore和StoreFile。

MemStore是Sorted Memory Buffer,用户写入的数据首先会放入MemStore中,当MemStore满了以后会缓冲(flush)成一个StoreFile(底层实现是HFile),当StoreFile文件数量增长到一定阈值,会触发Compact操作,将多个StoreFiles合并成一个StoreFile,在合并过程中会进行版本合并和数据删除,因此可以看出HBase其实只有增加数据,所有的更新和删除操作都是在后续的Compact过程中进行的,这使得用户的写操作只要进入内存中就可以立即返回,保证了HBaseI/O的高性能。StoreFiles在触发Compact操作后,会逐步形成越来越大的StoreFile,当单个StoreFile大小超过一定阈值后,会触发Split操作,同时把当前Region分裂成2个Region,父Region会下线,新分裂的2个子个子Region会被HMaster分配到相应的HRegionServer上,使得原先1个Region的压力得以分流到2个Region上。

每个HRegionServer中都有一个HLog对象,HLog是一个实现WriteAheadLog的类,在每次用户操作写入MemStore的同时,也会写一份数据到HLog文件中,HLog文件定期会滚动出新,并删除旧的文件(已持久化到StoreFile中的数据)。在HRegionServer意外终止后HMaster会通过ZooKeeper感知到首先处理遗留的HLog文件将其中不同Region的Log数据进行拆分,分别放到相应Region的目录下,然后再将失效的Region重新分配,领取到这些Region的HRegionServer在加载Region的过程中,会发现有历史HLog需要处理,因此会将HLog中的数据回放到MemStore中,然后缓冲(flush)到StoreFiles,完成数据恢复

 

 

本博客所有内容来源于网络、书籍、和各类手册。

 

内容均为非盈利,旨为方便查询、总结备份、开源分享。

 

部分转载内容均有注明出处,如有侵权请告知,马上删除。