码迷,mamicode.com
首页 > 其他好文 > 详细

01_HBase概述

时间:2017-11-11 11:44:41      阅读:252      评论:0      收藏:0      [点我收藏+]

标签:sql   byte   tor   注册   分配   否则   alt   更新   需要   

1. HBase在Hadoop生态圈中的位置

问题:HBase 是什么,用在哪里,解决什么样的问题?

解答:

1)简单来说, HBase 是一种类似于面向列的分布式数据库(集群)底层利用HDFS 来作为其物理存储(但在特殊情况下也可以使用节点本机的文件系统), 存储稀疏数据;同时借助zookeeper来监测集群节点的运行状态(自带zookeeper或者外部zookeeper);

2)生态角度:HBase并不支持SQL,需要和Hive或者Phonenix结合; 前者一定会利用MapReduce框架,后者则可以绕开MapReduce,因此实时性上后者更好

 

2. HBase和RDBMS的区别

ACID

ACID 是数据库事务正确执行的四个基本要素:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

支持事务(Transaction)的数据库系统,必需要具有这四种特性,否则无法保证数据的正确性,交易过程极可能达不到交易方的要求

* 原子性:一个事务要么全部执行,要么全部不执行;如果执行过程中发生错误,需要将事务状态回滚到最开始的状态;举例:两个账户之间的转账交易,一定要保证一个账户减少金额,另一个账户增加相应的金额,而不能出现只完成一半的情况

* 一致性:事务执行过程中的数据变化要跟上;还是转账的例子,1个账户增加x, 另一个账户要相应的减少x,  2个账户的总和不会改变

* 隔离性:两个以上事务的执行不能出现交错执行的状态,类似线程共享数据操作的锁机制,要保证只有1个事务在操作数据(事务串行)

* 持久化:事务执行成功后,该事务对数据的变更持久保存在数据库中,不能无缘无故的恢复到之前的数据状态

HBase和RDBMS的区别

  Hbase   RDBMS
硬件架构 类似于 Hadoop 的分布式集群,硬件成本低廉 传统的多核系统,硬件昂贵
容错性     通过集群软件架构实现,不用担心1个或或几个节点宕机 额外的硬件设备及HA软件实现冗余
数据库大小 PB GB、TB
数据排布方式 稀疏的、多个表 行和列组织
数据类型   Bytes 多种数据类型
事务支持   行锁定,ACID只支持单个row级别 表锁定和行锁定,全面ACID
查询语言 Java API(除非和其他框架配合,Hive等) SQL
索引 只支持row-key(除非和其他框架配合,Hive等) 支持
吞吐量   百万查询/秒 数千查询

 

 

 

 

 

 

 

 

数据在HBase中的排布

1)对于1个传统的行列二维表,HBase的每行数据都有1个row-key

2)通过Column Family(CF)将相关的列关联在一起

3)CF中的每一列,都是1个qualifier

4)  HBase中的每行数据,都有1个时间戳,默认情况下HBase可以保存同一行3个不同版本的信息

5)在 Hbase 中,Row-key + CF + Qulifier + 一个时间戳  =  才可以定位到一个单元格数据

6)物理存储时,1个逻辑二维表格会根据CF,拆分为多个文件(基于CF来存储)HFile (1个CF -> 1个HFile)

7)用户按照 Row-key 查询数据,HBase 会遍历HFile,通过相同的 Row-Key 标识,将相关的单元格组织成行返回,形成逻辑上的行数据

技术分享

 

 3. HBase相关模块、HBase表格的特性

技术分享

* Master

HBase集群的主

1)监测各个RegionServer的状态

2)分配Region给RegionServer (Region是HBase将数据进行分布式的基本单位)

3)平衡RegionServer间的负载

4)可以多个Master节点,但只有1个Master处于服务状态;工作的Master宕机,再选举1个Master接管HBase集群

*RegionServer

HBase中的数据表,初始只有一个Region,随着记录的增多单个Region的数据量逐渐增大,导致查找效率降低(多次二分查找才能定位到需要的行)

因此当Region增大到一定范围后,Region会进行分裂(1分2),从而产生多个Region,Master会将这些Region分配给不同的RegionServer进行管理,并在RegionServer所在节点的HDFS上进行物理存储

1)1个RegionServer,管理了1个或多个Region

2)RegionServer,对外提供读写服务

3)Client通过本地缓存或zookeeper获取要查询的row-key对应的数据落在那些RegionServer上,并直接连接RegionServer进行数据获取

*zookeeper

 1) Zookeeper是HBase Master 的 HA 解决方案。保证了至少有一个 HBase Master 处于运行状态

2)zookeeper负责RegionServer的注册,并在RegionServer出现宕机后通知Master,通过HLog将宕机节点上的Region重新分配到其他RegionServer进行存储

 

