一、先了解什么是NoSQL

1.1、关系型数据库的查询瓶颈

当用户表的数据达到几千万甚至几亿级别的时候,对单条数据的检索将花费数秒甚至达到分钟级别。

高并发的更新(插入、修改、删除)操作。大中型网站的并发操作一般能达到几十乃至几百并发,此时单条数据查询的延时将轻而易举地达到分钟级别

1.2、 CAP定理

分摊读写压力的有效方式是将单个关系型数据库扩展为分布式数据库。但是,随之而来的问题则是很难保证原子性。没有了原子性,事务也无从谈起,关系型数据库也就没有了存在的意义,为了保证原子性,则需要增加很多额外的必要操作,此时一次写操作的性能却面临大幅下降。

  1. Consistency(强一致性):数据更新操作的一致性,所有数据变动都是同步的。
  2. Availability(高可用性):良好的响应性能。
  3. Partition tolerance(高分区容错性):可靠性。

任何分布式系统只可同时满足二点,没法三者兼顾。

1.3、什么是NoSQL

有些数据库在实现性能的同时会牺牲一部分一致性,即数据在更新时,不会立刻同步,而是经过了一段时间才达到一致性。这个特性也称之为最终一致性。泛指非关系型数据库

二、Hbase介绍

2.1、什么是Hbase

