分布式数据库HBase(林子雨慕课课程)

文章目录

    • 4. 分布式数据库HBase
      • 4.1 HBase简介
      • 4.2 HBase数据模型
      • 4.3 HBase的实现原理
      • 4.4 HBase运行机制
      • 4.5 HBase的应用方案
      • 4.6 HBase安装和编程实战

4. 分布式数据库HBase

4.1 HBase简介

  • HBase是BigTable的开源实现

image-20231008165253142

  • 对于网页搜索主要分为两个阶段

    • 1.建立整个网页索引:设计网页爬虫,爬取的网页存入BigTable中,在上面运行MapReduce

    • 2.搜索互联网网页

      image-20231008165520391

  • BigTable诞生?

    image-20231008165628566

  • Bigtable是在GFS的基础上实现的

    image-20231008165743978

  • 为什么分布式存储系统可以得到广泛的关注?

    • 它具有非常好的性能(可以支持PB级别的数据)
    • 它具有非常好的可扩展性(用集群去存储几千台服务器完成分布式存储)
  • HBase特点:高可能、高性能、面向列、可伸缩

    image-20231008170105044

  • HBase:通过水平扩展的方式,允许几千台服务器去存储海量文件

    image-20231008170221982

  • HBase和BigTable的底层技术对应关系

    image-20231008170317037

  • 为什么需要设计HBase这么一个数据库产品?

    • 虽然已经有了HDFS和MapReduce,但是Hadoop主要解决大规模数据离线批量处理,Hadoop无法满足大数据实时处理需求。

    • 随着这些年数据的大规模爆炸式增长,传统关系型数据库的扩展能力非常有限,即使通过设计主从复制方案或者分库的方式,仍然有两个缺陷,一个是不便利,另一个是效率非常低

  • 传统关系型数据库如何进行数据规模化扩展:

    • 设计主从复制方案,由主服务器负责接收写请求,若干从服务器都是主服务器的副本,从服务器接收外界的读请求,这样可以实现数据库在性能上的一定扩展

      image-20231008170854304

    • 做分库:对企业内部数据进行分库,将写负载分流

  • Hbase和传统关系型数据库有什么联系和区别?

    • 数据类型方面,传统关系数据库用的是非常经典的关系数据模型

    • 数据操作方面,在关系数据库中定了非常多的数据操作,查找,插入,删除等

    • 存储模式方面,关系数据库基于行模式存储,而对于HBase来讲是基于列存储

    • 在数据索引方面,关系数据库可以直接针对各个不同的列,构建非常复杂的索引

      image-20231008171505053

    • 数据维护方面,在关系数据库当中做一些数据更新操作的时候,实际上里面旧的值会被新的值覆盖掉;而HBase生成新的版本,旧的版本仍然存在,不会被替换

    • 可伸缩性方面,关系数据库是很难实现水平扩展的,最多可以实现纵向扩展

      image-20231008171935421

  • HBase访问接口

    image-20231008172100903

4.2 HBase数据模型

  • HBase是一个稀疏的多维度的排序的映射表:包含行键,列族,列限定符,时间戳

    image-20231008173124333

  • HBase特点

    image-20231008170221982

  • 列族的特性

    • 支持动态扩展:可以对列族进行增加或者减少

    • 保留旧的版本:执行数据更新操作的时候,会保留旧版本

    • HBase以表的形式组织数据,与关系型数据库的区别:关系型数据库会对其进行规范化处理,根据第一范式、第二范式、第三范式,将 表进行不断分解,最后需要对表进行多表连接;HBase不考虑冗余,牺牲空间去避免表连接操作带来的效率问题

  • 列限定符(列)

    • 实际过程中可以动态增加或者减少列
  • 单元格:具体存储数据的地方

  • 时间戳:新的版本会通过时间戳进行确定

  • 数据坐标的定位:必须通过四维:行键、列族、列限定符、时间戳来定位数据位置

    image-20231008174618703

  • HBase数据的概念视图

    • 列族名称:具体列限定符=“”
    • 在概念上HBase数据是稀疏的,因为很多单元格是空白的

    image-20231008175013832

  • HBase数据的物理视图:是按照列族进行存储的

    image-20231008191514263

  • 传统关系型数据库是行式存储,而HBase是列式存储

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 行式数据库和列式数据库示意图

    image-20231008192303431

  • 面向行的存储有什么优势和缺点

    image-20231008192354813

  • 列式存储的优点

    • 列式存储:按照一个列去存储,可以带来很高的数据压缩率,适用于以分析型应用为主的场景
    • 行式存储:不可能达到很高的数据压缩率,适合事务型操作比较多的场景

