高阶面试-hbase的整理

背景

冷热分离需要用到hbase,冷数据较多,需求:

  1. 存放上亿数据
  2. 支持简单的组合关键字查询
  3. 存放数据不需要变更

基本存储数据结构

HBase可以被看作是一个稀疏的多维度Map(映射),稀疏的、分布式、多维的Map,将行键(Row Key)、列族(Column Family)、列限定符(Column Qualifier)和时间戳(Timestamp)映射到一个值(Value)

数据模型

如下数据如何存储?表users,包含两个列族personal_infocontact_info

![[Pasted image 20240612235231.png]]

实际存储结构:

Row Key: user1
    Column Family: personal_info
        Column Qualifier: name -> Value: Alice
        Column Qualifier: age -> Value: 30
    Column Family: contact_info
        Column Qualifier: email -> Value: alice@example.com
        Column Qualifier: phone -> Value: 123-456-7890

Row Key: user2
    Column Family: personal_info
        Column Qualifier: name -> Value: Bob
        Column Qualifier: age -> Value: 25
    Column Family: contact_info
        Column Qualifier: email -> Value: bob@example.com
        Column Qualifier: phone -> Value: 987-654-3210

每一个RowKey、TimeStamp以及Key-Value值就是一个Cell

  • 行键 (Row Key): 唯一标识每一行数据,例如user1user2
  • 列族 (Column Family): 数据按列族进行物理存储,例如personal_infocontact_info
  • 列限定符 (Column Qualifier): 列族下的具体列,例如nameageemailphone
  • 时间戳 (Timestamp): 记录数据的版本,HBase支持多个版本的值,默认为服务器写入数据的时间。
  • 值 (Value): 存储的实际数据,例如Alice30alice@example.com

ColumnFamily一开始就要定义好,类似于关系型数据库里面的列,属于schema,每个ColumnFamily可以灵活增加ColumnQualifier,ColumnQualifier不需要在创建表的时候定义

物理存储模型

根据RowKey的范围划分成多个Region

  1. 一个表会被水平切割成多个Region
  2. 一个Region会包含多个Row,包含startkey和endkey之间所有连续的行。每个Region的大小默认会控制在1GB内。每个表一开始只有二个 Region,随着数据不断插入到表中,Region 不断增大,当增大到一个阈值的时候,Region 就会等分为两个新的 Region
  3. 每个Region包含着多个Store对象。每个Store包含一个MemStore或若干StoreFile,StoreFile包含一个或多个HFile。MemStore存放在内存中,StoreFile存储在HDFS上
  4. 一个MemStore会存储一个ColumnFamily,一个MemStore会把数据写入多个HFile
  5. 一个RegionServer会服务多个Region

![[Pasted image 20240613081011.png]]

Table: users

Region 1 (RowKey: user1 - user1000)
    |-- Store (Column Family: personal_info)
    |    |-- MemStore
    |    |-- HFile
    |
    |-- Store (Column Family: contact_info)
         |-- MemStore
         |-- HFile

Region 2 (RowKey: user1001 - user2000)
    |-- Store (Column Family: personal_info)
    |    |-- MemStore
    |    |-- HFile
    |
    |-- Store (Column Family: contact_info)
         |-- MemStore
         |-- HFile

分布式环境

Master 主要负责表 Region 的管理工作,包括分配 Region 给 Region Server,协调多个 Region Server,检测各个 Region Server 的状态,并平衡 Region Server 之间的负载。

Region Server 是 HBase 最核心的模块,包含多个 Region,负责维护 Master 分配给它的 Region 集合,并处理对这些 Region 的读写操作,Client 直接与 Region Server 连接,并经过通信获取 HBase 中的数据。Region Server 需要向 HDFS 写入数据。

Zookeeper 作用:

  1. 是 HBase Master 的高可用性(High Available,HA)解决方案,保证了至少有一个 HBase Master 处于运行状态。
  2. 负责 Region 和 Region Server 的注册,Master 就可以通过 Zookeeper 随时感知各个 Region Server 的工作状态

![[Pasted image 20240613081021.png]]

数据写入流程

  1. 写请求:客户端向HBase发送写请求。
  2. 具体client访问zk读取元数据,根据namespace、表名、rowkey找到数据对应region,访问region对应regionServer
  3. 写入WAL:数据首先写入WAL(WriteAheadLog),以确保数据不会因为RegionServer故障而丢失,每个regionServer都会维护一个WAL文件(也是基于HDFS),所有写操作现将变动添加到WAL文件末尾。
  4. 写入MemStore:数据被写入MemStore,当MemStore达到一定大小时,会触发一次flush操作。
  5. Flush到HFile:MemStore的数据被写入HFile,存储在HDFS上。
  6. Compaction:随着时间推移,HBase会执行合并操作(Compaction),将多个小的HFile合并成一个大的HFile,以提高读性能。

