某团面试题①—kudu读写流程

kudu 读写流程

前言

为什么会有kudu?先贴一个经典的图。
在这里插入图片描述
kudu诞生之前大数据的主要2种方式存储

  • 静态数据
    以hdfs引擎作为存储引擎,适用于高吞吐量的离线大数据分析场景,缺点是实现随机读写性能差,更新数据难

  • 动态数据
    以Hbase为代表作为存储引擎,适用于大数据随机读写的场景,缺点是大批量读取吞吐量远不如hdfs,不适用批量数据分析的场景。

要实现大批量的读写,随机读写有比较弱,要随机读写+更新,吞吐量有不行,当时的处理策略是,使用两套集群来使用兼顾。
类似架构
在这里插入图片描述
如上图所示:
数据实时写入Hbase,实时的数据更新也在Hbase完成,为了应对OLAP的场景需求,通常使用定时(T+1、T+H)将hbase数据写成静态文件(parquet)导入到OLAP引擎(HDFS)
这一架构技能够实现随机读写,又可以支持OLAP分析的场景
但存在弊端:

  • 架构复杂,设计环节较多,运维成本很高,还需要考虑高可用,多副本,资源层面也比较浪费,数据安全、监控都比较困难
  • 时效性低,从hbase写入到hdfs需要同步加工时间

为了解决上述种种问题,诞生了一个”中流砥柱“ kudu
kudu:定位是Fast Analytics on Fast Data, 是一个既支持随机读写,又支持OLAP分析的大数据引擎。
在这里插入图片描述
KUDU 是一个折中的产品,在 HDFS 和 HBase 这两个偏科生中平衡了随机读写和批量分析的性能。从 KUDU 的诞生可以说明一个观点:底层的技术发展很多时候都是上层的业务推动的,脱离业务的技术很可能是空中楼阁。

Kudu是什么 Apache
Kudu是由Cloudera开源的存储引擎,可以同时提供低延迟的随机读写和高效的数据分析能力。它是一个融合HDFS和HBase的功能的新组件,具备介于两者之间的新存储组件。

Kudu支持水平扩展,并且与Cloudera Impala和Apache Spark等当前流行的大数据查询和分析工具结合紧密。

kudu架构

在这里插入图片描述
名词说明

角色作用
Master Server集群中的老大,负责集群管理、元数据管理等功能【为实现高可用,存在lead-follower节点】
Tablet Server集群中的小弟,负责数据存储,并提供数据读写服务 一个 tablet server 存储了table表的tablet 和为 tablet 向 client 提供服务。对于给定的 tablet,一个tablet server 充当 leader,其他 tablet server 充当该 tablet 的 follower 副本。 只有 leader服务写请求,然而 leader 或 followers 为每个服务提供读请求 。一个 tablet server 可以服务多个 tablets ,并且一个 tablet 可以被多个 tablet servers 服务着。 【 tablet server—leader提供读写服务,follower只提供读服务】
Table(表)一张table是数据存储在Kudu的tablet server中。表具有 schema 和全局有序的primary key(主键)。table 被分成称为 tablets 的 segments。
Tablet一个 tablet 是一张 table连续的segment,tablet是kudu表的水平分区,类似于google Bigtable的tablet,或者HBase的region。每个tablet存储着一定连续range的数据(key),且tablet两两间的range不会重叠。一张表的所有tablet包含了这张表的所有key空间。与其它数据存储引擎或关系型数据库中的 partition(分区)相似。给定的tablet 冗余到多个 tablet 服务器上,并且在任何给定的时间点,其中一个副本被认为是leader tablet。任何副本都可以对读取进行服务,并且写入时需要在为 tablet 服务的一组 tablet server之间达成一致性。

kudu的工作模式

在这里插入图片描述

说明:

  • 每个kudu table 按照hash或range分为多个tablet
  • 每个tablet中包含一个MemRowSet以及多个DiskRowSet
  • 每个DiskRowSet包含BaseData以及DeltaStores
  • DeltaStores由多个DeltaFile和一个DeltaMemStore组成
  • insert 请求的新增数据以及对MemRowSet中数据的Update操作(新增的数据还没来得及触发compaction操作,再次进行更新操作的新数据)会先进入到MemRowSet
  • 当触发flush条件时将新增数据真正的持久化到磁盘的DiskRowSet内
  • 对老数据的update和delete操作是提交到内存中的DeltaMemStore
  • 当触发flush条件时会将更新和删除操作持久化到磁盘DiskRowSet中的DeltaFile内,此时老数据还在BaseData【逻辑删除】,新数据已在DeltaFile内
  • 当触发compaction条件时,将DeltaFile和BaseData进行合并,DiskRowSet将进行合并,此时老数据才真正的从磁盘移除掉【物理删除】,只留下更新后的数据记录