4.3 HBase的实现原理

  • HBase的功能组件:Master服务器、库函数、Reigion服务器

    • 库函数:链接每个客户端

    • Master服务器:充当管家作用

      image-20231008193013952

    • Region服务器:负责存储不同的Region

      • 客户端在获取Region位置信息之后,直接和Region服务器进行打交道

        image-20231008193213286

  • HBase的表和Region的关系

    • 初始化的时候将一个HBase表划分为多个Region,随着表的增大,Region规模增加,会分裂成多个新的Region,分裂时只需要修改指向信息,是非常快速的

      image-20231008193440440

      image-20231008193646685

  • Region到底被存到哪里去了?

    image-20231008193924333

  • HBase的三层结构

    • Root表在一个Region机器上,存储的元数据信息,即META表的位置

    • META表存储的是用户数据存储的位置

    • Root表的地址是写死在Zookeeper中的

      为了加速寻址,客户端会缓存位置信息,但同时需要解决缓存失效问题,它会先通过缓存查找数据,若找不到数据,则判定缓存失效,需要重新进行三级寻址

    image-20231008194400631

    • 三层结构中各层次的名称和作用

      image-20231008194440040

    • Region的定位

      image-20231008194653162

      image-20231008194807033

4.4 HBase运行机制

  • HBase的系统架构

    image-20231008195308851

    • 客户端:访问HBase的接口,为了加快访问速度,会进行位置地址的缓存

    • Zookeeper服务器:实现协同管理服务,其被大量用于分布式系统,提供配置维护,域名服务,分布式同步服务等,在HBase中,其主要提供管家功能,维护和管理整个HBase集群

      image-20231008195632529

    • Master服务器(主服务器):负责对HBase的表的增删改查;负责不同Region服务器的负载均衡;负责调整分裂、合并后Region的分布;负责重新分配故障、失效的Region服务器,也要借助Master来进行重新分配

      image-20231008195953264

    • Region服务器:负责用户数据的存储和管理,其负责向HDFS文件系统中读写数据

      • Region服务器集群由多个Region服务器构成,每个Region服务器中有多个组件
      • 若干个Region共用一个HLog文件
      • 每个Region中的每个列族会单独构成一个Store进行存储:会先存储到MemStore缓存中,缓存满了在存储到StoreFile文件中
      • StoreFile是HBase的表现形式,它在底层是借助HDFS存储的,其在HDFS中以HFile的格式存储

      image-20231008200103059

  • 用户读写数据过程

    • 写入数据

      • 首先将数据写入MemStore缓存区

      • 为了保存数据不丢失,会在写入Memstore前,会先写入HLog日志,当HLog数据写入到磁盘之后,才允许返回客户端

        image-20231008200814208

    • 读取数据

      • 首先用户也会先访问MemStore,因为最新写入的数据会存储于MemStore中

      • 若MemStore查找不到,会到磁盘的StoreFile中去找相关数据

        image-20231008200954154

  • 缓存刷新过程

    image-20231008201225601

  • StoreFile文件的合并

    • 刷写可能导致多个StoreFile文件,遍历StoreFile文件找数据,文件越多会影响查找速度,因此将多个StoreFile文件合并为一个大的StoreFile文件

      image-20231008201418386

  • StoreFile的分裂

    • StoreFile的不断合并可能会导致StoreFile的文件越来越大,当合并的StoreFile越大的时候,就会引发分裂操作

      image-20231008201635156

  • HLog的工作原理

    • HBase的底层是廉价的低端机,因此需要通过日志的发生来恢复故障

      image-20231008201957061

    • HBase为每个Region服务器都配置了公共的HLog

      image-20231008202220670

    • 故障恢复

      • Zookeeper来监视整个集群,会通知Master出问题的服务器,需要将故障服务器的内容迁移
      • Master会将故障服务器的HLog文件取出,包含故障服务器的各个Region对象以及日志记录
      • 然后对HLog的日志记录拆解为不同的Region的日志记录(因为所有的Region的日志都记录在HLog中)
      • 最后将这些Region分配到其他可用的Region服务器上去
    • 为何不每个Region设置单独的HLog文件

      • 因为这样对于每个Region的更新操作,需要写入不同的HLog文件,是非常耗时的,而且集群出故障的时间远少于正常运行的时间
      • 所有公共的HLog文件的可以大大提升写入性能

