HBase 原理

devtools/2024/11/25 22:47:18/

一、HBase系统架构

HBase采用主从架构,主要由以下几个组件组成:

  1. Client:客户端,可以是HBase Shell、Java API客户端、Rest API等,提供访问接口,并维护对应的缓存以加速HBase的访问。客户端缓存Region的位置信息,以减少获取元数据的时间。
  2. Zookeeper:HBase通过Zookeeper来实现HMaster的高可用、HRegionServer的监控、元数据的入口以及集群配置的维护等工作。Zookeeper的选举机制保证集群中只有一个HMaster,同时监控HRegionServer的状态,并在HRegionServer异常时通过Master收到通知。
  3. HMaster:HMaster是所有HRegion Server的管理者,负责分配regions到每个HRegionServer,监控每个HRegionServer的状态,进行负载均衡和故障转移。
  4. HRegionServer:HRegionServer负责响应用户读写的IO请求,与底层HDFS交互,存储数据到HDFS,并处理分配给它的HRegion。它还负责刷新缓存到HDFS,维护HLog日志存储文件,处理来自客户端的读写请求,以及负责HRegion变大后的拆分和StoreFile的合并工作。
  5. HDFS:HDFS为HBase提供最终的底层数据存储服务,并提供高可用的支持。
    在这里插入图片描述

二、HBase数据存储与读取

  1. 数据存储:
  • HBase的数据存储在HDFS的文件中,数据按照表名进行组织存储。
  • 每个表被分割成多个Region,每个Region存储一部分数据。Region通过一定的规则和策略进行划分,以实现数据的均衡存储和查询效率的最大化。
  • Region内部由多个Store组成,每个Store对应表中的一个列族。Store由一个MemStore和零个或多个StoreFile(HFile)组成。MemStore负责保存内存中的数据,而StoreFile则是磁盘上保存原始数据的实际物理文件。
    1. 分布式存储:
      HBase利用Hadoop分布式文件系统(HDFS)作为底层存储,将数据分片并分布存储在多个节点上。这种分布式存储方式使得HBase能够处理PB级别的数据量,并提供了高容错性和可扩展性。
    2. 表与Region:
      在HBase中,数据被组织成表的形式,每个表由多个Region组成。Region是HBase中数据分布和负载均衡的基本单位,它包含了表中一部分行的数据。HBase会根据数据的量和访问模式动态地调整Region的数量和分布,以实现负载均衡和性能优化。
    3. 列族与Store:
      HBase中的表由多个列族组成,每个列族包含了表中具有相同访问模式的列。每个列族在物理上对应一个或多个Store,Store是HBase中数据存储的基本单元,它包含了列族中所有列的数据。
    4. MemStore与HFile:
      HBase使用内存中的MemStore来暂存写入的数据,以提高写入性能。当MemStore中的数据量达到一定阈值时,会触发Flush操作,将数据写入到磁盘上的HFile(Hadoop File)中。HFile是HBase中存储数据的物理文件,它采用了高效的压缩和编码技术,以减少磁盘IO和提高查询性能。
    5. WAL(Write-Ahead Logging):
      为了保证数据的可靠性和持久性,HBase在写入数据时采用了WAL机制。在数据写入MemStore之前,会先写入到WAL文件中。如果系统发生故障,可以通过WAL文件来恢复未写入到HFile中的数据。
  1. 数据读取:
  • HBase的数据读取采用分布式的方式。客户端将查询请求发送到HMaster节点,HMaster通过查询元数据信息,确定数据所在Region的位置,并将查询请求转发到对应的HRegionServer节点。
  • HRegionServer通过访问本地存储的数据,并将查询结果返回给客户端。在查询过程中,HRegionServer会首先查找内存(MemStore和BlockCache),如果未找到数据,则会到StoreFile上读取。为了提高读取效率,从StoreFile读取的数据会先写入BlockCache,再返回给客户端。
    1. 客户端缓存:
      HBase客户端会缓存Region的位置信息,以减少获取元数据的时间。当客户端需要读取数据时,会首先根据缓存的Region位置信息找到对应的HRegionServer。
    2. MemStore与BlockCache:
      当HRegionServer接收到读取请求时,会首先尝试从内存中的MemStore和BlockCache中读取数据。如果数据存在于MemStore或BlockCache中,则可以直接返回给客户端,无需访问磁盘。
    3. HFile读取:
      如果MemStore和BlockCache中未找到数据,HRegionServer会到HFile中读取数据。HFile采用了高效的索引和数据结构,使得读取操作能够快速定位到所需的数据。
    4. 数据合并与过滤:
      在读取数据时,HBase还支持数据的合并和过滤操作。例如,可以使用过滤器来只读取满足特定条件的行或列,以减少数据传输量并提高查询效率。
    5. 分布式读取:
      HBase支持分布式读取操作,即多个HRegionServer可以同时处理同一个查询请求。这种方式可以充分利用集群的计算能力,提高查询性能。

