热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HBase体系结构浅析

H

HBase 体系结构来源于谷歌的 BigTable 论文,是典型的 Master-Slave 模型。系统中有一个管理集群的 Master 节点以及大量实际服务用户读写的 RegionServer 节点。除此之外,HBase 中所有数据最终都存储在 HDFS 系统中,这与 BigTable 实际数据存储在 GFS 中相对应;系统中还有一个 ZooKeeper 节点,协助 Master 对集群进行管理。

HBase 体系结构如下图所示:

1. HBase 客户端

HBase 客户端(Client)提供了 Shell 命令行接口、原生 Java API 编程接口、Thrift/REST API 编程接口以及 MapReduce 编程接口。HBase 客户端支持所有常见的 DML 操作以及 DDL 操作,即数据的增删改查和表的日常维护等。其中 Thrift/REST API 主要用于支持非 Java 的上层业务需求,MapReduce 接口主要用于批量数据导入以及批量数据读取。

HBase 客户端访问数据行之前,首先需要通过元数据表定位目标数据所在 RegionServer,之后才会发送请求到该 RegionServer。同时这些元数据会被缓存在客户端本地,以方便之后的请求访问。如果集群 RegionServer 发生宕机或者执行了负载均衡等,从而导致数据分片发生迁移,客户端需要重新请求最新的元数据并缓存在本地。

2. Zookeeper

在 HBase 系统中,ZooKeeper 扮演着非常重要的角色。

  • 实现 Master 高可用:通常情况下系统中只有一个 Master 工作,一旦 Active Master 由于异常宕机,ZooKeeper 会检测到该宕机事件,并通过一定机制选举出新的 Master,保证系统正常运行。

  • 管理系统核心元数据:比如,管理当前系统中正常工作的 RegionServer 集合,保存系统元数据表 hbase:meta 所在的 RegionServer 地址等。

  • 参与 RegionServer 宕机恢复:ZooKeeper 通过心跳可以感知到 RegionServer 是否宕机,并在宕机后通知 Master 进行宕机处理。

  • 实现分布式表锁:HBase 中对一张表进行各种管理操作(比如 alter 操作)需要先加表锁,防止其他用户对同一张表进行管理操作,造成表状态不一致。与其他的 RDBMS 表不同,HBase 中的表通常是分布式存储,ZooKeeper 可以通过特定机制实现分布式表锁。

3. Master

Master 主要负责 HBase 系统的各种管理工作:

  • 处理用户的各种管理请求,包括建表、修改表、权限操作、切分表、合并数据分片以及 Compaction 等。

  • 管理集群中所有 RegionServer,包括 RegionServer 中的 Region 的负载均衡、RegionServer 的宕机恢复以及 Region 的迁移等。

  • 清理过期日志以及文件,Master 会每隔一段时间检查 HDFS 中 HLog 是否过期、HFile 是否已经被删除,并在过期之后将其删除。

4. RegionServer

RegionServer 主要用来响应用户的 IO 请求,是 HBase 中最核心的模块,由 WAL(HLog)、BlockCache 以及多个 Region 构成。

  • WAL(HLog):HLog 在 HBase 中有两个核心作用:

    • 其一,用于实现数据的高可靠性,HBase 数据随机写入时,并非直接写入 HFile 数据文件,而是先写入缓存,再异步刷新落盘。为了防止缓存数据丢失,数据写入缓存之前需要首先顺序写入 HLog,这样,即使缓存数据丢失,仍然可以通过 HLog 日志恢复;

    • 其二,用于实现 HBase 集群间主从复制,通过回放主集群推送过来的 HLog 日志实现主从复制。

  • BlockCache:HBase 系统中的读缓存。客户端从磁盘读取数据之后通常会将数据缓存到系统内存中,后续访问同一行数据可以直接从内存中获取而不需要访问磁盘。对于带有大量热点读的业务请求来说,缓存机制会带来极大的性能提升。BlockCache 缓存对象是一系列 Block 块,一个 Block 默认是为 64k,由物理上相邻的多个 KV 数据组成。BlockCache 同时利用了空间局部性和时间局部性原理,前者表示最近将读取的 KV 数据很可能与当前读取到的 KV 数据在地址上是邻近的,缓存单位是 Block(块)而不是单个 KV 就可以实现空间局部性;后者表示一个 KV 数据正在被访问,那么近期她还可能再次被访问。当前 BlockCache 主要有两种实现 LRUBlockCache 和 BucketCache,前者实现相对简单,而后者在 GC 优化方面有明显的提升。

  • Region : 数据表的一个分片,当数据表大小超过一定阈值就会”水平切分“,分裂为两个 Region。Region 是集群负载均衡的基本单位。通常一张表的 Region 会分布在整个集群的多台 RegionServer 上,一个 RegionServer 上会管理多个 Region,当然,这些 Region 一般来自不同的数据表。一个 Region 由一个或者多个 Store 组成,Store 的个数取决于表中列族(column family)的个数,多少个列族就有多少个 Store。HBase 中,每个列族的数据都集中存放在一起形成一个存储单元 Store,因此建议将具有相同 IO 特性的数据设置在同一个列族中。每个 Store 由一个 MemStore 和一个或者多个 HFile 组成。MemStore 称为写缓存,用户写入数据时首先会写到 MemStore,当 MemStore 写满之后(缓存数据超过阈值,默认128M)系统会异步地将数据 flush 成一个 HFile 文件。显然,随着数据不断写入,HFile 文件会越来越多,当 HFile 文件数超过一定阈值之后系统将会执行 Compact 操作,将这些小文件通过一定策略合并成一个或多个大文件。

