- HBase简介
- HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,它构建在Hadoop分布式文件系统(HDFS)之上。HBase主要用于存储海量的非结构化和半结构化数据,并且能够提供实时的读写访问。
- 例如,在互联网公司中,用于存储用户的行为日志。这些日志数据量巨大,每条日志包含多个属性(如时间、用户ID、操作类型等),HBase可以很好地存储和管理这类数据。
- 数据模型
- 表(Table):HBase的数据存储在表中,表由行和列组成。
- 行键(Row Key):是表中每行数据的唯一标识符,数据在HBase中是按照行键的字典序进行存储的。行键的设计非常关键,它会影响数据的读写性能。例如,在存储用户订单信息时,如果以用户ID作为行键,那么查询某个用户的所有订单时会比较方便。
- 列族(Column Family):表中的列被分组为列族,列族在表创建时就需要定义,并且在运行过程中很少修改。一个列族可以包含多个列,例如,在存储网页数据的表中,可以有“content”列族(包含网页内容相关的列)和“meta”列族(包含网页元数据相关的列)。
- 列(Column):列是在列族下具体的属性,它的格式是“列族:列名”。例如,在“content”列族下有一个“text”列,其完整表示为“content:text”。
- 单元格(Cell):由行键、列族、列名和时间戳共同确定的一个存储单元,每个单元格存储一个数据版本。时间戳用于区分同一单元格的不同版本的数据。
- 架构组件
- 客户端(Client):
- 提供了访问HBase的接口,应用程序通过客户端与HBase集群进行交互。客户端可以使用Java API或者其他语言的封装接口(如Python的happybase库)。
- 客户端负责定位数据所在的区域服务器,缓存元数据信息,以减少与元数据服务器的交互次数,提高访问效率。
- ZooKeeper:
- 在HBase集群中起到协调和管理的作用。它存储了HBase的元数据信息,如集群的配置信息、主服务器地址、区域服务器的状态等。
- 例如,当区域服务器加入或离开集群时,ZooKeeper会感知到这些变化并通知其他组件。它还用于实现分布式锁,保证在集群操作中的一致性。
- 主服务器(Master):
- 主要负责管理和监控区域服务器,处理表的创建、删除和修改等操作。它还负责区域的分配和负载均衡。
- 例如,当有新的数据写入时,主服务器会根据一定的规则将数据分配到合适的区域服务器上。如果某个区域服务器的负载过重,主服务器会将部分区域迁移到其他负载较轻的服务器上。
- 区域服务器(Region Server):
- 存储和管理数据的实际工作节点。每个区域服务器包含多个区域(Region),区域是HBase表数据的子集。
- 区域服务器负责处理客户端对数据的读写请求,对数据进行存储和检索。它还会定期向主服务器发送自己的状态信息。
- 客户端(Client):
- 读写操作流程
- 写操作:
- 客户端首先通过元数据信息定位到数据应该写入的区域服务器。然后,数据会被写入到区域服务器的内存中的写缓存(MemStore)中。当写缓存达到一定大小后,会将数据刷写到磁盘上的HFile中。同时,为了保证数据的持久性,数据在写入过程中还会写入到WAL(Write - Ahead Log)中,WAL用于在系统故障时进行数据恢复。
- 读操作:
- 客户端同样先定位到数据所在的区域服务器。区域服务器会首先在内存中的缓存(BlockCache)中查找数据,如果找到则直接返回。如果没有找到,则会从磁盘上的HFile中读取数据。读取的数据也会被缓存到BlockCache中,以便下次读取相同数据时能够更快地响应。
- 写操作:
- 数据存储格式 - HFile
- HFile是HBase在磁盘上存储数据的文件格式。它是一种二进制格式的文件,具有高效的存储和检索性能。
- HFile包含多个数据块(Block),每个数据块存储一定数量的数据。数据块之间通过索引(Index)来快速定位数据。在读取HFile时,首先会读取索引信息,然后根据索引快速定位到需要的数据块。这种存储格式使得HBase在处理海量数据时能够快速地进行数据的读取和写入。
- 应用场景
- 日志存储和分析:如前面提到的互联网公司存储用户行为日志,用于后续的用户行为分析、推荐系统等。
- 物联网数据存储:用于存储大量的物联网设备采集的数据,如传感器数据。这些数据可以通过HBase进行长期存储,并用于设备监控、故障预警等应用场景。