🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# Hbase HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。 HBase是一个分布式的、面向列的开源数据库,该技术来源于Chang et al所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。 HBase存储的是松散型数据,是一个适合于非结构化数据存储的数据库,另一个不同的是HBase基于列的而不是基于行的模式。 ### 一. HBase逻辑模型 表是HBase的基本管理单元,在hbase中会设计多个表存放不同的数据和bigtable还是有区别的,bigtable是一个表 表由行与列组成,每个列属于某个列族,由行和列确定的存储单元称为元素。 表按Row排序的。 每个元素保存了同一份数据的多个版本,由时间戳来标识区分。 元素以字节码形式存放,没有类型之分。 #### 1 行键 可以想象成关系数据库中的主键。可能是多行,因为有时间戳。 行键是数据行在表里的唯一标识,并作为检索记录的主键 访问表里的行有三种方式:单个行键访问、给定行键的范围访问、全表扫描 行键可以是最大长度不超过64KB的任意字符串 按照字典序存储。对于经常要一起读取的行,要对行键值精心设计,以便它们能放在一起存储,保证连续性,当进行范围扫描时更快。 #### 2 列族与列 HBase表中的每个列都归属于某个列族。 - 列族必须作为表模式(schema)定义的一部分预先给出。 - 列族是固定的(在设计hbase表时,需要设计几个列族必须定好),但列是动态的(每个“列族”都可以有多个列成员(column),定义的时候不知道有多少个列、列名是什么)  列表示为<列族>:<限定符>,以列族作为前缀,以限定符的形式指定特定的列成员。  插入数据的时候可以动态更改列的数量。 - Hbase在磁盘上按照列族存储数据,把同一列族里面的数据存储在同一目录下,由几个文件保存。  列式数据库适合的数据分析的情形:针对几个列的多行数据进行扫描分析;单独对某几个列多行的数据进行收集扫描。 - 元素:由行和列确定的存储单元称为元素。每一个元素在Hbase中的结构如下图所示,类似于通信协议中的概念: ![](https://box.kancloud.cn/982fd3548cd11b50efa07b2836f354e8_554x97.png)  首先是行键:key的长度和value的长度  然后是列族:行长度 行 列族长度 列族 限定符 时间戳 key类型 = 时间戳 - hdfs中,不方便插入修改,所以这里有了时间戳的概念。每次都是用新的数据加入。 - 删除也是插入一条新的记录,然后加以标记,总而言之都是插入数据。 #### 3 时间戳 元素由:行键,列族:限定符,时间戳唯一决定。时间戳就是version,用来表示行键与列族对应的列值的版本。 时间戳是64位整型(一般用系统时间,精确到毫秒),对应每次数据操作的时间,可由系统自动生成,也可以由用户显式的赋值 ### 二. HBase物理存储 HBase是按照列存储的稀疏行/列矩阵。 稀疏:在多个列族存在的情况下,只有其中的一个列族有数据就是稀疏。为什么稀疏能提高性能? - Hbase是列存储,在hbase中是以列族为单位将数据存储在存储单元中的。 - 如果数据稀疏,也就意味着查询的时候只会查到某一个单元的数据。 - 如果不是稀疏,当同一个行键同一个时间戳查询的时候,同一个列族的数据会有多个。这种情况就会访问不同的存储单元,效率就会降低。 逻辑结构->物理存储结构 ![](https://box.kancloud.cn/d512967cad19ba50eb5b6856dce2cfeb_554x243.png) ![](https://box.kancloud.cn/049222384753a3ad8f99718b9a2ff723_554x230.png) 在物理存储模型中,并不是几个列族就有几个列,而是所有列族都在一个列。这样行数就会增加,列数就三列。   1 Table中的所有行都按照row key的字典序排列。   2 Table 在行的方向上分割为多个Hregion。   3 region按大小分割的,每个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阀值的时候,Hregion就会等分会两个新的Hregion。当table中的行不断增多,就会有越来越多的Hregion。   4 HRegion是Hbase中分布式存储和负载均衡的最小单元。最小单元就表示不同的Hregion可以分布在不同的HRegion server上。但一个Hregion是不会拆分到多个server上的。 5 HRegion虽然是分布式存储的最小单元,但并不是存储的最小单元。事实上,HRegion由一个或者多个Store组成,每个store保存一个columns family,每个Strore又由一个memStore和0至多个StoreFile组成,StoreFile以HFile格式保存在HDFS上。 ### 三. HBase物理模型 ![](https://box.kancloud.cn/bec5dc66b754d0e906f98416b0b28662_554x357.png) 这个架构也类似于hadoop本身的架构,由master和namenode存储元数据,真正的数据存储在datanode上(会有多个datanode)。 - Hmaster负责元数据存储,维护整个hbase集群的状态。 - HRegionServer是真正管理数据的增删改查,用户提交的数据请求都是通过HRegionServer协调处理。  每一个物理机器节点只能有一个HRegionServer。  在HRegionServer下管理HRegion。 - HRegion中存放的真正存储单元。  HRegion就是我们创建表的时候创建的,在默认情况下建立的表都有一个HRegion。  HRegion到底交个哪个HRegionServer管理,是由Hmaster管理,它会考虑负载均衡和资源管理。  HRegion中有一系列的结构。 - HLog (hbase log)日志记录文件。相当于oracle中的重做日志文件;Redo log记录增删改查的每一笔记录。 - Store单元存放真实的数据放。  数据以列族为单位存放,列族就存放在store中。  Store又分为两个部分:MemStore内存存储;StoreFile 存储文件,是以HFile存在的,存在于hdfs系统中datanode上。 - 在HRegionServer中 HRegion会有多个,随着数据不断增加就会产生新的HRegion,hlog只有一个。 - 在hadoop中,存储是均匀的,hbase的hfile就会分布在datanode上。整体上数据进行了两次分布。在hbase和hadoop上进行两次分布。 Region和Region服务器 表在行方向上,按照行键范围划分成若干的Region 表的存储模型关键的就是行键。比如有一亿条数据,每一个region是一千万,那么有10个regions(1-1000万 1000-2000万 。。。这么划分) 每个表最初只有一个region,当记录数增加到超过某个阈值时,开始分裂成两个region 物理上所有数据存放在HDFS,由Region服务器提供region的管理 如果有一个hregionServer宕机或下线,Hmaster会将Hregion交给其他Hregionserver管理 一台物理节点只能跑一个HRegionServer 一个Hregionserver可以管理多个Region实例 一个Region实例包括Hlog日志和存放数据的Store Hmaster作为总控节点 Zookeeper负责调度 HLog 用于灾难恢复 预写式日志(WAL),记录所有更新操作,操作先记录进日志,数据才会写入 每个Region服务器只维护一个Hlog,来自不同表的Region日志是混合在一起的 Hlog会被定期回滚 Store 每个Region由一个或多个Store组成,每个Store保存一个列族的所有数据 每个Store由一个memStore和零个或多个StoreFile组成 StoreFile以Hfile的格式存储在HDFS上的,这些文件都是B树结构 ![](https://box.kancloud.cn/3270d2af7622d4320dcfbef234605f70_552x269.png) 客户端更新操作流程 先连接有关的HRegionServer,然后向Region提交变更 提交的数据首先写入WAL(Write-Ahead Log)和MemStore 当memstore中的数据量达到某个阈值,Hregionserver会启动flashcache进程写入StoreFile 当StoreFile文件的数量增长到一定阈值后,系统会将多个StoreFile进行合并,在合并过程中会进行版本合并和删除工作,形成更大的StoreFile 当单个StoreFile大小超过一定阈值后,会把当前的Region分割为两个Regions,并由Hmaster分配到相应的Region服务器,实现负载均衡 客户端检索数据时,先在MemStore找,找不到再找StoreFile HMaster HBase只有一个HMaster(主服务器程序) HMaster将Region分配给Region服务器,协调Region服务器的负载并维护集群的状态 HMaster不会对外(Region服务器和客户端)提供数据服务,而是由Region服务器负责所有Regions的读写请求及操作 如果HRegionServer发生故障终止后,HMaster会通过ZooKeeper感知到,并处理相应的Log文件,然后重新分配失效的Regions HMaster还负责管理表的schema和对元数据的操作 HMaster失效仅会导致所有元数据无法被修改,但表的数据读写还是可以正常进行