正文来了

前置补充说明下名词

  1. 1个Table包含多个Tablet,其中Tablet的数量是根据hash或者是range进行设置的
  2. 1个Tablet中包含MetaData信息和多个RowSet信息 //MetaData就是保存的Tablet Server上的位置信息等
  3. 1个RowSet包含一个MemRowSet和多个DiskRowSet
    • 其中MemRowSet用于存储insert数据和update后的数据,写满后会刷新到磁盘中也就是多个DiskRowSet中**,默认是1G刷新一次或者是2分钟** //1G数据刷新到众多的DiskRowSet
    • DiskRowSet会定期的刷新,进行合并操作,删除更新数据之前的历史数据
  4. 1个DiskRowSet包含1个BloomFilter,1个Ad_hoc Index,一个BaseData,多个Delta file文件(UndoFile、RedoFile),一个Delta MemStore
    • BloomFile:根据DiskRowSet中key生成一个bloom filter,用于快速模糊的定位某一个key是否在DiskRowSet中
    • Ad_hoc Index:是主键的索引,用于定位key在DiskRowSet中具体哪个偏移位置
    • BaseData:是MemRowSet flush下来的数据,按照列存储,按照主键有序 //也就是CFile文件
    • Deltafile:
      UndoFile:是BaseData之前的数据历史数据 //更新数据之前的数据
      RedoFile:是BaseData之后的mutation记录,可以获得较新的数据 //最新的更新数据
    • DeltaMemStore:Delta Memstore达到一定程度后会在内存中合并数据,然后生成Redo data到磁盘
      合并策略:
      ①多个DeltaFile进行合并生成一个大的DeltaFile。默认是1000个DeltaFile进行合并一次
      ②DeltaFile文件的大小和Base data的文件的比例为0.1的时候,会进行合并操作,生成Undo data

kudu的读流程

在这里插入图片描述

  • 客户端向kudu Master 请求tablet的所在位置
  • kudu Master返回tablet的所在位置
  • 为了优化读取和写入,客户端会将元数据进行缓存
  • 根据主键范围过滤目标的tablet,请求tablet follower
  • 根据主键过滤Scan范围,定位DataRowSets
  • 加载BaseData,并与DeltaStores合并
  • 拼接上一步骤得到的老数据与MemRowSet数据,得到所需数据
  • 将数据返回到客户端

kudu的写流程

在这里插入图片描述

  • 客户端向kudu Master请求tablet所在的位置
  • kudu Master返回tablet所在的位置
  • 为了优化读取和写入,客户端会将元数据进行缓存
  • 根据分区策略,路由到对应Tablet,请求Tablet Leader
  • 根据RowSet【memrowset,diskrowset】记录的主键范围过滤掉不包含新增数据主键的RowSet
  • 根据RowSet【memrowset,diskrowset】布隆过滤器再进行一次过滤,过滤掉不包含新数据主键的RowSet
  • 查询RowSet【memrowset,diskrowset】中的B树索引判断命中新数据的主键,若命中则报错主键冲突,否则新数据写入MemRowSet(写入操作先被提交到tablet的预写日志(WAL),并根据Raft一致性算法取得追随节点的同意,然后才会被添加到其中一个tablet的内存中)「①插入会被添加到tablet的MemRowSet中 ② 更新和删除操作将被追加到MemRowSet中的原始行之后以生成redo记录的列表」
  • 返回响应给客户端

  • Kudu在MemRowset中写入一行新数据,在MemRowset(1G或者是120s)数据达到一定大小时
  • MemRowset将数据落盘,并生成一个diskrowset用于持久化数据还生成一个memrowset继续接收新数据的请求

kudu更新流程

在这里插入图片描述
更新删除流程与写入流程类似,区别就是最后判断是否存在主键时候的操作,若存在才能更新,不存在才能插入新数据。

  • 客户端向kudu Master请求tablet所在位置
  • kudu Master 返回tablet所在位置
  • 为了优化读取和写入,客户端将元数据进行缓存
  • 根据分区策略,路由到对应的Tablet,请求Tablet Leader
  • 根据RowSet【memrowset,diskrowset】记录的主键范围过滤掉不包含新增数据主键的RowSet
  • 根据RowSet【memrowset,diskrowset】布隆过滤器再进行一次过滤,过滤掉不包含新数据主键的RowSet
  • 查询RowSet【memrowset,diskrowset】中的B树索引判断是否命中修改的数据主键,若命中则修改至DeltaStores,否则报错数据不存在
  • 返回响应给客户端

