第 4 章 HBase 进阶

news2024/11/18 5:41:48

第 4 章 HBase 进阶

  • 4.1 Master 架构
    • 1)Meta 表格介绍:(警告:不要去改这个表)
  • 4.2 RegionServer 架构
    • 1)MemStore
    • 2)WAL(预写日志)
    • 3)BlockCache
  • 4.3 写流程
    • 2)写流程:
  • 4.4 MemStore Flush
  • 4.5 读流程
    • 4.5.1 HFile 结构
    • 4.5.2 读流程
    • 4.5.3 合并读取数据优化
  • 4.6 StoreFile Compaction
  • 4.7 Region Split
    • 4.7.1 预分区(自定义分区)
      • 1)手动设定预分区
      • 2)生成 16 进制序列预分区
      • 3)按照文件中设置的规则预分区
      • 4)使用 JavaAPI 创建预分区
    • 4.7.2 系统拆分

4.1 Master 架构

在这里插入图片描述

1)Meta 表格介绍:(警告:不要去改这个表)

全称 hbase:meta,只是在 list 命令中被过滤掉了,本质上和 HBase 的其他表格一样。

RowKey:

  • ([table],[region start key],[region id]) 即 表名,region 起始位置和 regionID。

列:

  • info:regioninfo 为 region 信息,存储一个 HRegionInfo 对象。
  • info:server 当前 region 所处的 RegionServer 信息,包含端口号。
  • info:serverstartcode 当前 region 被分到 RegionServer 的起始时间。

如果一个表处于切分的过程中,即 region 切分,还会多出两列 info:splitA 和 info:splitB,
存储值也是 HRegionInfo 对象,拆分结束后,删除这两列。

注意:在客户端对元数据进行操作的时候才会连接 master,如果对数据进行读写,直接连接
zookeeper 读取目录/hbase/meta-region-server 节点信息,会记录 meta 表格的位置。直接读
取即可,不需要访问 master,这样可以减轻 master 的压力,相当于 master 专注 meta 表的
写操作,客户端可直接读取 meta 表。

在 HBase 的 2.3 版本更新了一种新模式:Master Registry。客户端可以访问 master 来读取
meta 表信息。加大了 master 的压力,减轻了 zookeeper 的压力。

4.2 RegionServer 架构

在这里插入图片描述

1)MemStore

写缓存,由于 HFile 中的数据要求是有序的,所以数据是先存储在 MemStore 中,排好
序后,等到达刷写时机才会刷写到 HFile,每次刷写都会形成一个新的 HFile,写入到对应的
文件夹 store 中。

2)WAL(预写日志)

由于数据要经 MemStore 排序后才能刷写到 HFile,但把数据保存在内存中会有很高的
概率导致数据丢失,为了解决这个问题,数据会先写在一个叫做 Write-Ahead logfile 的文件
中,然后再写入 MemStore 中。所以在系统出现故障的时候,数据可以通过这个日志文件重
建。

3)BlockCache

读缓存,每次查询出的数据会缓存在 BlockCache 中,方便下次查询。

4.3 写流程

在这里插入图片描述

2)写流程:

写流程顺序正如 API 编写顺序,首先创建 HBase 的重量级连接

  1. (1)首先访问 zookeeper,获取 hbase:meta 表位于哪个 Region Server;
  2. (2)访问对应的 Region Server,获取 hbase:meta 表,将其缓存到连接中,作为连接属
    性 MetaCache,由于 Meta 表格具有一定的数据量,导致了创建连接比较慢;
    之后使用创建的连接获取 Table,这是一个轻量级的连接,只有在第一次创建的时候会
    检查表格是否存在访问 RegionServer,之后在获取 Table 时不会访问 RegionServer;
  3. (3)调用Table的put方法写入数据,此时还需要解析RowKey,对照缓存的MetaCache,
    查看具体写入的位置有哪个 RegionServer;
  4. (4)将数据顺序写入(追加)到 WAL,此处写入是直接落盘的,并设置专门的线程控
    制 WAL 预写日志的滚动(类似 Flume);
  5. (5)根据写入命令的 RowKey 和 ColumnFamily 查看具体写入到哪个 MemStory,并且
    在 MemStory 中排序;
  6. (6)向客户端发送 ack;
  7. (7 )等达到 MemStore 的刷写时机后,将数据刷写到对应的 story 中。

4.4 MemStore Flush

MemStore 刷写由多个线程控制,条件互相独立:
主要的刷写规则是控制刷写文件的大小,在每一个刷写线程中都会进行监控

