【大数据】HBase 中的列和列族

😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!

HBase 中的列和列族

  • 1.HBase 的数据模型
    • 1.1 HBase 逻辑结构
    • 1.2 HBase 物理存储结构
  • 2.HBase 与关系型数据库的对比
  • 3.HBase 是怎样存储数据的
    • 3.1 宏观架构
    • 3.2 RegionServer
    • 3.3 Region
    • 3.4 WAL
      • 3.4.1 如何启用 WAL
      • 3.4.2 异步写入 WAL
      • 3.4.3 WAL 滚动
      • 3.4.4 WAL 归档和删除
    • 3.5 Store

1.HBase 的数据模型

在逻辑上,HBase 的数据模型同关系型数据库很类似,数据存储在一张表中,有行有列。但从 HBase 的底层物理存储结构(K-V)来看,HBase 更像是一个 multi-dimensional map

1.1 HBase 逻辑结构

先从一个逻辑结构模型图开始看起:

在这里插入图片描述

  • Table):一个表由一个或者多个列族构成。数据的属性。比如:nameageTTL(超时时间)等等都在列族里边定义。定义完列族的表是个空表,只有添加了数据行以后,表才有数据。
  • Column Family列族):在 HBase 里,可以将多个列组合成一个列族。建表的时候不用创建列,因为列是可增减变化的,非常灵活。唯一需要确定的就是列族,也就是说 一个表有几个列族是一开始就定好的。此外表的很多属性,比如数据过期时间、数据块缓存以及是否使用压缩等都是定义在列族上的,而不是定义在表上或者列上。这一点与以往的关系型数据库有很大的差别。列族存在的意义是:HBase 会把相同列族的列尽量放在同一台机器上,所以说想把某几个列放在一台服务器上,只需要给他们定义相同的列族
  • Row):一个行包含多个列,这些列通过列族来分类。行中的数据所属的列族从该表所定义的列族中选取,不能选择这个表中不存在的列族。由于 HBase 是一个面向列存储的数据库,所以一个行中的数据可以分布在不同的服务器上。
  • RowKey行键):RowKey 和 MySQL 数据库的主键比起来简单很多,RowKey 必须要有,如果用户不指定的话,会有默认的。RowKey 完全由是用户指定的一串不重复的字符串,另外,RowKey 按照字典序排序。一个 RowKey 对应的是一行数据!!!
  • Region:Region 就是一段数据的集合。之前提到过高表的概念,把高表进行水平切分,假设分成两部分,那么这就形成了两个 Region。注意一下 Region 的几个特性:
    • Region 不能跨服务器,一个 RegionServer 可以有多个 Region。
    • 数据量小的时候,一个 Region 可以存储所有的数据;但是当数据量大的时候,HBase 会拆分 Region。
    • 当 HBase 在进行负载均衡的时候,也有可能从一台 RegionServer 上把 Region 移动到另一服务器的 RegionServer 上。
    • Region 是基于 HDFS 的,它的所有数据存取操作都是调用 HDFS 客户端完成的。
  • RegionServer:RegionServer 就是存放 Region 的容器,直观上说就是服务器上的一个服务。负责管理维护 Region,详细情况后边再说!

1.2 HBase 物理存储结构

以上是一个基本的逻辑结构,底层的物理存储结构才是重中之重的内容,看下图,并且将尝试换个角度解释上边的几个概念:

在这里插入图片描述
具体来说:

  • NameSpace命名空间,类似于关系型数据库的 DatabBase 概念,每个命名空间下有多个表。HBase 有两个自带的命名空间,分别是 hbasedefaulthbase 中存放的是 HBase 内置的表,default 表是用户默认使用的命名空间。
  • Row:HBase 表中的每行数据都由一个 RowKey 和多个 Column(列)组成,数据是按照 RowKey 的字典顺序存储的,并且查询数据时只能根据 RowKey 进行检索,所以 RowKey 的设计十分重要。
  • Column:列,HBase 中的每个列都由 Column Family列族)和 Column Qualifier列限定符)进行限定,例如 info: nameinfo: age。建表时,只需指明列族,而列限定符无需预先定义。
  • TimeStamp:时间戳,用于标识数据的不同版本(version),每条数据写入时,如果不指定时间戳,系统会自动为其加上该字段,其值为写入 HBase 的时间。
  • Cell单元格,由 {RowKey, Column Family: Column Qualifier, TimeStamp} 唯一确定的单元。Cell 中的数据是没有类型的,全部是字节码形式存贮。