4.5 HBase的应用方案

  • HBase在实际应用中的性能优化方法

    • 若想把时间靠近的数据存在一起:

      image-20231008203531605

    • 提升读写性能:

      image-20231008203626114

    • 节省存储空间

      image-20231008203715218

    • 将到达时间限制的一些数据清楚,即使它没有到达版本最大数

      image-20231008203954303

  • HBase如何检测性能

    • 可以通过以下几种工具:Master-status、Ganglia、OpenTSDB、Ambari

      image-20231008203954303

      • Master-staus

        image-20231008204139709

      • Ganglia

        image-20231008204203630

      • OpenTSDB

        image-20231008204236174

      • Ambari

        image-20231008204303155

  • SQL语句查询HBase上相关数据

    • SQL易于使用,大部分人对HBase比较陌生,但是对SQL比较熟悉;

    • HBase原生代码查询数据编写代码较多,SQL是非过程语言,很多系统的底层会帮它生成相关操作

      image-20231008204639556

    • Hive和Phoenix

      image-20231008204727270

  • 构建HBase二级索引

    image-20231008204809345

    • 原生的HBase不支持对于各个列构建相关的索引,默认支持对rowkey行键进行索引

      image-20231008204925074

    • HBase0.92版本引入新特性:Coprocessor,可以支持二级索引

      image-20231008205142499

    • Coprocessor如何构建二级索引

      • 其提供两个实现:endpoint和observer

      • Endpoint相当于关系型数据库的存储过程,observer相当于触发器

      • 每次往HBase表中插入数据时,observer会监测到,会将插入的数据同步写到索引表

        image-20231008205440095

    • 此时在HBase中就存在了主表和索引表

      • 索引表不是HBase内部自身的,是由其他产品帮其构建的二级索引,是通过Coprocessor格外开发的程序,对不同的其他列进行索引

      image-20231008205536489

    • Coprocessor构建二级索引的优点和缺点

      • 优点:非侵入性,引擎构建在HBase之上,既没有对HBase进行任何改动,也不需要上层应用做任何妥协
      • 缺点:每插入一条数据需要向索引表插入数据,即耗时是双倍的,对HBase的集群压力也是双倍的
  • HBase的应用方案

    image-20231008210013892

    • Redis的方案:将索引写入到Redis的缓存数据库中,定期的把索引更新到HBase底层数据库,可以避免频繁更新磁盘索引表的问题

      image-20231008210340743

    • Solr+HBase:Solr服务器构建其他列和行键之间的对应关系,输入其他列的某一个值,可以快速找到这个列对应的行键,通过行键快速找到HBase记录

      image-20231008210613264

4.6 HBase安装和编程实战

见:HBase2.5.4安装和编程实践指南_厦大数据库实验室博客 (xmu.edu.cn)

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

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

相关文章

如何在 Android 中完成一个 APT 项目的开发?

前言 APT(Annotation Processing Tool)即注解处理器,是一种处理注解的工具。 APT在编译时期扫描处理源代码中的注解,开发中可以根据注解,利用APT自动生成Java代码,减少冗余的代码和手动的代码输入过程,提升了编码效率…

pytest + yaml 框架 -55. raw 不转义模板语法

前言 在yaml 文件中,设置的引用变量语法是${var}, 最近有小伙伴提到一个需求:请求参数的内容需要有特殊符号${var}, 希望不被转义,不要引用变量,直接用原始数据即可。 raw 忽略模板语法 Jinja2提供了 “raw” 语句来忽略所有模…

Gralloc ION DMABUF in Camera Display

目录 Background knowledge Introduction ia pa va and memory addressing Memory Addressing Page Frame Management Memory area management DMA IOVA and IOMMU Introduce DMABUF What is DMABUF DMABUF 关键概念 DMABUF APIS –The Exporter DMABUF APIS –The…

上海亚商投顾:沪指探底回升 华为汽车概念股集体大涨

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 三大指数昨日探底回升,早盘一度集体跌超1%,随后震荡回暖,深成指、创业板指…

交通物流模型 | 基于多重时空信息融合网络的城市网约车需求预测

交通物流模型 | 基于多重时空信息融合网络的城市网约车需求预测 城市网约车需求预测是网约车系统决策、出租车调度和智能交通建设的一项长期且具有挑战性的任务。准确的城市网约车需求预测可以提升车辆的利用和调度,减少等待时间和交通拥堵。现有的交通流预测方法大部分采用基…

LeetCode二叉树OJ

目录 剑指 Offer 55 - I. 二叉树的深度 - 力扣(LeetCode) 965. 单值二叉树 - 力扣(LeetCode) 100. 相同的树 - 力扣(LeetCode) 101. 对称二叉树 - 力扣(LeetCode) 二叉树遍历_牛客题…

Vue组件化开发步骤

Vue组件化开发的步骤可以简单概括为以下几步: 划分组件:根据页面的布局和功能需求,将页面划分成若干个组件,每个组件具备独立的功能和样式。 编写组件:针对每个组件,编写组件的模板、样式和逻辑代码&#…