5. HDFS

HBase 底层依赖 HDFS 组件存储实际数据,包括用户数据文件、HLog 日志文件等最终都会写入 HDFS 落盘。HDFS 是 Hadoop 生态圈内最成熟的组件之一,数据默认三副本存储策略可以有效保证数据的高可靠性。HBase 内部封装了一个名为 DFSClient 的 HDFS 客户端组件,负责对 HDFS 的实际数据进行读写访问。

6. HBase 的优点

与其他数据库相比,HBase 在系统设计以及实际实践中有很多独特的优点。

  • 容量大:HBase 的单表可以支持千亿行、百万列的数据规模,数据容量可以达到 TB 甚至 PB 级别。传统的关系型数据库,如 Oracle 和 MySQL 等,如果单表记录条数超过亿行,读写性能都会急剧下降,在 HBase 中并不会出现这样的问题。

  • 良好的可扩展性:HBase 集群可以非常方便地实现集群容量扩展,主要包括数据存储节点扩展以及读写服务节点扩展。HBase 底层数据存储依赖于 HDFS 系统,HDFS 可以通过简单地增加 DataNode 实现扩展,HBase 读写服务节点也一样,可以通过简单的增加 RegionServer 节点实现计算层的扩展。

  • 稀疏性:HBase 支持大量稀疏存储,即允许大量列值为空,并不占用任何存储空间。这与传统数据库不同,传统数据库对于空值的处理要占用一定的存储空间,这会造成一定程度上的存储空间浪费。因此可以使用 HBase 存储上百万列的数据,即使表中存在大量的空值,也不需要任何的额外空间。

  • 高性能:HBase 目前主要擅长于 OLTP 场景,数据写操作性能强劲,对于随机单点以及小范围的扫描读,其性能也能够得到保证。对于大范围的扫描读可以使用 MapReduce 提供的 API,以便实现更高效的并行扫描。

  • 多版本:HBase 支持多版本特性,即一个 KV 可以同时保留多个版本,用户可以根据需要选择最新版本或者某个历史版本。

  • 支持过期:HBase 支持 TTL 过期特性,用户只需要设置过期时间,超过 TTL 的数据就会被自动清理,不需要用户写程序手动删除。

  • Hadoop 原生支持:HBase 是 Hadoop 生态中的核心成员之一,很多生态组件都可以与其直接对接。

7. HBase 的缺点

  • HBase 本身不支持很复杂的聚合运算(如 Join、GroupBy等)。如果业务中需要使用聚合运算,可以在 HBase 之上架设 Phoenix 组件或者 Spark 组件,前者主要应用于小规模聚合的 OLTP 场景,后者应用于大规模聚合的 OLAP 场景。

  • HBase 本身并没有实现二级索引功能,所以不支持二级索引查找。比如 Phoenix 提供的二级索引功能。

  • HBase 原生不支持全局跨行事务,直直垂单行事务模型。同样,可以使用 Phoenix 提供的全局事务模型组件来弥补 HBase 这个缺陷。