2.HBase 与关系型数据库的对比

传统关系型数据库的表结构图如下:

在这里插入图片描述
其中每行都是不可分割的,也正是体现了数据库 第一范式 的原子性,也就是说三个列必须在一起,而且要被存储在同一台服务器上,甚至是同一个文件里面。

HBase 的表架构如图所示:

在这里插入图片描述
HBase 的每一个行都是离散的,因为列族的存在,所以一个行里不同的列甚至被分配到了不同的服务器上。行的概念被减弱到了一个抽象的存在。在实体上,把多个列定义为一个行的关键词 RowKey,也就是行这个概念在 HBase 中的唯一体验。

HBase 的存储语句中必须精确的写出要将数据存放到哪个单元格,单元格由 表 : 列族 : 行 : 列 来唯一确定。用人话说就是要写清楚数据要被存储在哪个表的哪个列族的哪个行的哪个列。如果一行有 10 10 10 列,那么存储一行的数据就需要写明 10 10 10 行的语句。

3.HBase 是怎样存储数据的

如果上边所有的概念还是不甚清楚,那么接下来的架构深入探索将会让你有一个更透彻的理解。

HBase 是一个数据库,那么数据肯定是以某种实体形式存储在硬盘上的,先来看一下 HBase 是怎样存储数据的。使用 “显微镜” 逐步放大 HBase 的架构,从最宏观的 Master 和 RegionServer 结构,一直到最小的单元格 Cell。一边使用图示直观的感受,一边配上文字解释说明!!!

3.1 宏观架构

宏观架构图示如下:

在这里插入图片描述
从这张图上可以看到是一个 HBase 集群由一个 Master(也可配置成多个,HA)和多个 RegionServer 组成,之后再详细介绍 RegionServer 的架构。上面的图示说明了 HBase 的服务器角色构成,下边给出具体的介绍:

  • Master:负责启动的时候分配 Region 到具体的 RegionServer,执行各种管理操作,比如 Region 的分割与合并。在 HBase 中,Master 的角色地位比其他类型的集群弱很多。数据的读写操作与它没有关系,它挂了之后,集群照样运行。具体的原因后边后详细介绍。但是 Master 也不能宕机太久,有很多必要的操作,比如创建表、修改列族配置,以及更重要的分割与合并都需要它的操作。
  • RegionServer:RegionServer 就是一台机器,在它上边有多个 Region。我们读写的数据就存储在 Region 中。
  • Region:它是表拆分出来的一部分,HBase 是一个会自动切片的数据库。当数据库过高时,就会进行拆分。
  • HDFS:HBase 的数据存储是基于 HDFS 的,它是真正承载数据的载体。
  • Zookeeper:在本集群中负责存储 hbase:meata 的位置存储信息,客户端在写数据时需要先读取元数据信息。

3.2 RegionServer

在宏观架构图的最后一个 RegionServer 中可以看到 ,它的内部是多个 Region 的集合:

在这里插入图片描述
现在我们放大一下这个 RegionServer 的内部架构:

在这里插入图片描述
从这幅图中我们可以看到一个 RegionServer 包含一下几个部分,详细说一说:

  • 一个 WAL:WAL 是 Write-Ahead Log 的缩写,翻译为 预写入日志。从名字大概也能猜出它的作用,当操作到达 Region 的时候,HBase 先把操作写入到 WAL 中,然后把数据放入到基于内存实现的 MemStore 中,等到一定的时机再把数据刷写形成 HFile 文件,存储到 HDFS 上。WAL 是一个保险机制,数据在写到 MemStore 之前被先写到 WAL 中,这样如果在刷写过程中出现事故,可以从 WAL 恢复数据。
  • 多个 Region:Region 已经多次提到了,它就是数据库的一部分,每一个 Region 都有起始的 RowKey 和结束的 RowKey,代表了它存储的 Row 的范围。

3.3 Region

我们再放大Region的内部结构:

在这里插入图片描述
从图中可以看的出来,一个 Region 包含

  • 多个 Store:一个 Region 有多个 Store,其实一个 Store 就是对应一个列族的数据,如图就有三个列族。从最后一个 Store 中我们又可以看出,Store 是由 MemStoreHFile 组成的,后边会有详细说明。