三、HBase数据更新与删除

  1. 数据更新:
  • HBase支持原子性的写入操作。所有的数据更新都是基于HLog(WAL)文件的。数据写入时会先写入到HLog文件中,以确保数据的持久化和可恢复性。
  • 数据写入HLog文件后,再写入到MemStore中。由于MemStore是内存中的数据,写入速度非常快,因此HBase能够提供高性能的写入能力。
  • 当MemStore中的数据达到一定的阈值时,会触发Flush操作,将MemStore中的数据写入到StoreFile中。这个过程是异步的,不会阻塞客户端的写入请求。
  1. 更新方式:
  • 可以通过put命令来更新数据,这实际上是向表中插入一条新的数据记录,如果记录的row key已经存在,则会覆盖原有记录。
  • 也可以使用update命令来覆盖写入数据,这种方式需要指定表名、row key、列名和值。
  1. 更新原理:
  • 客户端向HBase的主节点发送更新请求。
  • 主节点接收请求后,根据表的分区规则将请求转发给相应的Region Server。
  • 目标Region Server接收到请求后,在内存中查找要更新的数据。
    • 如果数据在内存中存在(即MemStore中),Region Server会直接更新内存中的数据,并将更新后的数据写入WAL(Write-Ahead Log)日志文件中以保证数据的持久性。
    • 如果数据在内存中不存在,Region Server会从HFile(HBase的底层数据存储文件)中检索数据,加载到内存中进行更新,并写入WAL日志文件。
  • 更新操作完成后,Region Server会将更新后的数据保留在MemStore中,等待后续的刷写操作。
  • 当MemStore中的数据达到一定大小时,Region Server会将数据刷写到磁盘上的HFile中。
  • 更新成功后,Region Server将响应返回给客户端。
  1. 数据删除:
  • HBase的数据删除采用标记删除的方式。即将要删除的数据标记为已删除,实际上并不从磁盘上删除。直到垃圾回收机制将其清理掉。
  1. 删除方式:
  • 可以使用delete命令来删除数据。如果只需要删除特定列的数据,可以在delete命令中指定列名。
  1. 删除原理:
  • HBase的删除操作不会立即将数据从磁盘上删除,而是通过插入一个keytype为Delete的KeyValue来标记数据已被删除。
  • 当执行删除操作时,HBase会新插入一条与要删除的数据相同的KeyValue数据,但keytype设置为Delete。
  • 删除标记会一直保留在StoreFile(HBase中存储数据的物理文件)中,直到发生Major Compaction操作时,数据才会被真正地从磁盘上删除,同时删除标记也会从StoreFile中删除。
  • 默认情况下,删除操作会标记所有版本的数据。因此,在执行Get或Scan操作时,不会看到已删除的单元格(行或列)。
  1. TTL(Time To Live)功能:
  • HBase允许为行或单元格设置存活时间(TTL),超出后数据会自动删除。
  • ColumnFamilies可以设置TTL长度(以秒为单位),HBase将在到期时间后自动删除行。这适用于行的所有版本,包括当前版本。
  • HBase还支持按每个单元格设置生存时间(TTL),Cell TTL以毫秒为单位表示,且不能超过ColumnFamily的TTL。