推荐阅读
  • 第二章:Kafka基础入门与核心概念解析
    本章节主要介绍了Kafka的基本概念及其核心特性。Kafka是一种分布式消息发布和订阅系统,以其卓越的性能和高吞吐量而著称。最初,Kafka被设计用于LinkedIn的活动流和运营数据处理,旨在高效地管理和传输大规模的数据流。这些数据主要包括用户活动记录、系统日志和其他实时信息。通过深入解析Kafka的设计原理和应用场景,读者将能够更好地理解其在现代大数据架构中的重要地位。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 【并发编程】全面解析 Java 内存模型,一篇文章带你彻底掌握
    本文深入解析了 Java 内存模型(JMM),从基础概念到高级特性进行全面讲解,帮助读者彻底掌握 JMM 的核心原理和应用技巧。通过详细分析内存可见性、原子性和有序性等问题,结合实际代码示例,使开发者能够更好地理解和优化多线程并发程序。 ... [详细]
  • NoSQL数据库,即非关系型数据库,有时也被称作Not Only SQL,是一种区别于传统关系型数据库的管理系统。这类数据库设计用于处理大规模、高并发的数据存储与查询需求,特别适用于需要快速读写大量非结构化或半结构化数据的应用场景。NoSQL数据库通过牺牲部分一致性来换取更高的可扩展性和性能,支持分布式部署,能够有效应对互联网时代的海量数据挑战。 ... [详细]
  • ZeroMQ在云计算环境下的高效消息传递库第四章学习心得
    本章节深入探讨了ZeroMQ在云计算环境中的高效消息传递机制,涵盖客户端请求-响应模式、最近最少使用(LRU)队列、心跳检测、面向服务的队列、基于磁盘的离线队列以及主从备份服务等关键技术。此外,还介绍了无中间件的请求-响应架构,强调了这些技术在提升系统性能和可靠性方面的应用价值。个人理解方面,ZeroMQ通过这些机制有效解决了分布式系统中常见的通信延迟和数据一致性问题。 ... [详细]
  • 黄聪:MySQL主从复制配置,实现高效读写分离
    大型网站为应对高并发访问,不仅需要在前端实现分布式负载均衡,还需在数据业务和访问层采取有效措施。采用传统的数据结构已无法满足需求,通过配置MySQL主从复制,可实现高效的读写分离,显著提升系统性能和稳定性。 ... [详细]
  • Spark与HBase结合处理大规模流量数据结构设计
    本文将详细介绍如何利用Spark和HBase进行大规模流量数据的分析与处理,包括数据结构的设计和优化方法。 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • 如何优化MySQL数据库性能以提升查询效率和系统稳定性 ... [详细]
  • 2021年Java开发实战:当前时间戳转换方法详解与实用网址推荐
    在当前的就业市场中,金九银十过后,金三银四也即将到来。本文将分享一些实用的面试技巧和题目,特别是针对正在寻找新工作机会的Java开发者。作者在准备字节跳动的面试过程中积累了丰富的经验,并成功获得了Offer。文中详细介绍了如何将当前时间戳进行转换的方法,并推荐了一些实用的在线资源,帮助读者更好地应对技术面试。 ... [详细]
  • 本文深入探讨了 Git 与 SVN 的高效使用技巧,旨在帮助开发者轻松应对版本控制中的各种挑战。通过详细解析两种工具的核心功能与最佳实践,读者将能够更好地掌握版本管理的精髓,提高开发效率。 ... [详细]
  • 构建高可用性Spark分布式集群:大数据环境下的最佳实践
    在构建高可用性的Spark分布式集群过程中,确保所有节点之间的无密码登录是至关重要的一步。通过在每个节点上生成SSH密钥对(使用 `ssh-keygen -t rsa` 命令并保持默认设置),可以实现这一目标。此外,还需将生成的公钥分发到所有节点的 `~/.ssh/authorized_keys` 文件中,以确保节点间的无缝通信。为了进一步提升集群的稳定性和性能,建议采用负载均衡和故障恢复机制,并定期进行系统监控和维护。 ... [详细]
  • 本文详细介绍了HDFS的基础知识及其数据读写机制。首先,文章阐述了HDFS的架构,包括其核心组件及其角色和功能。特别地,对NameNode进行了深入解析,指出其主要负责在内存中存储元数据、目录结构以及文件块的映射关系,并通过持久化方案确保数据的可靠性和高可用性。此外,还探讨了DataNode的角色及其在数据存储和读取过程中的关键作用。 ... [详细]
  • 开发心得:利用 Redis 构建分布式系统的轻量级协调机制
    开发心得:利用 Redis 构建分布式系统的轻量级协调机制 ... [详细]
  • IIS 7及7.5版本中应用程序池的最佳配置策略与实践
    在IIS 7及7.5版本中,优化应用程序池的配置是提升Web站点性能的关键步骤。具体操作包括:首先定位到目标Web站点的应用程序池,然后通过“应用程序池”菜单找到对应的池,右键选择“高级设置”。在一般优化方案中,建议调整以下几个关键参数:1. **基本设置**: - **队列长度**:默认值为1000,可根据实际需求调整队列长度,以提高处理请求的能力。此外,还可以进一步优化其他参数,如处理器使用限制、回收策略等,以确保应用程序池的高效运行。这些优化措施有助于提升系统的稳定性和响应速度。 ... [详细]
author-avatar
芬飞满天2011
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有