3.4 WAL

预写入日志 就是设计来解决宕机之后的操作恢复问题的,WAL 是保存在 HDFS 上的持久化文件。数据到达 Region 的时候,先写入 WAL,然后被加载到 MemStore 中。这样就算 Region 宕机了,操作没来得及执行持久化,也可以再重启的时候从 WAL 加载操作并执行。

3.4.1 如何启用 WAL

WAL 是默认开启的,也可以手动关闭它,这样增删改操作会快一点。但是这样做牺牲的是数据的安全性,所以不建议关闭。

关闭方法:

Mutation.setDurability(Durability.SKIP_WAL)

3.4.2 异步写入 WAL

如果不惜通过关闭 WAL 来提高性能的话,还可以考虑一下折中的方案:异步写入 WAL

正常情况下,客户端提交的 putdeleteappend 操作来到 Region 的时候,先调用 HDFS 的客户端写到 WAL 中。哪怕只有一个改动,也会调用 HDFS 的接口来写入数据。可以想象到,这种方式尽可能的保证了数据的安全性,代价是频繁的消耗资源。

如果不想关闭 WAL,又不想每次都耗费那么大的资源,每次改动都调用 HDFS 客户端,可以选择异步的方式写入 WAL:

Mutation.setDurability(Durability.ASYNC_WAL)

这样设定以后,Region 会等到条件满足的时候才将操作写到 WAL。这里的条件指的是隔多久,写一次,默认的时间间隔是 1 1 1 s。

如果异步写入数据的时候出错了怎么办呢?比如客户端的操作现在在 Region 内存中,由于时间间隔未到 1 1 1 s,操作还没来得及写入到 WAL,Region 挂了(邪门不?就差那么一丢丢不到 1 1 1 s)。出错了是没有任何事务可以保证的。

3.4.3 WAL 滚动

之前学习过 MapReduce 的 shuffle 机制,所以猜得到 WAL 是一个唤醒的滚动日志数据结构,因为这种结构不会导致占用的空间持续变大,而且写入效率也最高。

通过 WAL 日志切换,这样可以避免产生单独的过大的 WAL 日志文件,这样可以方便后续的日志清理(可以将过期日志文件直接删除)。另外如果需要使用日志进行恢复时,也可以同时解析多个小的日志文件,缩短恢复所需时间。

WAL 的检查间隔由 hbase.regionserver.logroll.period 定义,默认值是一个小时。检查的内容是把当前 WAL 中的操作跟实际持久化到 HDFS 上的操作做比较,看哪些操作已经被持久化了,如果已经被持久化了,该 WAL 就会被移动到 HDFS 上的 .oldlogs 文件夹下。

一个 WAL 实例包含多个 WAL 文件。WAL 文件的最大数量可以手动通过参数配置。

其它的触发滚动的条件是:

  • WAL 的大小超过了一定的阈值。
  • WAL 文件所在的 HDFS 文件块快要满了。

3.4.4 WAL 归档和删除

归档:WAL 创建出来的文件都会放在 /hbase/.log 下,在 WAL 文件被定为归档时,文件会被移动到 /hbase/.oldlogs 下。
删除:判断此 WAL 文件是否不再需要,是否没有被其他引用指向这个 WAL 文件。

会引用此文件的服务:

  • TTL 进程:该进程会保证 WAL 文件一直存活,直到达到 hbase.master.logcleaner.ttl 定义的超时时间(默认 10 10 10 分钟)为止。
  • 备份机制replication):如果你开启了 HBase 的备份机制,那么 HBase 要保证备份集群已经完全不需要这个 WAL 文件了,才会删除这个 WAL 文件。这里提到的 replication 不是文件的备份数,而是 0.90 0.90 0.90 版本加入的特性,这个特性用于把一个集群的数据实时备份到另外一个集群。如果你的手头就一个集群,可以不用考虑这个因素。

只有当该 WAL 文件没有被以上两种情况引用的时候,才会被系统彻底清除掉。

3.5 Store

解释完了 WAL,放大一下 Store 的内部架构:

在这里插入图片描述
Store 有两个重要的部分:

  • MemStore:每个 Store 都有一个 MemStore 实例。数据写入到 WAL 之后就会被放入 MemStore 中。MemStore 是内存的存储对象,只有到达一定的时机才会被刷写到 HFile 中去。什么时机呢?后边详细说明,这篇笔记主要记录架构方面的内容。
  • HFile:在 Store 中有多个 HFile,每次刷写都会形成一个 HFile 文件落盘在 HDFS 上。HFile 直接跟 HDFS 打交道,它是数据存储的实体。