HadoopDatabase(Hbase): 是一个高可靠性、高性能、面向列、可伸缩、实时读写的分布式数据库。(HBase是基于hadoop的NoSQL数据库

利用HDFS作为其文件存储系统读写,利用MapReduce来处理海量数据,利用Zookeeper作为其分布式协同服务。提供一个十亿级行、百万级列的表存储,对表中的数据提供实时的随机读写操作

特点是:分布式列式存储,只允许客户端查询时返回时间戳最新的数据!

Hbase的缺点:不支持表的关联操作。只适合单表超千万,上亿,且高并发

2.2、HBase 数据模型

(1)Name Space(命名空间,类似于关系型数据库的database,每个命名空间下有多个表table

命名空间可有可无,如果建表时加了,这个表名字以<Namespace>:<Table>作为区分。HBase两个自带的命名空间,分别是hbase和default,hbase中存放的是HBase内置的表,default表是用户默认使用的命名空间

(2)Table(表)

不同的是,HBase定义表时只需要声明列族即可。

数据属性,比如超时时间(TTL),压缩算法(COMPRESSION)等,都在列族的定义中定义,不需要声明具体的列。写数据时字段可以动态、按需指定。因此,HBase能够轻松应对字段变更的场景

(3)Row(列)

HBase表中的每行数据都由一个RowKey和多个Column(列)组成,一个行包含了多个列。这些列通过列族来分类,行中的数据所属列族只能从该表所定义的列族中选取

(4)RowKey(一行的唯一标识

由用户指定的一串不重复的字符串定义。数据是按照RowKey的字典顺序存储的,并且查询数据时只能根据RowKey进行检索,所以RowKey的设计十分重要。
(如果使用了之前已经定义的RowKey,那么会将之前的数据更新掉!)

(5)Column Family(列族,是多个列的集合

同一个表里的不同列族可以有完全不同的属性配置,但是同一个列族内的所有列都会有相同的属性。列族存在的意义是HBase会把相同列族的列尽量放在同一台机器上

(6)TimeStamp(时间戳,版本号)

标识数据的不同版本(version)。时间戳默认由系统指定,也可以由用户显式指定

(7)Cell(单元格)

一个时间戳(版本)为一个单元格

(8)Region(表的若干行)

Region由RegionServer进程管理

 

2.3、HBase 架构

hbase 高并发 短时查询 hbase并发数_zookeeper

(1)Client

包含访问HBase的接口并维护cache来加快对HBase的访问

(2)Zookeeper

  • 保证任何时候,集群中只有一个活跃master
  • 存贮所有Region的寻址入口。
  • 实时监控Region server的上线和下线信息。并实时通知Master
  • 存储HBase的schema和table元数据
     

(3)Master

  • 为Region server分配region
  • 负责Region server的负载均衡
  • 发现失效的Region server并重新分配其上的region
  • 管理用户对table的增删改操作
     

(4)RegionServer

  • 维护region,处理对这些region的IO请求
  • 负责切分在运行过程中变得过大的region
     

(5)Region(区域)

  • HBase自动把表水平划分成多个区域(region),每个region会保存一个表里面某段连续的数据
  • 每个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阀值的时候,region就会等分会两个新的region(裂变)
  • 当table中的行不断增多,就会有越来越多的region。这样一张完整的表被保存在多个Regionserver 上。

 

HRegion是HBase中分布式存储和负载均衡的最小单元。最小单元就表示不同的HRegion可以分布在不同的 HRegion server上。

HRegion由一个或者多个Store组成,每个store保存一个columns family

每个Strore又由一个memStore和0至多个StoreFile组成

如图:StoreFile以HFile格式保存在HDFS上:

hbase 高并发 短时查询 hbase并发数_hbase 高并发 短时查询_02

 

(6)Memstore 与 storefile

      store包括位于内存中的memstore和位于磁盘的storefile,写操作先写入memstore,当memstore中的数据达到某个阈值,hregionserver会启动flashcache进程写入storefile,每次写入形成单独的一个storefile

2.4、Hbase原理

HBase是依赖hadoop的,依赖hdfs的,HBase存储的所有数据其实是在DataNode上面。数据是存在RegoinServer上面的,RegionServer里面的数据具体是存在DataNode上面的,HBase视觉上能看到的是RegoinServer和Hmaster两个节点,类似于NameNode和DataNode节点。HBase在操作表的时候有原数据,原数据存到zookeeper上

HBase内置有zookeeper,Zookeeper通过选举,保证任何时候,集群中只有一个活跃的HMaster。HMaster与HRegionServer 启动时会向ZooKeeper注册,存储所有HRegion的寻址入口,实时监控HRegionserver的上线和下线信息,并实时通知给HMaster。

2.5、为什么HBase访问很快?

客户端去访问某一条数据的时候,先去内存里面找, MemStore是内存里面的结构化分区。

客户端在访问数据的时候,会先去MemStore里面查看是否有数据,如果有的话直接就返回了,这种情况非常快,不会涉及到磁盘io。

第二种情况是客户端去MemStore里面找数据没找到,会去内存缓冲池里面找,这个数据是怎么来的呢?是通过LRU算法,维护的都是最近操作的数据,因为他也是在内存中所以很快。

如果没有的话,去region里面读,先读到内存缓冲池中,读完之后直接返回给客户端。如果新读进来内存缓冲池里面没有内存的话,就删除掉之前权重比较小的数据。
 

2.6、为什么hive和HBase很多时候要结合起来访问?

HBase可以和hive进行对接,hive和HBase之间可以通过sqoop进行数据的导入导出。HBase适合结构化和非结构化存储,而hive适合分析,HBase是不适合分析的,所以同HBase进行大量数据的存储,用hive进行大量数据的分析,小公司HBase用的不多,关系型数据库就能搞定

2.7、HBase的优缺点

优点:

  • 方便高效的压缩数据;
  • 支持快速数据检索:LRU算法、自动分区、LSM算法;
  • 管理和配置简单,支持横向扩展,所以非常容易扩展;
  • 聚合查询性能非常高:因为每个列都是一个单独的存储单元,对同一个列进行聚合的时候非常容易,比如说count就是一个聚合操作,如果把count应用在HBase的某一列上面,就特别的容易;
  • 可高效地进行分区,提供自动分区机制把大的region切分成小的subregion。

缺点:

  • 对JOIN以及多表合并数据的查询性能不好:需要通过MapReduce实现,在设计表的时候,把几十亿数据设计到一张表中就挺好;
  • 更新过程中有大量的写入和删除操作,需要频繁合并和分裂,降低存储效率;
  • 对关系模型支持不好,分区和索引模式设计比较困难。

三、HBase特征简要

3.1、自动故障处理和负载均衡

HBase运行在HDFS上,所以HBase中的数据以多副本形式存放,数据也服从分布式存放,数据的恢复也可以得到保障。另外,HMaster和RegionServer也是多副本的。
通过MapReduce不断的将小文件合并为大文件,本身就是负载均衡的机制,HMaster是高可用的,可以依赖zookeeper配置HMaster高可用

3.2、自动分区

HBase表是由分布在多个RegionServer中的region组成的,这些RegionServer又分布在不同的DataNode上,如果一个region增长到了一个阈值,为了负载均衡和减少IO,HBase可以自动或手动干预的将region切分为更小的region,也称之为subregion。

3.3、集成Hadoop/HDFS

虽然HBase也可以运行在其他的分布式文件系统之上,但是与HDFS结合非常之方便,而且HDFS也非常之流行。支持很多的文件系统,这里比较流行的hdfs

3.4、实时随机大数据访问

HBase采用log-structured merge-tree作为内部数据存储架构,这种架构会周期性地将小文件合并成大文件以减少磁盘访问同时减少NameNode压力。响应速度应该在毫秒级别的。

log-structured merge-tree log日志结构化的合并:

第一次内存中是没有树的,就可以新建一棵树,当里面的树存储到一定程度了,就把这个数据结构存到磁盘里面,存完之后又有新的数据往里面添加,会再建一棵树,然后数据又写满了,又放到磁盘里面,如此往复会产生很多这样的树,通过ls算法把这些树合并到一个,LSM算法是通过B tree和 B+ Tree 这两个算法演化而来的

3.5、MapReduce

HBase内建支持MapReduce框架,更加方便快速,并行的处理数据。
HBase本身是不支持join操作的,可以通过MapReduce实现类似的功能,但是不建议这样做,因为效率低。

3.6、Java API

HBase提供原声的Java API支持,方便开发。

3.7、横向扩展

HBase支持横向扩展,这就意味着如果现有服务器硬件性能出现瓶颈,不需要停掉现有集群提升硬件配置,而只需要在现有的正在运行的集群中添加新的机器节点即可,而且新的RegionServer一旦建立完毕,集群会开始重新调整。

3.8、列存储

HBase是面向列存储的,每个列都单独存储,所以在HBase中列是连续存储的,而行不是。

3.9、HBase Shell

HBase提供了交互式命令行工具可以进行创建表、添加数据、扫描数据、删除数据等操作和其他一些管理命令。
 

四、HBase 部署

4.1、伪分布式

(1)配置

1.hbase-env.sh中配置JAVA_HOME
2.配置hbase-site.xml如下
<property>
<name>hbase.rootdir</name>
<value>file:///home/testuser/hbase</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/testuser/zookeeper</value>
</property>

4.2、完全分布式

(1)前提

1、Hadoop集群正常运行

2、ZooKeeper集群正常运行

(2)配置

配置regionservers ,主机名
配置backup-masters
配置hbase-env.sh
配置JAVA_HOME
配置HBASE_MANAGERS_ZK=false
配置hbase-site.xml
添加hdfs-site.xml到conf目录下

启动Hbase: start-hbase.sh

Hbase-site.xml:

<property>
<name>hbase.rootdir</name>
<value>hdfs://namenode.example.org:8020/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>node-a.example.com,node-b.example.com,node-c.example.com</value>
</property>

 

五、HBase Shell

通过 hbase shell命令进入HBase 命令行接口(通过help可查看所有命令的支持以及帮助手册)

hbase 高并发 短时查询 hbase并发数_HDFS_03