uniapp 点击 富文本元素 图片 可以预览(非nvue)

我使用的是uniapp 官方推荐的组件 rich-text,一般我能用官方级用官方,更有保障一些。 一、整体逻辑 1. 定义一段html标签字符串,里面包含图片 2. 将字符串放入rich-text组件中,绑定点击事件itemclick 3. 通过点击事件获取到图片ur…

TensorFlow学习:使用官方模型进行图像分类、使用自己的数据对模型进行微调

前言 上一篇文章 TensorFlow案例学习:对服装图像进行分类 中我们跟随官方文档学习了如何进行预处理数据、构建模型、训练模型等。但是对于像我这样的业余玩家来说训练一个模型是非常困难的。所以为什么我们不站在巨人的肩膀上,使用已经训练好了的成熟模…

VIT(Vision Transformer)学习-模型理解(一)

VIT (Vision Transformer) 模型论文代码(源码)从零详细解读,看不懂来打我_哔哩哔哩_bilibili VIT模型架构图 1.图片切分为patch 2. patch转化为embedding 1)将patch展平为一维长度 2)token embedding:将拉平之后的序列映射…

【ARM AMBA5 CHI 入门 12.1 -- CHI 链路层详细介绍 】

文章目录 CHI 版本介绍1.1 CHI 链路层介绍1.1.1 Flit 切片介绍1.1.2 link layer credit(L-Credit)机制1.1.3 Channel1.1.4 Port1.1. RN Node 接口定义1.1.6 SN Node 接口定义1.2 Channel interface signals1.2.1 Request, REQ, channel1.2.2 Response, RSP, channel1.2.3 Snoop…

如何找到新媒体矩阵中存在的问题?

随着数字媒体的发展,企业的新媒体矩阵已成为品牌推广和营销的重要手段之一。 然而,很多企业在搭建新媒体矩阵的过程中,往往会忽略一些问题,导致矩阵发展存在潜在风险,影响整个矩阵运营效果。 因此,找到目前…

二维离散傅里叶变换的实现

二维离散傅里叶变换的实现 1.使用Python包实现1.1 fftshift在numpy中的实现1.2 平移后的幅度谱 2.使用c实现之12.1 FFTW库安装2.2 结果比较 3.使用c实现之2参考文献 1.使用Python包实现 import numpy as np import matplotlib.pyplot as plt anp.array([0, 2, 4, 1,6, 1, 3, …

快速幂求逆元

思路 题意: 给出两个整数 a , p a,p a,p,其中 p p p 是质数,求出一个整数 b b b,使得 a ∗ b 1 ( m o d p ) a~*~b~~1(mod~p) a ∗ b 1(mod p) 成立(即求 a a a 模 p p p 的乘法逆元)。 首先我们…

澳大利亚教育部宣布ChatGPT将被允许在澳学校使用!

教育部长最近宣布,从 2024 年起,包括 ChatGPT 在内的人工智能将被允许在所有澳大利亚学校使用。 (图片来源:卫报) 而早些时候,澳洲各高校就已经在寻找与Chatgpt之间的平衡了。 之前,悉尼大学就…

leetCode 1035.不相交的线 动态规划 + 滚动数组 (最长公共子序列)

1035. 不相交的线 - 力扣(LeetCode) 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足满足: nums1[i] nums2[j]…

vue3+elementplus+flask 文件夹上传

<div><input class"fileuploadclass" title"请选择文件夹" ref"file" id"submit" type"file"multiple name"" webkitdirectory change"folderModelOn"><el-button type"primary&qu…

冒泡排序/鸡尾酒排序

冒泡排序 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;它通过多次交换相邻元素的位置来实现排序。它的基本思想是从数组的第一个元素开始&#xff0c;比较相邻的两个元素&#xff0c;如果它们的顺序错误&#xff0c;则交换它们的位置。重复进…

蓝桥杯每日一题20233.10.10

题目描述 回文日期 - 蓝桥云课 (lanqiao.cn) 题目分析 对于此题&#xff0c;我们最先想到的是暴力解法&#xff0c;将每一种情况经行循环查找&#xff0c;在查找的过程中记录下答案&#xff0c;回文日期就是字符串判断回文&#xff0c;ABABBABA型回文日期可以将回文经行特判…

JVM源码剖析之Thread类中sleep方法

版本信息&#xff1a; jdk版本&#xff1a;jdk8u40 写在前面&#xff1a; 大部分的Java程序员知道让线程睡眠的方法是Thread.sleep方法&#xff0c;而这个方法是一个native方法&#xff0c;让很多想知道底层如何让线程睡眠的程序员望而却步。所以笔者特意写在这篇文章&#xf…