补充说明:RowSet包含memrowset,diskrowset

  • 当待更新数据位于memrowset时:找到待更新数据所在行,然后将更新操作记录在所在行中一个mutation链表中,与插入数据不同的位置上,在memrowset将数据落盘时,Kudu会将更新合并到base data,并生成UNDO records用于查看历史版本的数据
  • 当待更新数据位于DiskRowset时:找到待更新数据所在的DiskRowset,每个DiskRowset都会在内存中设置一个DeltaMemStore,将更新操作记录在DeltaMemStore中,在DeltaMemStore达到一定大小时,flush在磁盘,形成DeltaFile中
  • 注意:wal日志的作用是如果我们在做真正的操作之前,先将这件事记录下来,持久化到可靠存储中(因为日志一般很小,并且是顺序写,效率很高),然后再去执行真正的操作。这样执行真正操作的时候也就不需要等待执行结果flush到磁盘再执行下一步,因为无论在哪一步出错,我们都能够根据备忘录重做一遍,得到正确的结果。

这一篇感觉也比较清晰,也可参考:

https://cloud.tencent.com/developer/article/2187652
贴几个图吧

写入数据

在这里插入图片描述
当 Client 请求写数据时,先根据主键从 Mater Server 中获取要访问的目标 Tablets,然后到对应的 Tablet 获取数据。因为 KUDU 表存在主键约束,所以需要进行主键是否已经存在的判断。一个 Tablet 中存在很多个 RowSets,为了提升性能,我们要尽可能地减少要扫描的 RowSets 数量。首先,我们先通过每个 RowSet 中记录的主键的(最大最小)范围,过滤掉一批不存在目标主键的 RowSets,然后在根据 RowSet 中的布隆过滤器,过滤掉确定不存在目标主键的 RowSets,最后再通过 RowSets 中主键索引,精确定位目标主键是否存在,如果主键已经存在,则报错:主键重复,否则就进行写 MemRowSet。写入操作先被提交到tablet的预写日志(WAL)目录,并根据Raft一致性算法取得follow节点的同意,然后才会被添加到其中一个tablet的内存中,插入会被添加到tablet的MemRowSet中。

读取数据

在这里插入图片描述
数据读取过程大致如下:先根据要扫描数据的主键范围,定位到目标的Tablets,然后读取Tablets中的 RowSets。在读取每个RowSet时,先根据主键过滤要scan范围,然后加载范围内的base data,再找到对应的delta stores,应用所有变更,最后union上MenRowSet中的内容,返回数据给 Client。

更新数据

在这里插入图片描述
数据更新的核心是定位到待更新数据的位置,这块与写入的时候类似,就不展开了,等定位到具体位置后,然后将变更写到对应的delta store中。

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

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

相关文章

Deepseek本地部署指南:在linux服务器部署,在mac远程web-ui访问

1. 在Linux服务器上部署DeepSeek模型 要在 Linux 上通过 Ollama 安装和使用模型,您可以按照以下步骤进行操作: 步骤 1:安装 Ollama 安装 Ollama: 使用以下命令安装 Ollama: curl -sSfL https://ollama.com/download.…

go并发和并行

进程和线程 进程(Process)就是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位,进程是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间。…

element-ui rate 组件源码分享

评分组件,从三个方面分享: 1、页面结构。 2、组件属性。 3、组件方法。 一、页面结构: 主要有图标的、图标(默认或自定义图标)文字的、图标分数的。 二、属性。 2.1 value 2.2 max 最大分数。 2.3 disabled 是否只读 2.4 allow-half 是…

python学opencv|读取图像(五十六)使用cv2.GaussianBlur()函数实现图像像素高斯滤波处理