数据读取流程

  1. 查找MemStore:首先在MemStore中查找数据。
  2. 查找BlockCache:如果数据不在MemStore中,接下来在BlockCache中查找。
  3. 查找HFile:如果数据既不在MemStore也不在BlockCache中,则查找HFile。
  4. 返回数据:找到数据后,返回给客户端。如果在HFile中找到数据,则将数据块缓存到BlockCache中,以加快后续的读取操作

HFile的结构

数据块(Data Block)

- 存储实际的数据,包含多个KeyValue对。
- 每个数据块都可以进行压缩,以减少存储空间和提高读写效率。
  • 索引块(Index Block)

    • 存储数据块的索引信息,用于加快数据查找。
    • HFile包含一个元索引块(Meta Index Block),指向索引块的位置。
  • 元数据块(Meta Block)

    • 存储额外的元数据信息,例如文件信息、统计信息等
HDFS
├── DataNode 1
│   ├── /hbase/data/default/users/region1/store1/hfile1
│   ├── /hbase/data/default/users/region1/store2/hfile2
│   └── ...
├── DataNode 2
│   ├── /hbase/data/default/users/region2/store1/hfile3
│   ├── /hbase/data/default/users/region2/store2/hfile4
│   └── ...
├── DataNode 3
│   ├── /hbase/data/default/users/region3/store1/hfile5
│   ├── /hbase/data/default/users/region3/store2/hfile6
│   └── ...
└── ...


HFile:
    ├── Data Block 1
    │   ├── KeyValue1
    │   ├── KeyValue2
    │   └── ...
    ├── Data Block 2
    │   ├── KeyValue3
    │   ├── KeyValue4
    │   └── ...
    ├── ...
    ├── Index Block
    │   ├── Index Entry 1
    │   ├── Index Entry 2
    │   └── ...
    └── Meta Block
        ├── Meta Entry 1
        ├── Meta Entry 2
        └── ...

表结构的设计

rowkey设计:
md5[cumstomeremail]+ticketId

columnFamily: ColumnFamily:i
为什么只整一个?
因为官方不推荐两个以上的columnFamily,原因:memstore刷新到HFile的动作叫flushing,flushing的操作是region级别,也就是只要有一个columnFamily满了就需要刷新,可能另外一个还很空,增加不必要的IO操作
ColumnKey: 剩余字段都设为i列簇下的Key
![[Pasted image 20240614080719.png]]

工单处理记录表,将处理记录转为json,保存在一个columnKey中

参考

https://www.cnblogs.com/zkteam/p/11877286.html

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

常用图片处理操作

静态图片文件转base64 import base64 with open(1.png, rb) as f:source f.read() base64_img base64.b64encode(source)base64转静态图片文件 imgdata base64.b64decode(base64_img)# 将图片保存为文件 with open("new.png", wb) as f:f.write(imgdata)PS:这里…

精密空气加热器负载组