HBase工作原理

技术分享

 

1、 Client 需要访问 HBase 集群时,需要先和 Zookeeper 通信,找到对应的 Region Server

2、每一个 Region Server 管理着很多个 Region。每一个 Region 都只存储一个 CF ,并且是该 CF 中的一段(按 Row 的区间分成多个 Region)

3、1个Region 存储的数据是有上限的,当达到该上限时(Threshold),Region 会进行分裂,数据也会分裂到多个 Region 中,这样可以提高数据的并行化

4、每个 Region 包含着多个 Store 对象。每个 Store 包含一个 MemStore,和一个或多个 HFile

5、数据写入 Region ,会先写入 MemStore,并且一般会按照row-key排序,当 MemStore 中的数据需要向底层文件系统倾倒(Dump)时(例如 MemStore 中的数据体积到达 MemStore 配置的最大值),Store 便会创建 StoreFile,而 StoreFile 就是对 HFile 一层封装。所以 MemStore 中的数据会最终写入到 HFile 中, HFile 都存储在 HDFS 之中

 

HBase如何保证数据有效性

HBase 中的 HLog 机制是 WAL 的一种实现,而 WAL(预写日志)是事务机制中常见的一致性的实现方式。

1)每个 Region Server 中都会有一个 HLog 的实例,Region Server 会将更新操作(如 Put,Delete)通过Hlog实例,将更新记录先写入 WAL(也就是 HLog)中,然后将其写入到 Store 的 MemStore,最终 MemStore 会将数据写入到持久化的 HFile 中(MemStore 到达配置的内存阀值)

2)如果没有 WAL, Region Server 宕掉,MemStore 还没有写入到 HFile,或者 StoreFile 还没有保存,数据就会丢失

3)HFile 本身 HDFS 来保证多副本。默认会有 3 份,本身具有可靠性

HFile的结构

技术分享

1) HFile 由多个数据块(Block)组成,并且有一个固定的结尾块

2)每个数据块。由 Header 和多个 Key-Value 的键值对组成

3)Trailer包含了数据相关的索引信息,系统也是通过结尾的索引信息找到 HFile 中的数据

4)HFile 中的数据块默认 64KB。如果访问 HBase 数据库的场景多为有序的访问,那么建议将该值设置的大一些。如果场景多为随机访问,那么建议将该值设置的小一些。一般情况下,通过调整该值可以提高 HBase 的性能

 

HBase的数据映射关系

HBase 是一个有序的、多维 Map,其中每一个 Row-key 映射了许多数据这些数据存储在 CF 中的 Column

技术分享

 

 

 4. HBase的使用

HBase 的使用建议

HBase 并不适合所有问题其设计目标并不是替代 RDBMS,而是对 RDBMS 的一个重要补充,尤其是对大数据的场景。

 

当需要考量 HBase 作为一个备选项时,我们需要考察如下几点:

1)有足够多的数据

如果有上亿或上千亿行数据,HBase 才会是一个很好的备选。

2)确认业务上可以不依赖 RDBMS 的额外特性

例如,列数据类型, 二级索引,SQL 查询语言等。

3)有足够多的硬件资源

一般情况下当 HDFS 的集群小于 5 个数据节点时,也干不好什么事情 (HDFS 默认会将每一个 Block 数据备份 3 分),还要加上一个 NameNode

4)HBase表格设计

*首先,一个 HBase 是否高效,很大程度和 Row-Key 的设计有关概括起来的宗旨只有一个,那就是尽可能选择一个 Row-Key,可以数据均匀的分布在集群中

更具体的可以参考:

** 当客户端需要频繁的写一张表,随机的 RowKey 会获得更好的性能

**当客户端需要频繁的读一张表,有序的 RowKey 则会获得更好的性能

**对于时间连续的数据(例如 log),有序的 RowKey 会很方便查询一段时间的数据(Scan 操作)

* 其次,ColumnFamily也会需要在不同场景下有不同的设计方案

在 RDBMS中,如果当用户的信息分散在不同的表中,需要根据一个 Key 进行 Join 操作。而在 HBase 中,我们需要设计 CF 来聚合用户所有相关信息

一个 Region 对应于一个 CF。如果在一个表中定义了多个 CF 时,就必然会有多个 Region。当 Client 查询数据时,就不得不查询多个 Region。这样性能自然会有所下降,因此在大多数的情况下,一个表格不会超过 2 到 3 个 CF,而且很多情况下都是 1 个 CF 就足够了。

 

01_HBase概述

标签:sql   byte   tor   注册   分配   否则   alt   更新   需要   

原文地址:http://www.cnblogs.com/shay-zhangjin/p/7817996.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!