这里提出一点疑问:

客户端的操作到达 Region 时,先将数据写到 WAL 中,而 WAL 是存储在 HDFS 上的。所以就相当于数据已经持久化了,那么为什么还要从 WAL 加载到 MemStore 中,再刷写形成 HFile 存到 HDFS 上呢?

简单的说就是:数据进入 HFile 之前就已经被持久化了,为什么还要放入 MemStore?

这是因为 HDFS 支持文件的创建、追加、删除,但是不能修改。对于一个数据库来说,数据的顺序是非常重要的。第一次 WAL 的持久化是为了保证数据的安全性,无序的。再读取到 MemStore 中,是为了排序后存储。所以 MemStore 的意义在于维持数据按照 RowKey 的字典序排列,而不是做一个缓存提高写入效率。

补一张图,对比着来看,关于 MemStore 刷写:
在这里插入图片描述

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

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

相关文章

类和对象(上篇)

类和对象 面向过程和面向对象的区别:结构体变为类类的一些性质类的访问限定符类的实体化类对象的大小this指针 面向过程和面向对象的区别: C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决…

第8关:定义一个名为PROC_AVGWEIGHT的有参数存储过程

USE mydata; #请在此处添加实现代码 ########## Begin ########## DELIMITER $ CREATE PROCEDURE PROC_AVGWEIGHT(IN SNO VARCHAR(10), IN JNO VARCHAR(10), OUT AVG_WEIGHT INT) BEGINSELECT ROUND(SUM(P.WEIGHT * SPJ.QTY) / SUM(SPJ.QTY)) INTO AVG_WEIGHTFROM PJOIN SPJ ON…

16.字符串处理函数——字符串长度函数

文章目录 前言一、题目描述 二、解题 程序运行代码 总结 前言 本系列为字符串处理函数编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 二、解题 程序运行代码 #include<stdio.h> #include<string.h> int main() {char str[ ]"0123\0456…

rank的相关loss

1、相关loss 1.1、loss相关简介 排序优化时&#xff0c;主要从三个角度来考虑构建loss&#xff0c;分别为pointwise、pairwise、listwise。pointwise将排序所有query当成一个整体&#xff0c;计算每个<query,doc>对的loss,相当于一个二分问题。pairwise以每个query为维…

Sailfish OS 移动操作系统

Jolla 是一家曾经致力于开发智能手机和平板电脑的公司&#xff0c;但是这些产品并没有取得成功。后来 Jolla 将重心转向了基于 Linux 的 Sailfish OS&#xff08;旗鱼&#xff09;&#xff0c;并将其应用于现有设备上。Sailfish OS 是由 Jolla 在 MeeGo 基础上开发的移动操作系…

开源播放器GSYVideoPlayer + ViewPager2 源码解析

开源播放器GSYVideoPlayer ViewPager2 源码解析 前言一、GSYVideoPlayer&#x1f525;&#x1f525;&#x1f525;是什么&#xff1f;二、源码解析1.ViewPager2Activity 总结 前言 本文介绍GSYVideoPlayer源码中关于ViewPager2 GSYVideoPlayer 实现的滑动播放列表的实现原理。…

【PTA题目】7-18 6翻了 分数 15

7-18 6翻了 分数 15 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 “666”是一种网络用语&#xff0c;大概是表示某人很厉害、我们很佩服的意思。最近又衍生出另一个数字“9”&#xff0c;意思是“6翻了”&#xff0c;实在太厉害的意思。如果你以为这就是厉害的最高境界&…

合成相机模型【图形学】

相机在计算机图形学中有两个方面的考虑&#xff1a;相机的位置和相机的形状。 要了解后者&#xff0c;我们需要了解相机的工作原理。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - R…

聊聊测试for Jeffky

什么是测试 测试是一个系统性的过程&#xff0c;它涉及到在已开发的软件中执行程序、应用工具和技术来评估其质量、功能和性能。这个过程的目的是发现并纠正程序中的错误&#xff0c;提高软件的可靠性和稳定性&#xff0c;以满足用户的需求。 测试的分类 什么是自动化测试 自动…

MySQL 教程 1.5