四、HBase数据访问控制

HBase通过访问控制列表(ACL)来控制用户对表和列族的访问权限。支持读、写和管理等多种操作,管理员可以授予或撤销用户的权限。

  1. 用户身份验证
  • HBase通过ZooKeeper或其他认证机制实现客户端的身份验证。
  • 客户端在访问HBase之前,需要向认证服务器提供身份信息,如用户名和密码。
  • 认证服务器验证客户端的身份信息后,会生成一个会话标识符,客户端使用该标识符与HBase通信。
  1. 授权机制
  • HBase通过访问控制列表(ACL)实现用户和角色的授权。
  • ACL可以设置在表、列族和列级别,以实现精细的权限控制。
  • 管理员可以创建角色,并为角色分配特定的权限,然后将角色分配给用户。
  • 用户根据所分配的角色或ACL规则,获得对HBase数据的访问权限。
  1. 数据加密
  • HBase支持多种数据加密方法,如AES、DES和RSA等。
  • 管理员可以配置HBase的加密策略,指定加密算法和密钥。
  • 客户端在写入数据时,通过加密策略将数据加密后存储在HBase中。
  • 客户端在读取数据时,通过加密策略解密数据。

http://www.ppmy.cn/devtools/136956.html

相关文章

android 实现答题功能

一、效果 二、实现思路 1、界面实现 实现起来其实不难,首先我们可以看到,界面是由答题进度、题目、选项ABCD组成,现在就是要考虑实现方式,答题进度可以使用Textviewprogressbar实现,题目直接使用Textview,…

鸿蒙开发Hvigor插件动态生成代码

Hvigor允许开发者实现自己的插件,开发者可以定义自己的构建逻辑,并与他人共享。Hvigor主要提供了两种方式来实现插件:基于hvigorfile脚本开发插件、基于typescript项目开发。下面以基于hvigorfile脚本开发插件进行介绍。 基于hvigorfile脚本…

代码随想录算法训练营第五十四天|Day54 图论

冗余连接 https://www.programmercarl.com/kamacoder/0108.%E5%86%97%E4%BD%99%E8%BF%9E%E6%8E%A5.html 思路 #include <stdio.h> #include <stdlib.h>#define MAX_N 1000// 并查集结构体 typedef struct {int parent[MAX_N 1]; // 存储每个节点的父节点int rank…

RHCE——DNS域名解析服务器

1、DNS简介 DNS是互联网上的一项服务&#xff0c;它作为将域名和IP地址相互映射的一个分布式 数据库&#xff0c;能够使人更方便的访问互联网。 &#xff08;1&#xff09;因特网的域名结构 因特网在命名时采用的是层次树状结构的命名方法。任何一个连接在 因特网上的主机或路…

librdns一个开源DNS解析库

原文地址&#xff1a;librdns一个开源DNS解析库 – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 介绍 librdns是一个开源的异步多功能插件式的解析器&#xff0c;用于DNS解析。 源代码地址&#xff1a;GitHub - vstakhov/librdns: Asynchrono…

mybatis学习(一)

声明&#xff1a;该内容来源于动力节点&#xff0c;本人在学习mybatis过程中参考该内容&#xff0c;并自己做了部分笔记&#xff0c;但个人觉得本人做的笔记不如动力节点做的好&#xff0c;故使用动力节点的笔记作为后续mybatis的复习。 一、MyBatis概述 1.1 框架 在文献中看…

Mistral推出“Le Chat”,对标ChatGPT

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Flink的Standalone集群模式安装部署

一.Flink模式介绍 Flink支持多种安装模式。 local&#xff08;本地&#xff09;——本地模式 standalone——独立模式&#xff0c;Flink自带集群&#xff0c;开发测试环境使用 standaloneHA—独立集群高可用模式&#xff0c;Flink自带集群&#xff0c;开发测试环境使用 ya…