(1)当某个 memstroe 的大小达到了 hbase.hregion.memstore.flush.size(默认值 128M),
其所在 region 的所有 memstore 都会刷写。
当 memstore 的大小达到了

  • hbase.hregion.memstore.flush.size(默认值 128M)
  • hbase.hregion.memstore.block.multiplier(默认值 4)

时,会刷写同时阻止继续往该 memstore 写数据(由于线程监控是周期性的,所有有可能面
对数据洪峰,尽管可能性比较小)

(2)由 HRegionServer 中的属性 MemStoreFlusher 内部线程 FlushHandler 控制。标准为
LOWER_MARK(低水位线)和 HIGH_MARK(高水位线),意义在于避免写缓存使用过多的内
存造成 OOM
当 region server 中 memstore 的总大小达到低水位线

java_heapsize
*hbase.regionserver.global.memstore.size(默认值 0.4)
*hbase.regionserver.global.memstore.size.lower.limit(默认值 0.95),

region 会按照其所有 memstore 的大小顺序(由大到小)依次进行刷写。直到 region server
中所有 memstore 的总大小减小到上述值以下。

当 region server 中 memstore 的总大小达到高水位线

java_heapsize
*hbase.regionserver.global.memstore.size(默认值 0.4)
时,会同时阻止继续往所有的 memstore 写数据。

(3)为了避免数据过长时间处于内存之中,到达自动刷写的时间,也会触发 memstore
flush。由 HRegionServer 的属性 PeriodicMemStoreFlusher 控制进行,由于重要性比较低,5min才会执行一次。

自动刷新的时间间隔由该属性进行配置 hbase.regionserver.optionalcacheflushinterval(默认1 小时)。

(4)当 WAL 文件的数量超过 hbase.regionserver.max.logs,region 会按照时间顺序依次
进行刷写,直到 WAL 文件数量减小到 hbase.regionserver.max.log 以下(该属性名已经废弃,
现无需手动设置,最大值为 32)。

4.5 读流程

4.5.1 HFile 结构

在了解读流程之前,需要先知道读取的数据是什么样子的。

HFile 是存储在 HDFS 上面每一个 store 文件夹下实际存储数据的文件。里面存储多种内
容。包括数据本身(keyValue 键值对)、元数据记录、文件信息、数据索引、元数据索引和
一个固定长度的尾部信息(记录文件的修改情况)。

键值对按照块大小(默认 64K)保存在文件中,数据索引按照块创建,块越多,索引越
大。每一个 HFile 还会维护一个布隆过滤器(就像是一个很大的地图,文件中每有一种 key,
就在对应的位置标记,读取时可以大致判断要 get 的 key 是否存在 HFile 中)。

在这里插入图片描述

由于 HFile 存储经过序列化,所以无法直接查看。可以通过 HBase 提供的命令来查看存
储在 HDFS 上面的 HFile 元数据内容。

[atguigu@hadoop102 hbase]$ bin/hbase hfile -m -f /hbase/data/命名空间/表名/regionID/列族/HFile 名

4.5.2 读流程

在这里插入图片描述
创建连接同写流程。

(1)创建 Table 对象发送 get 请求。
(2)优先访问 Block Cache,查找是否之前读取过,并且可以读取 HFile 的索引信息和
布隆过滤器。
(3)不管读缓存中是否已经有数据了(可能已经过期了),都需要再次读取写缓存和
store 中的文件。
(4)最终将所有读取到的数据合并版本,按照 get 的要求返回即可。

4.5.3 合并读取数据优化

每次读取数据都需要读取三个位置,最后进行版本的合并。效率会非常低,所有系统需
要对此优化。

(1)HFile 带有索引文件,读取对应 RowKey 数据会比较快。
(2)Block Cache 会缓存之前读取的内容和元数据信息,如果 HFile 没有发生变化(记
录在 HFile 尾信息中),则不需要再次读取。
(3)使用布隆过滤器能够快速过滤当前 HFile 不存在需要读取的 RowKey,从而避免读
取文件。(布隆过滤器使用 HASH 算法,不是绝对准确的,出错会造成多扫描一个文件,对
读取数据结果没有影响)

4.6 StoreFile Compaction

由于 memstore 每次刷写都会生成一个新的 HFile,文件过多读取不方便,所以会进行文
件的合并,清理掉过期和删除的数据,会进行 StoreFile Compaction。

会对应产生有一个version版本号,来记录当前一共修改/操作过多少次

