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

2023-12-03 09:28
文章标签 数据 hbase 列族

本文主要是介绍【大数据】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 刷写:
在这里插入图片描述

这篇关于【大数据】HBase 中的列和列族的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/448936

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

pandas数据过滤

Pandas 数据过滤方法 Pandas 提供了多种方法来过滤数据,可以根据不同的条件进行筛选。以下是一些常见的 Pandas 数据过滤方法,结合实例进行讲解,希望能帮你快速理解。 1. 基于条件筛选行 可以使用布尔索引来根据条件过滤行。 import pandas as pd# 创建示例数据data = {'Name': ['Alice', 'Bob', 'Charlie', 'Dav

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者