HBase 介绍
HBase 是一种构建在 HDFS 之上的分布式、面向列(但不是列存储)的存储系统。
在需要实时读写、随机访问超大规模数据集时,可以使用 HBase。
HBase 可以通过线性方式增加节点来进行扩展。HBase 不是关系型数据库,自身不支持 SQL 查询引擎,HBase 适合将大而稀疏的表放在分布式集群上。
HBase 是 Google Bigtable 的开源实现,利用 Hadoop HDFS 作为其文件存储系统;利用 Hadoop MapReduce(或其他计算引擎) 来处理 HBase 中的海量数据;使用 Zookeeper 作为协同服务。
HBase 的特点
容量大:一个表可以有上亿行,上百万列
面向列:面向列的存储(但不是列存储,参考 HBase 数据存储)和权限控制,支持列的独立检索
稀疏性:对于为空(NULL)的列,并不占用存储空间,因此,表可以设计的非常稀疏
无模式:每一行都有一个可以排序的主键和任意多的列,列可以根据需要动态增加,不同的行可以有不同的列
数据多版本:每个单元格(Cell)中的数据可以有多个版本,默认情况下,版本号自动分配,版本号就是单元格插入时的时间戳
数据类型单一:HBase 中的数据都是字符串(存入字节),没有类型
随机查询:针对 Rowkey 的查询能够达到毫秒级别
HBase 的高并发和实时处理数据
HBase 是可以提供实时计算的分布式数据存储,HBase 以 StoreFile(HFile)二进制流的形式存储在 HDFS 上,由 HDFS 保证高容错性,HDFS 并不知道 HBase 存的是什么,HBase 的存储数据对于 HDFS 文件系统是透明的。参考 HFile 文件格式。
HBase 的使用建议
HBase 的设计目标并不是替代 RDBMS,而是对 RDBMS 的一个重要补充,尤其是对大数据的场景。
首先,在有足够多数据,如果有上亿或上千亿行数据,HBase 才会是一个很好的备选。
其次,需要确信业务上可以不依赖 RDBMS 的额外特性,例如,列数据类型,二级索引,SQL 查询语言等(部分特性可以通过其他组件实现,如 Phoenix)。
最后,需要确保有一定大小的 HDFS 集群规模。
HBase 架构概览
HBase 采用常见的 Master-Slave(主-从)结构,HBase 构建在 HDFS 上的结构如下图:
核心组件简要介绍(以下词义表示同样概念:HMaster=Master,HRegionServer=RegionServer=RS,HRegion=Region):
HMaster
负责 RegionServer 的负载均衡
为 RegionServer 分配 Region
发现失效的 RegionServer 并重新分配其上的 Region
管理用户对 Table 的增、删、改等操作
HRegionServer
管理由 HMaster 分配的 Region
处理对 RegionServer 上维护的 Region 的 IO 请求
HRegion
Region 可看作是 Table 的水平切分,管理 Table 中的一段连续的 Rowkey (记录的唯一主键)
Region 是 HBase 分布式存储和负载均衡以及其他特性实现的基本单位
同一个 Table 的不同的 Region 可以分别在不同的 RegionServer 上,同一个 Region 的数据不会在多个 RegionServer 上
HLog
HBase 的 WAL(Write-Ahead Log)实现,每个 RegionServer 维护一个 HLog
RegionServer 上的所有 Region 共用一个 HLog
MemStore
Region 中维护的写缓存,数据会先写到 MemStore,满足一定条件时 flush 到文件中
HFile
MemStore 每次 flush 时会生成新的 HFile,在 HDFS 上
HDFS 会负责 HFile 的可用性
Client
客户端负责访问 HBase 的接口
会维护缓存信息加速 HBase 访问,如:Region 位置信息
Client 访问数据通过 RegionServer(通过 Zookeeper 找到 RS 地址),不需要通过 HMaster
Zookeeper
HBase HA 的解决方案,通过选举,保证任何时候集群中只有一个 Active Master
Master 与 RegionServer 启动时会向 ZooKeeper 注册,存储所有 Region 的地址
HMaster 功过 Zookeeper 监控 RegionServer 的上线和下线信息
存储 HBase 的元数据
Zookeeper 的引入使得 Master 不再是单点故障
HBase 的数据模型(Table)相关概念:
Rowkey,每条记录的唯一主键
Column(列),无固定模式,可以动态添加,属于一个 ColumnFamily
ColumnFamily(列族),对表的垂直切分,可以设置独立的特性。每个 ColumnFamily 的列数据对应一个 Memstore,由 Store 封装。
Value,真实的数据,Rowkey 对应某一列的列值
Version,版本号,每个 Value 有自己的版本,默认是更新数据的时间戳
版权声明: 本文为 InfoQ 作者【Alex🐒】的原创文章。
原文链接:【http://xie.infoq.cn/article/63491bd9c18b8d45bc6fe478f】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论