Compaction 分为两种,分别是 Minor Compaction 和 Major Compaction。Minor Compaction
将临近的若干个较小的 HFile 合并成一个较大的 HFile,并清理掉部分过期和删除的数据,
有系统使用一组参数自动控制,Major Compaction 会将一个 Store 下的所有的 HFile 合并成
一个大 HFile
,并且会清理掉所有过期和删除的数据,由参数 hbase.hregion.majorcompaction
控制,默认 7 天。

在这里插入图片描述

Minor Compaction 控制机制:

参与到小合并的文件需要通过参数计算得到,有效的参数有 5 个
(1)hbase.hstore.compaction.ratio(默认 1.2F)合并文件选择算法中使用的比率。
(2)hbase.hstore.compaction.min(默认 3) 为 Minor Compaction 的最少文件个数。
(3)hbase.hstore.compaction.max(默认 10) 为 Minor Compaction 最大文件个数。
(4)hbase.hstore.compaction.min.size(默认 128M)为单个 Hfile 文件大小最小值,小于这
个数会被合并。
(5)hbase.hstore.compaction.max.size(默认 Long.MAX_VALUE)为单个 Hfile 文件大小最大
值,高于这个数不会被合并。

小合并机制为拉取整个 store 中的所有文件,做成一个集合。之后按照从旧到新的顺序遍历。

判断条件为:
① 过小合并,过大不合并
② 文件大小/ hbase.hstore.compaction.ratio < (剩余文件大小和) 则参与压缩。所有把比值设
置过大,如 10 会最终合并为 1 个特别大的文件,相反设置为 0.4,会最终产生 4 个 storeFile。
不建议修改默认值
③ 满足压缩条件的文件个数达不到个数要求(3 <= count <= 10)则不压缩。

4.7 Region Split

Region 切分分为两种,创建表格时候的预分区即自定义分区,同时系统默认还会启动一
个切分规则,避免单个 Region 中的数据量太大。

4.7.1 预分区(自定义分区)

每一个 region 维护着 startRow 与 endRowKey,如果加入的数据符合某个 region 维护的
rowKey 范围,则该数据交给这个 region 维护。那么依照这个原则,我们可以将数据所要投
放的分区提前大致的规划好,以提高 HBase 性能。

1)手动设定预分区

create 'staff1','info', SPLITS => ['1000','2000','3000','4000']

2)生成 16 进制序列预分区

create 'staff2','info',{NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}

3)按照文件中设置的规则预分区

(1)创建 splits.txt 文件内容如下:

aaaa
bbbb
cccc
dddd

(2)然后执行:

create 'staff3', 'info',SPLITS_FILE => 'splits.txt'

4)使用 JavaAPI 创建预分区

在这里插入图片描述

package com.atguigu.hbase;
import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
public class HBaseConnect {
 public static void main(String[] args) throws IOException {
 // 1.获取配置类
 Configuration conf = HBaseConfiguration.create();
 // 2.给配置类添加配置
 
conf.set("hbase.zookeeper.quorum","hadoop102,hadoop103,hadoop104"
);
 // 3.获取连接
 Connection connection = 
ConnectionFactory.createConnection(conf);
 // 3.获取 admin
 Admin admin = connection.getAdmin();
 // 5.获取 descriptor 的 builder
 TableDescriptorBuilder builder = 
TableDescriptorBuilder.newBuilder(TableName.valueOf("bigdata", 
"staff4"));
 // 6. 添加列族
 
builder.setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(
Bytes.toBytes("info")).build());
 // 7.创建对应的切分
 byte[][] splits = new byte[3][];
 splits[0] = Bytes.toBytes("aaa");
 splits[1] = Bytes.toBytes("bbb");
 splits[2] = Bytes.toBytes("ccc");
 // 8.创建表
 admin.createTable(builder.build(),splits);
 // 9.关闭资源
 admin.close();
 connection.close();
 }
}

4.7.2 系统拆分

  • Region 的拆分是由 HRegionServer 完成的,在操作之前需要通过 ZK 汇报 master,修改
    对应的 Meta 表信息添加两列 info:splitA 和 info:splitB 信息。
  • 之后需要操作 HDFS 上面对应的文件,按照拆分后的 Region 范围进行标记区分,实际操作为创建文件引用,不会挪动数据。
  • 刚完成拆分的时候,两个 Region 都由原先的 RegionServer 管理。
  • 之后汇报给 Master,由Master将修改后的信息写入到Meta表中。
  • 等待下一次触发负载均衡机制,才会修改Region的管理服务者,而数据要等到下一次压缩时,才会实际进行移动。