【1】引言 前序学习了均值滤波和中值滤波,对图像的滤波处理有了基础认知,相关文章链接为: python学opencv|读取图像(五十四)使用cv2.blur()函数实现图像像素均值处理-CSDN博客 python学opencv|读取图像(…

HIVE如何注册UDF函数

如果注册UDF函数的时候报了上面的错误,说明hdfs上传的路径不正确, 一定要用下面的命令 hadoop fs -put /tmp/hive/111.jar /user/hive/warehouse 一定要上传到上面路径,这样在创建函数时,引用下面的地址就可以创建成功

紧跟潮流,将 DeepSeek 集成到 VSCode

Visual Studio Code(简称 VSCode)是一款由微软开发的免费开源代码编辑器,自 2015 年发布以来,凭借其轻便、强大、且拥有丰富扩展生态的特点,迅速成为了全球开发者的首选工具。VSCode 支持多平台操作系统,包…

HAL库 Systick定时器 基于STM32F103EZT6 野火霸道,可做参考

目录 1.时钟选择(这里选择高速外部时钟) ​编辑 2.调试模式和时基源选择: 3.LED的GPIO配置 这里用板子的红灯PB5 4.工程配置 5.1ms的systick中断实现led闪烁 源码: 6.修改systick的中断频率 7.systick定时原理 SysTick 定时器的工作原理 中断触发机制 HAL_SYSTICK_Co…

DeepSeek与llama本地部署(含WebUI)

DeepSeek从2025年1月起开始火爆,成为全球最炙手可热的大模型,各大媒体争相报道。我们可以和文心一言一样去官网进行DeepSeek的使用,那如果有读者希望将大模型部署在本地应该怎么做呢?本篇文章将会教你如何在本地傻瓜式的部署我们的…

【重新认识C语言----文件管理篇】

目录 ​编辑 -----------------------------------------begin------------------------------------- 引言 1. 文件的基本概念 2. 文件指针 3. 文件的打开与关闭 3.1 打开文件 3.2 关闭文件 4. 文件的读写操作 4.1 读取文件 4.1.1 使用fgetc()读取文件 4.1.2 使用fg…

全面解析String类

一、String 类初相识 在 C 语言的世界里,字符串是以\0结尾的字符集合,为了方便操作,C 标准库提供了一系列str系列的库函数,如strcpy、strcat、strlen等。虽然这些库函数在一定程度上满足了我们对字符串的操作需求,但是…

pycharm 中的 Mark Directory As 的作用是什么?

文章目录 Mark Directory As 的作用PYTHONPATH 是什么PYTHONPATH 作用注意事项 Mark Directory As 的作用 可以查看官网:https://www.jetbrains.com/help/pycharm/project-structure-dialog.html#-9p9rve_3 我们这里以 Mark Directory As Sources 为例进行介绍。 这…

MySQL - 字段内分组

1、MySQL 5.7及之前版本 SELECT A.要显示的字段名称,FIRST_VALUE : A.分组字段名称,last :IF(FIRST_VALUE A.分组字段名称, last 1, 1 ) AS rn,FROM 表1 A,(SELECT last : 0, FIRST_VALUE : NULL ) BORDER BY A.排序字段例:SELECT A.DLR_CODE,A.VAILD_CARD_NO,A.L…

瞬态分析中的时域分析与频域分析:原理、对比与应用指南

目录 一、核心概念区分 二、时域分析:时间维度直接求解 1. 基本原理 2. 关键特点 3. 典型算法 4. 应用案例 三、频域分析:频率维度的等效映射 1. 基本原理 2. 关键特点 3. 典型方法 4. 应用案例 四、对比与选择依据 1. 方法论对比 2. 工程…

【DeepSeek】DeepSeek小模型蒸馏与本地部署深度解析DeepSeek小模型蒸馏与本地部署深度解析

一、引言与背景 在人工智能领域,大型语言模型(LLM)如DeepSeek以其卓越的自然语言理解和生成能力,推动了众多应用场景的发展。然而,大型模型的高昂计算和存储成本,以及潜在的数据隐私风险,限制了…

安卓/ios脚本开发按键精灵经验小分享

1. 程序的切换 我们经常碰到这样的需求:打开最近的应用列表,选取我们想要的程序。但是每个手机为了自己的风格,样式都有区别,甚至连列表的滑动方向都不一样,我们很难通过模拟操作来识别点击,那么我们做的只…

camera光心检测算法

1.概要 光心检测算法,基于opencv c实现,便于模组厂快速集成到软件工具中,适用于camera模组厂算法评估组装制程镜头与sensor的偏心程度,便于工程师了解制程的问题找出改善方向。 2.技术介绍 下图为camera模组厂抓取的bayer-raw经过…

OpenCV:特征检测总结

目录 一、什么是特征检测? 二、OpenCV 中的常见特征检测方法 1. Harris 角点检测 2. Shi-Tomasi 角点检测 3. Canny 边缘检测 4. SIFT(尺度不变特征变换) 5. ORB 三、特征检测的应用场景 1. 图像匹配 2. 运动检测 3. 自动驾驶 4.…

Docker安装pypiserver私服

Docker安装pypiserver私服 1 简介 Python开源包管理工具有pypiserver、devpi和Nexus等,pypiserver安装部署比较简单,性能也不错。 搭建pypiserver私服,可以自己构建镜像,也可以使用官网的docker镜像。 # Github地址 https://g…

什么是自动化测试?自动化测试的作用

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、自动化测试 所谓的自动化测试简单来说就是有计算机代替 人来单击被测软件的界面,执行一系列操作并进行验证。 自动化有点:通过执行…

AI驱动的智能流程自动化是什么

在当今快速发展的数字化时代,企业正在寻找更高效、更智能的方式来管理日常运营和复杂任务。其中,“AI驱动的智能流程自动化”(Intelligent Process Automation, IPA)成为了一个热门趋势。通过结合人工智能(AI&#xff…