小型便携式 :精密空气加热器(负载组)能够对数据中心热通道/冷通道冷却系统进行全面测试。EAK 是一款 19 英寸机架式设备(10U 高),可轻松安装到各种标准服务器机架中。通过集成可调节的热量水平(…

【计算机毕业设计】061互助学习微信小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

Redis学习——Redisson 分布式锁集成及其简单使用

文章目录 引言1. Redisson概述1.1 Redisson的基本概念1.2 Redisson的主要功能1.3 Redisson的优点 2. 开发环境3. Redisson的安装与配置3.1 添加依赖3.2 配置Redisson 4. 使用Redisson4.1 可重入锁4.1.1 可重入锁的概念4.1.2 可重入锁的实现原理4.1.3 简单使用锁的获取和释放 4.…

无线麦克风哪个品牌音质最好,一篇看懂无线领夹麦克风怎么挑选

在数字化时代背景下,直播和个人视频日志(Vlog)已成为新的文化现象,这些趋势不仅重塑了内容创作,也促进了音频设备市场的繁荣。无线领夹麦克风,以其设计上的轻便和录音上的高效率,成为视频创作者…

手把手带你薅一台云服务器

前两篇,带着大家在自己本地搞了一台 Linux 虚拟机: 【保姆级教程】Windows上安装Linux子系统,搞台虚拟机玩玩【保姆级教程】Windows 远程登陆 Linux 服务器的两种方式:SSH VS Code,开发必备 问题来了:本…

nacos漏洞小结

Alibaba Nacos是阿里巴巴推出来的一个新开源项目,是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。致力于帮助发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,可以快速实现动态服务发现、服务配置、服务元数据及流量管理…

51单片机第18步_将TIM0用作13位定时器

本章重点学习将TIM0用作13位定时器。 1、定时器0工作在模式0框图 2、定时器0工作在模式0举例 1、Keil C51中有一些关键字,需要牢记: interrupt 0:指定当前函数为外部中断0; interrupt 1:指定当前函数为定时器0中断…

onInterceptTouchEvent() 与 onTouch() 事件分析

前言 本文主要分析 onTouch() 与 onTouchEvent() 事件的差异 正文 先看布局文件&#xff1a; <?xml version"1.0" encoding"utf-8"?> <com.longzhiye.intercepttouch.MyFrameLayout xmlns:android"http://schemas.android.com/apk/res…

PointNet++论文导读

PointNet论文导读 主要改进网络结构&#xff1a;非均匀采样下的特征学习的鲁棒性利用点特征传播处理数据集分割 论文链接:https://arxiv.org/abs/1612.00593 主要改进 PointNet的基本思想是学习每个点的空间编码&#xff0c;然后将所有单个点的特征聚合成一个全局点云标签&am…

模块化编程(二)

模块的导入 经常有这样一句话&#xff1a;“不要重复造轮子”&#xff0c;知道别人已经造好了轮子&#xff0c;并且轮子也好用&#xff0c;那就直接拿别人的轮子来用&#xff0c;此处的“模块导入”就是“拿别人的轮子过来”。前文提到模块化编程的好处之一就是“代码复用性高…

【6.26更新】Win10 22H2 19045.4598镜像:免费下载!

当前微软已经发布了六月最新的KB5039299更新补丁&#xff0c;用户完成升级后&#xff0c;系统版本号将更新至19045.4598。此次更新解决了任务栏上应用跳转列表失败、可能导致系统无法从休眠状态恢复等多个问题&#xff0c;推荐大家升级。如果您不知道去哪里才能下载到该版本&am…

mac|tableau public 仪表盘使用

对华东地区的利润进行仪表盘可视化 选择下面的功能表的新建仪表盘,把上面的表1表2放入其中 通过下图操作将两个表联合起来&#xff0c;即上图使用筛选器时下面的表随之改变 将上图设置为筛选器&#xff0c;可以通过点击地区查看数据

防护用品穿戴自动监测摄像机

随着技术的不断发展&#xff0c;防护用品穿戴自动监测摄像机作为现代安全监控领域的创新应用&#xff0c;正逐渐成为各类工作场所和特定环境中的重要设备。这种摄像机不仅能够实时记录和监控员工的工作状态和安全情况&#xff0c;还能提供数据支持和预警功能&#xff0c;显著提…

第四十篇——系统论:如何让整体效用大于部分之和?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 系统论&#xff0c;又从一个大的生态的角度去考虑&#xff0c;我们应该如…

贪心问题(POJ1700/1017/1065)(C++)

一、贪心问题 贪心算法 贪心算法&#xff08;greedy algorithm&#xff09;&#xff0c;是用计算机来模拟一个「贪心」的人做出决策的过程。这个人十分贪婪&#xff0c;每一步行动总是按某种指标选取最优的操作。而且他目光短浅&#xff0c;总是只看眼前&#xff0c;并不考虑…

CSS 背景添加白色小圆点样式

css也是开发过程中不可忽视的技巧 此专栏用来纪录不常见优化页面样式的css代码 效果图: 未添加之前: 代码: background: radial-gradient(circle at 1px 1px, #3d3c3c 2px, transparent 0);background-size: 20px 25px;

在AvaotaA1全志T527开发板上烧录AvaotaOS固件

烧写到 TF 卡上 材料准备 首先需要准备的材料有: SD-Card Formatter&#xff1a;balenaEtcherAvaota Pi - A1开发板 x1TF-Card ( 不小于4Gb ) x112V-DC电源适配器 x1TF读卡器 x1USBTTL Splitter x1&#xff08;可选&#xff09;HDMI 采集卡 x1 &#xff08;可选&#xff09;…

体验升级:扫描全能王智能高清滤镜2.0全面测评

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

MSPM0G3507——串口

配置&#xff1a; 主函数: #include "ti_msp_dl_config.h"volatile uint8_t gEchoData 0; int main(void) {SYSCFG_DL_init();NVIC_ClearPendingIRQ(UART_0_INST_INT_IRQN); //先清除中断&#xff0c;防止直接进中断NVIC_EnableIRQ(…
最新文章