不管是否使用预分区,系统都会默认启动一套 Region 拆分规则。不同版本的拆分规则
有差别。系统拆分策略的父类为 RegionSplitPolicy

0.94 版本之前 => ConstantSizeRegionSplitPolicy

( 1 ) 当 1 个 region 中 的 某 个 Store 下 所 有 StoreFile 的 总 大 小 超 过
hbase.hregion.max.filesize (10G),该 Region 就会进行拆分。

0.94 版本之后,2.0 版本之前 => IncreasingToUpperBoundRegionSplitPolicy

( 2 ) 当 1 个 region 中 的 某 个 Store 下 所 有 StoreFile 的 总 大 小 超 过
Min(initialSizeR^3 ,hbase.hregion.max.filesize"),该 Region 就会进行拆分。其中 initialSize 的
默认值为 2
hbase.hregion.memstore.flush.size,R 为当前 Region Server 中属于该 Table 的
Region 个数(0.94 版本之后)。

在这里插入图片描述

(3)Hbase 2.0 引入了新的 split 策略:如果当前 RegionServer 上该表只有一个 Region,
按照 2 * hbase.hregion.memstore.flush.size 分裂,否则按照 hbase.hregion.max.filesize 分裂。
这叫大道至简,学海抽丝。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用kubeadm搭建生产环境的多master节点k8s高可用集群

环境centos 7.9 目录 1.对安装 k8s 的节点进行初始化配置 2 通过 keepalivednginx 实现 k8s apiserver 节点高可用 3、kubeadm 初始化 k8s 集群 4.扩容 k8s 控制节点&#xff0c;把 xuegod62 加入到 k8s 集群 5、扩容 k8s 控制节点&#xff0c;把 xuegod64 加入到 k8s 集群…

06_Uboot顶层Makefile分析_前期所做内容

目录 U-Boot顶层Makefile分析 版本号 MAKEFLAGS变量 命令输出 静默输出 设置编译结果输出目录 代码检查 模块编译 获取主机架构和系统 设置目标架构、交叉编译器和配置文件 调用scripts/Kbuild.include 交叉编译工具变量设置 导出其他变量 U-Boot顶层Makefile分析…

Kafka架构原理(三)

三、Kafka架构原理 3.1 整体架构图 一个典型的kafka集群中包含若干个Producer&#xff0c;若干个Broker&#xff0c;若干个Consumer&#xff0c;以及一个zookeeper集群&#xff1b; kafka通过zookeeper管理集群配置&#xff0c;选举leader&#xff0c;以及在Consumer Group发…

软件多语言文案脚本自动化方案

开发高效提速系列目录 软件多语言文案脚本自动化方案 软件多语言文案脚本自动化方案 背景目标整体方案1. 创建文案资源文件2. python脚本开发3. Python脚本执行与管理4. 人员职责分配 PyCharm使用说明1. PyCharm下载2. PyCharm安装配置3. 异常情况解决 总结 博客创建时间&…

中间件漏洞(一)CVE-2013-4547(文件名逻辑漏洞)

目录 1. 了解nginx的工作原理 2. 漏洞原理及举例分析 3. 前端php源码分析 4. 注入思路 5. 漏洞复现 5.1 上传文件并抓包分析 5.2 通过访问文件执行php 注意一点 6. 漏洞修复 1. 了解nginx的工作原理 nginx是以PHP语言为主。像Apache一样&#xff0c;Nginx自身是不支持解…

基于黏菌算法的极限学习机(ELM)回归预测-附代码

基于黏菌算法的极限学习机(ELM)回归预测 文章目录 基于黏菌算法的极限学习机(ELM)回归预测1.极限学习机原理概述2.ELM学习算法3.回归问题数据处理4.基于黏菌算法优化的ELM5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;本文利用黏菌算法对极限学习机进行优化&#xff0c;并…

国民技术N32G430开发笔记(15)- IAP升级 树莓派串口发送数据

IAP升级 树莓派串口发送数据 1、树莓派接入usb转串口模块后&#xff0c;会生成/dev/ttyUSB0节点&#xff0c;因为树莓派内核已经编译usb_serial以及各模块的驱动。 我们直接对ttyUSB0节点编程即可。 2、协议同上一节 cmd data_lenght data0 … datax checksum 1、获取版本…

AutoDL-GPU租用平台使用(LLM 备用)

网址&#xff1a;AutoDL-品质GPU租用平台-租GPU就上AutoDL 1 打开网址 查看下显卡型号及价格&#xff1a;A100 ( 80 G 显存) 6.68/小时 、4090&#xff08;24G 显存&#xff09;2.68/小时 2 创建实例 1.注册登录后进入控制台&#xff08;页面右上角&#xff09;&#xff0…

08 KVM虚拟机配置-总体介绍

文章目录 08 KVM虚拟机配置-总体介绍8.1 概述8.2 基本格式8.3 配置流程 08 KVM虚拟机配置-总体介绍 8.1 概述 Libvirt工具采用XML格式的文件描述一个虚拟机特征&#xff0c;包括虚拟机名称、CPU、内存、磁盘、网卡、鼠标、键盘等信息。用户可以通过修改配置文件&#xff0c;对…

【应急响应】日志自动提取分析项目ELKLogkitLogonTracerAnolog等

日志自动提取-七牛Logkit&观星应急工具 1、七牛Logkit&#xff1a;(Windows&Linux&Mac等) https://github.com/qiniu/logkit/ 支持的数据源&#xff08;各类日志&#xff0c;各个系统&#xff0c;各个应用等&#xff09; File: 读取文件中的日志数据&#xff0c;包…

第二章 主机规划与磁盘分区

要安装好一部Linux主机并不是那么简单的事情&#xff0c;你必须要针对distributions的特性、服务器软件的能力、未来的升级需求、硬件扩充性需求等等来考虑&#xff0c;还得要知道磁盘分区、文件系统、Linux操作较频繁的目录等等&#xff0c;都得要有一定程度的了解才行。 2.1…

训练CV模型常用的Tips Tricks

训练CV模型常用的Tips & Tricks主要从以下9个方面进行介绍&#xff1a; 图像增强更好的模型学习率和scheduler优化器正则化手段标签平滑知识蒸馏伪标签错误分析 1. 图像增强 以下列出了许多增强方式&#xff0c;有的甚至没见过&#xff0c;但是也不是每一种增强方式都是…

极化码的入门与探索

文章目录 极化码的基础先验知识二进制输入离散无记忆信道模型(Binary-input Discreten Memoryless Channel, B-DMC)二进制离散输入信道的ML判决和错误率B-DMC相关参数的定义和理解 两信道极化N信道极化的解释信道极化分解的蝶形结构补充&#xff1a;生成矩阵的结构 极化码的基础…

Python算法设计 - 快速排序

目录 一、快速排序二、Python算法实现 一、快速排序 快速排序的概念相信大家都能理解&#xff0c;下面这个算法是基于同样想法的另一种算法&#xff0c;其中利用到了分区。如果实施正确&#xff0c;这是一种非常有效的算法&#xff0c;在预期的O(n.log n) 时间内运行&#xff…

性能测试场景分析并设计?超细案例讲解,看这篇就够了

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试场景&…

1.1 基于B/S 结构的 Web 应用

文章目录 1.1 基于B/S 结构的 Web 应用1.2 JDK安装与配置1.3 服务器Tomcat下载与安装1.4 Eclipse安装与使用1.4.1 Eclipse 下载及创建Dynamic Web Project1.4.2 Eclipse 中的编码问题1.4.3 将Tomcat和Eclipse相关联1.4.4 Eclipse 自动部署项目到 Tomcat 的 webapps 目录 1.5 My…

ChatGLM-6B模型微调实战(以 ADGEN (广告生成) 数据集为例)

1 介绍 对于 ChatGLM-6B 模型基于 P-Tuning v2 的微调。P-Tuning v2 将需要微调的参数量减少到原来的 0.1%&#xff0c;再通过模型量化、Gradient Checkpoint 等方法&#xff0c;差不多需要 7GB或则8GB 显存即可运行。 2 环境 2.1 python 环境 conda create -n py310_cha…

go 打包文件夹成zip文件

go 打包文件夹成zip文件 代码有些乱&#xff0c;找不到合适的例子&#xff0c;和优雅的代码 当前代码打包文件是在 需要打包的目录下&#xff0c;测试的时候注意文件翻倍容量 writer, err : zzip.CreateHeader(header) //这里创建文件时注意不要用完整路径 zip中会生产完整路径…

【51单片机】蜂鸣器

&#x1f38a;专栏【51单片机】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Love Story】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; &#x1f354;效果 &#xff08;注意听声音哦&#xff09; 按…

Blob File

文章目录 学习链接Blob创建演示 分片演示 Fileinput手动拖拽fetch 从后端获取流前端代码后端代码 window.showOpenFilePicker Filereader示例1示例2 ArrayBuffer创建bufferTypedArray读写bufferDataView读写buffer与Blob对比 Blob Url & DataUrl示例1示例2 学习链接 Blog …