MySQL 创建数据表 创建 MySQL 数据表需要以下信息&#xff1a; 表名表字段名定义每个表字段的数据类型 语法 以下为创建 MySQL 数据表的 SQL 通用语法&#xff1a; CREATE TABLE table_name (column1 datatype,column2 datatype,... ); table_name 是你要创建的表的名称。…

多表查询与子查询

问题的引出&#xff1a; 这里有一个留言板&#xff0c;其中一条评论包含了商品名称good&#xff08;商品表&#xff09;&#xff0c;留言content(留言表)。 那么请问如将这个评论从数据库查询出来&#xff1f;这就涉及到了多表查询。 多表查询是指基于两个和两个以上的表查询.…

idea通过remote远程调试云服务器

引用了第三方的包&#xff0c;调试是看不到运行流程&#xff0c;于是想到了idea的remote方法 -agentlib:jdwptransportdt_socket,servery,suspendn,address9002 写一个.sh文件并启动 nohup java -jar -agentlib:jdwptransportdt_socket,servery,suspendn,address9002 ./demo.j…

论文解读--Robust lane detection and tracking with Ransac and Kalman filter

使用随机采样一致性和卡尔曼滤波的鲁棒的车道线跟踪 摘要 在之前的一篇论文中&#xff0c;我们描述了一种使用霍夫变换和迭代匹配滤波器的简单的车道检测方法[1]。本文扩展了这项工作&#xff0c;通过结合逆透视映射来创建道路的鸟瞰视图&#xff0c;应用随机样本共识来帮助消…

基于算能的国产AI边缘计算盒子8核心A53丨17.6Tops算力

边缘计算盒子 8核心A53丨17.6Tops算力 ● 可提供17.6TOPS&#xff08;INT8&#xff09;的峰值计算能力、2.2TFLOPS&#xff08;FP32&#xff09;的高精度算力&#xff0c;单芯片最高支持32路H.264 & H.265的实时解码能力。 ● 适配Caffe/TensorFlow/MxNet/PyTorch/ ONNX/…

倒计时 1 天,2023 IoTDB 用户大会期待与您相见!

终于&#xff01;就在明天&#xff0c;2023 IoTDB 用户大会即将在北京与大家见面&#xff01; 这场筹备已久的盛会&#xff0c;汇集了超 20 位大咖嘉宾带来的精彩议题&#xff0c;届时来自美国国家工程院、清华大学软件学院的产业大拿&#xff0c;与能源电力、钢铁冶炼、城轨运…

康托展开(Cantor Expansion)

【康托展开简介】康托展开&#xff08;Cantor Expansion&#xff09;是一种特殊的哈希函数&#xff0c;是一个相对快速的判重方法&#xff0c;其时间复杂度为O(n^2)&#xff0c;其中 n 是集合中元素的个数。康托展开能够判重&#xff0c;依据的是一个集合各元素产生的全部排列中…

翻译: GPT4等大型语言模型的原理解析和未来预测慢思考和模型自我迭代和LLM安全

YouTube: Intro to Large Language Models - YouTube 1. Large Language Model LLM 大家好&#xff0c;最近我做了一个关于大型语言模型的 30 分钟演讲&#xff0c;有点像介绍性演讲&#xff0c;不幸的是&#xff0c;那个演讲没有被录制下来&#xff0c;但很多人在演讲结束后…

企业计算机服务器locked1勒索病毒数据恢复,locked1勒索病毒解密流程

随着计算机技术的不断发展&#xff0c;越来越多的企业走向数字化办公时代&#xff0c;计算机技术为企业的生产运营提供了有利条件&#xff0c;但也为企业带来了网络安全威胁。在本月&#xff0c;云天数据恢复中心陆续接到很多企业的求助&#xff0c;企业的速达办公软件遭到了lo…

Linux周期任务

我自己博客网站里的文章 Linux周期任务&#xff1a;at和crontab 每个人或多或少都有一些约会或者是工作&#xff0c;有的工作是长期周期性的&#xff0c; 例如&#xff1a; 每个月一次的工作报告每周一次的午餐会报每天需要的打卡…… 有的工作则是一次性临时的&#xff0…

面试数据库八股文十问十答第二期

面试数据库八股文十问十答第二期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1.MySQL的主从复制 MySQL的主从复制是什么&#xff1f;MySQL主从复制是一种常见的…