HBase 源码阅读(三)创建表流程

前言

上两篇介绍了HMaster完整进程的启动,现在开始介绍一下HMaster创建表的流程

1. 创建表的流程

下面这一部分通过ChatGPT来生成

在 HBase 中,通过 Java 编写创建表的过程涉及多个组件和源码的位置。这里为您详细解析这个过程涉及的主要类和方法。

  1. API 层级的调用:

    • 用户首先会使用 HTableDescriptor 类来定义表的结构,包括表名、列族等信息。
    • HBaseAdmin 类用于管理 HBase 的表操作,如创建、删除表等。创建表的操作主要通过 HBaseAdmin.createTable(HTableDescriptor) 方法实现。
  2. 客户端到服务器的通信:

    • HBaseAdmin.createTable() 被调用时,这个请求会被发送到 HBase 的 Master 服务器。
    • 这个过程中,HConnection 接口的实现类会被用来与 HBase 集群进行通信。具体通信过程由 RpcClient 实现,它处理底层的网络请求。

    上面的过程不是本内容所需要修改的,注意下面的内容

  3. Master 服务器处理:

    • 在 HBase Master 服务器端,HMaster 类接收到创建表的请求。
    • HMaster 中的 createTable 方法处理这些请求。具体的代码路径是 org.apache.hadoop.hbase.master.HMaster 类的 createTable 方法。
  4. 元数据的更新与表的创建:

    • 创建表涉及到修改元数据,这一操作通过 MetaTableAccessor 类来完成(这一部分也不需要修改)。
    • 元数据存储在名为 hbase:meta 的特殊表中,MetaTableAccessor 提供了操作这张表的方法。
  5. ZooKeeper的协调:

    • HBase 使用 ZooKeeper 来处理服务器之间的协调和状态同步。(不需要修改
    • 在表创建过程中,相关的协调信息(如表的状态和可用性)会被更新到 ZooKeeper 中。
  6. Region 的分配与启动:

    • 表创建后,表的初始 region 需要被创建并分配给相应的 RegionServer。
    • 这一过程涉及 AssignmentManager 类,它负责 region 的分配和管理。
  7. 最终的 RegionServer 处理:

    • RegionServer 接收到 region 分配的指令后,通过 HRegion 类来实际创建 region。
    • HRegion 类中处理数据存储和访问的逻辑。

2. 所以最终需要注意的内容

最终需要修改的位置,应该是在RegionServer中

3.文件插入过程

HTable 类:

  • put() 方法:用于插入数据。当调用 put() 方法时,数据首先会被写入到客户端的缓冲区,然后批量写入到服务器。
  • 文件位置:org.apache.hadoop.hbase.client.HTable

HRegion 类:

  • put() 方法:在 HRegion 类中,实际上处理了数据写入到具体的 Region 的逻辑。
  • 文件位置:org.apache.hadoop.hbase.regionserver.HRegion

MemStore 和 WAL:

  • 当数据被写入到 RegionServer 时,首先记录到 WAL (Write-Ahead Log),然后存储在 MemStore 中。MemStore 是基于内存的数据结构,它按照 LSM 树的思想进行设计。
  • MemStore 类: 文件位置通常在 org.apache.hadoop.hbase.regionserver.MemStore
  • WAL 的实现: 查看 org.apache.hadoop.hbase.regionserver.wal 包下的文件。

数据刷新和 Compaction:

  • 当 MemStore 的数据达到一定阈值时,它会被刷新到磁盘上形成一个新的 StoreFile。这个过程涉及数据的排序和合并,符合 LSM 树的操作模式。
  • Store 类和 StoreFile 类:
    • 数据刷新和文件管理是在 Store 类中处理的。
    • 文件位置:org.apache.hadoop.hbase.regionserver.Store
    • StoreFile 管理存储到磁盘的文件,文件位置:org.apache.hadoop.hbase.regionserver.StoreFile

Compaction 的处理:

  • Compaction 是 LSM 树中一个重要的过程,它负责合并多个 StoreFile 减少读放大和空间占用。这在 Compactor 类中实现。
  • 文件位置:org.apache.hadoop.hbase.regionserver.compactions.Compactor

4. 其他

MemStore 和 WAL:

  • 当数据被写入到 RegionServer 时,首先记录到 WAL (Write-Ahead Log),然后存储在 MemStore 中。MemStore 是基于内存的数据结构,它按照 LSM 树的思想进行设计。
  • MemStore 类: 文件位置通常在 org.apache.hadoop.hbase.regionserver.MemStore
  • WAL 的实现: 查看 org.apache.hadoop.hbase.regionserver.wal 包下的文件。

数据刷新和 Compaction:

  • 当 MemStore 的数据达到一定阈值时,它会被刷新到磁盘上形成一个新的 StoreFile。这个过程涉及数据的排序和合并,符合 LSM 树的操作模式。
  • Store 类和 StoreFile 类:
    • 数据刷新和文件管理是在 Store 类中处理的。
    • 文件位置:org.apache.hadoop.hbase.regionserver.Store
    • StoreFile 管理存储到磁盘的文件,文件位置:org.apache.hadoop.hbase.regionserver.StoreFile

Compaction 的处理:

  • Compaction 是 LSM 树中一个重要的过程,它负责合并多个 StoreFile 减少读放大和空间占用。这在 Compactor 类中实现。
  • 文件位置:org.apache.hadoop.hbase.regionserver.compactions.Compactor

5. 下一步的工作内容

  1. HMaster :createTable函数
    1. 是否最开始就涉及分区的功能,答案:默认给定一个分区
    2. 创建表的函数
  2. 假设用户使用HTable API调用put操作,向服务器中一个完全没有数据的表插入数据,此时HRegion会怎么确定应该分配给集群中的哪一个节点,写入通过WAL后,又是怎么存在该节点的MemStore中的呢
    1. 在最开始创建的时候,初始时,表至少有一个 Region,这个 Region 在表创建时就已经分配了。(createTabel函数
    2. 需要put()写入的定位,通过沟通hbase:meta表沟通
  3. 根据MemStore找到存储的地点
  4. 找到完整的写入流程
  5. 循环测试找到 MemStore 写入到StoreFile、Store类的逻辑

6. HMaster.createTable()

分配Table的Region

  1. 查看表结构表述起
  2. 获取表的命名空间
  3. 获取表相关的随机Region信息
  4. 检查表是否符合一些合理的限制,并且配置的值是否正确
  5. 提交该程序

7. HMaster.createTable()的提交程序进程

  // 提交该程序return MasterProcedureUtil// 提交创建表的任务// NonceProcedureRunnable:这是一个用于确保操作唯一性的工具类。nonceGroup和nonce是两个参数,代表唯一标识符,防止重复提交相同的创建表请求。// this:当前的HMaster实例,被传递给NonceProcedureRunnable以访问主服务器的上下文和资源。.submitProcedure(new MasterProcedureUtil.NonceProcedureRunnable(this, nonceGroup, nonce) {@Overrideprotected void run() throws IOException {// 执行表创建前的协处理器预创建表getMaster().getMasterCoprocessorHost().preCreateTable(desc, newRegions);LOG.info(getClientIdAuditPrefix() + " create " + desc);// TODO: We can handle/merge duplicate requests, and differentiate the case of// TableExistsException by saying if the schema is the same or not.//// We need to wait for the procedure to potentially fail due to "prepare" sanity// checks. This will block only the beginning of the procedure. See HBASE-19953.// 同步工具,确保在提交创建表过程之前,必要的检查和准备工作已完成。createBlockingLatch()方法创建了一个阻塞闩锁。ProcedurePrepareLatch latch = ProcedurePrepareLatch.createBlockingLatch();// 提交一个创建表过程submitProcedure(new CreateTableProcedure(procedureExecutor.getEnvironment(), desc, newRegions, latch));// 阻塞当前线程,等待CreateTableProcedure过程完成初步的准备工作,latch.await();// 执行表创建后的协处理器钩子:该钩子允许在表创建后执行自定义的逻辑,例如通知其他系统或执行后续处理getMaster().getMasterCoprocessorHost().postCreateTable(desc, newRegions);}@Override// 返回这个过程的描述信息,有助于通过日志查看记录protected String getDescription() {return "CreateTableProcedure";}});}

7.1 协处理器的意义

在HBase中,协处理器(Coprocessor)被广泛用于扩展和定制HBase的行为,以满足特定的业务需求。协处理器提供了一种在不修改HBase核心代码的情况下,实现自定义逻辑的机制。具体到创建表的过程,使用协处理器而非普通进程具有以下几个重要原因:

1. 灵活的扩展性

协处理器是HBase提供的一个扩展机制,允许开发者在HBase的标准操作中插入自定义逻辑。通过协处理器,用户可以在表的创建过程之前或之后执行特定的操作,例如:

  • 验证表的元数据是否符合业务规则。
  • 根据表的创建情况触发外部系统的操作(如更新监控系统、通知其他服务等)。
  • 记录审计日志,以追踪表的创建过程。

这些操作如果通过协处理器来实现,HBase的核心代码就不需要为每个特定需求进行修改。这样可以使HBase保持通用性,而具体的业务逻辑则通过协处理器灵活地加以实现。

2. 保持代码的简洁和模块化

直接在普通进程中添加自定义的创建表逻辑,会使代码变得复杂和难以维护。协处理器提供了一种模块化的方式,将自定义逻辑与核心的表创建过程分离。通过这种方式,核心代码可以专注于HBase的标准操作,而不需要考虑各种可能的自定义需求。

3. 可插拔的架构

HBase的协处理器架构是可插拔的。用户可以根据需要加载或卸载协处理器,并且可以在不重启HBase的情况下动态调整。这使得通过协处理器实现的自定义逻辑具有更高的灵活性和可管理性。相比之下,如果直接使用普通进程,则每次修改自定义逻辑都可能需要修改、编译和重新部署整个HBase服务。

4. 一致性和事务支持

协处理器的执行与HBase的标准操作是紧密结合的,这意味着它们可以参与到HBase的事务中,确保数据操作的一致性。例如,在表创建过程中,preCreateTable钩子在创建表的主要逻辑之前执行,postCreateTable钩子则在表创建成功后执行。如果其中任何一步失败,整个表创建操作可以回滚,以确保系统的一致性。

5. 分布式环境下的统一处理

HBase集群是一个分布式系统,协处理器可以在分布式环境下统一处理不同节点上的操作逻辑。例如,表创建操作可能涉及多个RegionServer上的数据分布和索引更新,通过协处理器可以统一管理这些操作,从而简化分布式环境下的编程复杂度

8. CreatTableProduce类

该类的所在位置

package org.apache.hadoop.hbase.master.procedure;
public class CreateTableProcedureextends AbstractStateMachineTableProcedure<CreateTableState>

继承的抽象类

说明CreatTableProduce是一个基于状态机的程序

该类是通过一个Runnable类来初始化的,最开始调用他的构造器之后之后

  // 调用public CreateTableProcedure(final MasterProcedureEnv env,final TableDescriptor tableDescriptor, final RegionInfo[] newRegions,final ProcedurePrepareLatch syncLatch) {// 设置Env和同步锁存器super(env, syncLatch);this.tableDescriptor = tableDescriptor;this.newRegions = newRegions != null ? Lists.newArrayList(newRegions) : null;}
   */protected AbstractStateMachineTableProcedure(final MasterProcedureEnv env,final ProcedurePrepareLatch latch) {// 设置用户以及设置该创建表的所有者if (env != null) {this.user = env.getRequestUser();this.setOwner(user);}// used for compatibility with clients without procedures// they need a sync TableExistsException, TableNotFoundException, TableNotDisabledException, ...this.syncLatch = latch;}

8.1 此时

  1. 表创建请求提交后
  • 当你通过 HBase API 提交了一个创建表的请求时,这个请求会被包装成一个 CreateTableProcedure 对象,并被提交给 HBase 的 ProcedureExecutor

  • ProcedureExecutor 是一个异步执行引擎,它负责调度并执行所有提交的 Procedure 对象。

  1. 调度执行
  • ProcedureExecutor 会在它的内部线程池中异步地执行 CreateTableProcedure,这时候 executeFromState 方法开始执行。
  1. 状态机驱动
    • CreateTableProcedure 是一个基于状态机的过程。executeFromState 方法会根据当前的状态(CreateTableState)来决定执行什么操作。
    • 每个状态代表了表创建过程中的一个步骤,如验证表是否存在、在文件系统上创建表的布局、将表信息写入 META 表、分配 Regions 等。
  2. 执行每个状态的具体操作
    • executeFromState 方法中,根据当前的状态,执行相应的操作。每个操作完成后,设置下一个要执行的状态(通过 setNextState 方法),直到整个创建过程完成。
  3. 重复执行直到完成
    • ProcedureExecutor 会不断调度 CreateTableProcedure,使其逐步完成所有的状态,并最终完成表的创建。
    • 一旦所有状态都完成,executeFromState 方法返回 Flow.NO_MORE_STATE,表示表的创建过程结束。

至此表创建的所有流程结束

Note

参考本文章记得引用哦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/419535.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构与算法 | 灵神题单 | 删除链表篇】力扣3217, 82, 237

总结&#xff0c;删除链表节点问题使用到列表&#xff0c;哈希表&#xff0c;递归比较容易超时&#xff0c;我觉得使用计数排序比较稳&#xff0c;处理起来也不是很难。 1. 力扣3217&#xff1a;从链表中移除在数组中的节点 1.1 题目&#xff1a; 给你一个整数数组 nums 和一…

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP 我们在网络的应用层中可以自己定义协议&#xff0c;但是&#xff0c;已经有大佬定义了一些现成的&#xff0c;非常好用的应用层协议&#xff0c;供我们直接使用&#xff0c;HTTP&#xff08;超文本传输协议&#xff09;就是其中之一。 在互…

yolo算法小结

文章目录 yolov1工作原理限制 yolov2网络结构改进点 yolov3改进点 yolov4网络结构图改进点 yolov5改进点 参考资料 YOLO的核心思想是将物体检测视为一个回归问题&#xff0c;它不采用传统的区域提议方法&#xff0c;而是通过单一的神经网络对整个图像进行预测。这意味着YOLO只需…

C/C++两点坐标求距离以及C++保留两位小数输出,秒了

目录 1. 前言 2. 正文 2.1 问题 2.2 解决办法 2.2.1 思路 2.2.2 代码实现 3. 备注 1. 前言 依旧是带来一个练手的题目&#xff0c;目的就一个&#xff0c;方法千千万&#xff0c;通向终点的方式有很多种&#xff0c;没有谁与谁&#xff0c;我们都是为了成为更好的自己。…

使用亚马逊Bedrock的Stable Diffusion XL模型实现文本到图像生成:探索AI的无限创意

引言 什么是Amazon Bedrock&#xff1f; Amazon Bedrock是亚马逊云服务&#xff08;AWS&#xff09;推出的一项旗舰服务&#xff0c;旨在推动生成式人工智能&#xff08;AI&#xff09;在各行业的广泛应用。它的核心功能是提供由顶尖AI公司&#xff08;如AI21 Labs、Anthropic…

python中的循环结构

注意&#xff1a;range&#xff08;&#xff09;函数 累加和&#xff1a; 注意&#xff1a;if 下面如果有好几行&#xff0c;只执行一行 print必须和 for 开头相同格数 例题&#xff1a;水仙花数 注意在print语句中&#xff0c;一句好“ 。。。。。 ”后面必须有逗号然后再写变…

C++(一)----C++基础

1.C的发展史 C语言诞生后&#xff0c;很快普及使用&#xff0c;但是随着编程规模增大且越来越复杂&#xff0c;并且需要高度的抽象和建模时&#xff0c;C语言的诸多短板便表现了出来&#xff0c;为了解决软件危机&#xff0c;上世纪八十年代&#xff0c;计算机界提出了oop&…

linux top命令介绍以及使用

文章目录 介绍 top 命令1. top 的基本功能2. 如何启动 top3. top 的输出解释系统概况任务和 CPU 使用情况内存和交换空间进程信息 4. 常用操作 总结查看逻辑CPU的个数查看系统运行时间 介绍 top 命令 top 是一个在类 Unix 系统中广泛使用的命令行工具&#xff0c;用于实时显示…

WebGL系列教程二(环境搭建及初始化Shader)

目录 1 前言2 新建html页面3 着色器介绍3.1 顶点着色器、片元着色器与光栅化的概念3.2 声明顶点着色器3.3 声明片元着色器 4 坐标系(右手系)介绍5 着色器初始化5.1 给一个画布canvas5.2 获取WebGL对象5.3 创建着色器对象5.4 获取着色器对象的源5.5 绑定着色器的源5.6 编译着色器…

ChatGPT 3.5/4.0使用手册:解锁人工智能的无限潜能

1. 引言 在人工智能的浪潮中&#xff0c;ChatGPT以其卓越的语言理解和生成能力&#xff0c;成为了一个革命性的工具。它不仅仅是一个聊天机器人&#xff0c;更是一个能够协助我们日常工作、学习和创造的智能伙伴。随着ChatGPT 3.5和4.0版本的推出&#xff0c;其功能和应用范围…

windows电脑自动倒计时关机

今天聊一聊其他的。我时不时的有一个需求&#xff0c;是关于在windows电脑上定时关机。 不知道怎么地&#xff0c;我好几次都忘了这个自动定时关机的终端命令&#xff0c;于是每一次都要去网上查。 1.鼠标右击【开始菜单】选择【运行】或在键盘上按【 WinR】快捷键打开运行窗口…

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大&#xff0c;需要补充太多的知识点&#xff0c;教授讲得内容跨越较大&#xff0c;一般一节课的内容是书本上的一章节内容&#xff0c;所以看视频比较吃力&#xff0c;需要先预习课本内容后才能够很好的理解教授讲…

网络学习-eNSP配置VRRP

虚拟路由冗余协议(Virtual Router Redundancy Protocol&#xff0c;简称VRRP) VRRP广泛应用在边缘网络中&#xff0c;是一种路由冗余协议&#xff0c;它的设计目标是支持特定情况下IP数据流量失败转移不会引起混乱&#xff0c;允许主机使用单路由器&#xff0c;以及即使在实际…

模版的价值工程

我们在做什么 工作吗 最终不过是在做模版工程模版&#xff0c;最终会进化 沦为后世的参考文档。仅此而已&#xff01; 或者已经沦为了文档类别 其他&#x1f4c4; 最终我们会选择EXIT 指令 尽快它是 window桌面 我们只是图像 人字&#x1f31f;的&#x1f9a3; &#x1f631;…

leveldb源码剖析(二)——LSM Tree

LSM Tree LSM Tree&#xff1a;Log-Structured Merge Tree&#xff0c;日志结构合并树。是一种频繁写性能很高的数据结构。 LSM Tree将写入操作与合并操作分离&#xff0c;数据首先写入磁盘中的日志文件&#xff08;WAL&#xff09;&#xff0c;随后写入内存缓存&#xff0c;…

Adobe After Effects的插件--------CC Particle World

CC Particle World是一个粒子效果器,用于在三维空间中生成和模拟各种粒子系统,包括火焰、雨、雪、爆炸、烟雾等等。它会自动随时间变化发射粒子。 本文部分参照 https://www.163.com/dy/article/IEJVDN760536FE6V.html 使用条件 使用该插件的图层需是2D图层。 我们新建一个…

Matlab simulink建模与仿真 第十一章(端口及子系统库)【上】

参考视频&#xff1a;simulink1.1simulink简介_哔哩哔哩_bilibili 一、端口及子系统库中的模块概览 注&#xff1a;In模块、Out模块和Subsystem模块在第二章中均有介绍&#xff0c;本章不再赘述&#xff1b;Subsystem Examples子系统实例模块也不进行介绍。 二、使能及其子模…

camtasia2024破解版本安装包网盘下载 附带永久激活码秘钥

Camtasia 2024 &#x1f31f; 新功能大揭秘&#xff0c;让你轻松成为视频制作达人&#xff01; 嘿&#xff0c;亲爱的小红薯们&#xff01;&#x1f44b; 今天我要给大家介绍一款超实用的视频编辑软件——Camtasia 2024。这款软件可是让我的视频制作技能瞬间提升了不止一个档次…

《数字信号处理》学习05-单位冲击响应与系统响应

目录 一&#xff0c;单位冲激响应 二&#xff0c;LTI系统对任意序列的系统响应 三&#xff0c;LTI系统的性质 通过上一篇文章《数字信号处理》学习04-离散时间系统中的线性时不变系统-CSDN博客的学习&#xff0c;我已经知道了离散时间线性时不变系统&#xff08;LTI&#x…

Linux系统本地化部署Dify并安装Ollama运行llava大语言模型详细教程

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…