CloudberryDB 内核分享:Directory Table 底层逻辑与实现原理讲解

news2024/11/25 15:35:52

在之前的直播中,我们向大家介绍了🔗,为企业AI应用创新提供更高质量的非结构化数据语料输入和知识库支持,感兴趣的朋友可以点击链接阅读。

随着我们的开源数据仓库产品Cloudberry Database(简称“CloudberryDB”)日渐完善,Directory Table现在已经正式开源。在之前的直播中我们为大家详细讲解了Directory Table 底层逻辑与实现原理,以下内容根据直播文字整理成稿。



背景


面对AI应用带来的非结构化数据管理挑战,CloudberryDB 引入了一种专门用来存储管理非结构化数据的新的表类型——Directory Table(目录表)。


通过Directory Table我们可以将各式各样非结构化的数据统一纳管起来,并且可以结合酷克数据自主研发的下一代 In-Database 高级分析和数据科学工具 HashML,对存储在Directory Table中的数据进行挖掘学习,为用户提供更进一步的价值。


CloudberryDB 的Directory Table提供 local 和 remote 两种存储方式,分别基于本地存储与对象存储服务两种形式,以满足用户需求的多样性。



Tablespace


在介绍Directory Table之前,我们首先需要理解数据库中的一个经典概念:Tablespace,它指的是数据库文件存储的本地目录地址,例如/code/base/。


在PostgreSQL中,其默认的Tablespace是pg_default,对应的数据目录是base目录,可以通过default_tablespace的guc来修改默认tablespace。


相对于传统的Local Tablespace,CloudberryDB引入了一种新的Tablespace,用于存储分布式文件系统(DFS)的文件存储地址。
  • 以对象存储为例:/bucket_name/tablespace-1/;
  • 以HDFS为例 :/usr/warehouse/tablespace-1/;


在创建表时,我们可以指定该表使用的Tablespace。如果不指定,它将使用默认的Tablespace。而本期我们要讲解的Directory Table,实际上就是依赖于Tablespace来实现的。接下来,我们将通过实际操作来演示Tablespace的使用。




Directory Table实现原理


c699e0ef06603a1c387cfb9475a9b889.jpeg

图1 Directory Table存储架构


上图是一张关于Directory Table存储架构的图。从图中可以看出,这里提供了两种Directory Table:Local Directory Table和Remote Directory Table。


假设现在有一份非结构化数据,我们可以通过CopyFrom命令或者通过gpdirtablelaod工具将其导入到Directory Table中。这份非结构化数据会被存放在Tablespace下。如果是Local Directory Table,它会存储在Local Tablespace下;如果是远端的Remote Directory Table,则会存储在DFS Tablespace。


Directory Table主要涉及三部分与元数据相关的操作,分别是:Index、Catalog以及Schema table。


  • Catalog如下图所示,我们在其中添加了一张名为pg_directory_table的系统表,这张系统表包含三个关键字段:DT_OID,代表Directory Table的唯一标识符(OID);Tablespace的OID,用于标识表空间;以及Directory Table具体的文件路径。


3d27f1f8f2653c30b999b81a6a982710.jpeg

图2 Catalog表结构图


  • Schema table可以理解为一张普通Heap表,专门用于记录Directory Table中的层级信息,从而管理Directory Table中存储的所有非结构化数据。Schema table主要包含五个字段:
    • relative_path,即文件的相对路径,也可以理解为文件在Directory Table中的名称;
    • size,表示文件的大小;
    • upload_time,记录文件上传的时间;
    • MD5,用于文件的完整性校验;
    • 以及tag,允许用户在上传文件后添加标签,以便更方便地管理和检索这些非结构化数据。


53eede1e1d390d6cf59e6a29f8fe314d.jpeg

图3 Schema table结构图



创建 Directory Table


4555227fc04b00970173b044023c03cf.jpeg

图4 创建Directory Table流程图


上图为Create Directory Table 的代码流程图,其中要注意以下几点:
  • Directory Table的Schema表按照relative path列进行分布,上传的非结构化数据文件,会基于分布列将数据分布存储到segment中。
  • 主键为relative path,在插入非结构化数据时,relative path相同的拒绝插入。同时可以加速Schema表的查询效率。
  • Directory Table的权限检查基于Schema表。
  • 创建成功后,会在pg_directory_table系统表中插入一条对应tuple,同时会在对应的Tablespace下生成对应目录。
  • Schema表禁止除Update tag列外的一切DML操作。





导入数据


接下来我们一起看下Copy导入非结构化数据文件到Directory Table的数据流向图,以及具体演示。


cfcb5514d359ba908353355bd385346a.jpeg

图5 Copy导入非结构化数据流向图



下图是关于Copy代码的一个流程:首先,系统会判断操作是否通过CopyFrom接口发起,并检查所操作的表是否为Directory Table,若不是Directory Table,则执行常规的Copy table逻辑;若是,则进一步判断其类型为QD还是QE,分别执行发送数据或接收数据的流程。最后,无论执行了哪种类型的操作,都会进行必要的清理工作,以确保资源得到正确释放和状态得到更新。


37010b6102affd893b1aa316b59fd1b3.jpeg

图6 Copy代码流程


QD具体的执行流程如下:


a936e471059342e225e8b8d3091b035c.jpeg

图7 Copy导入-QD流程


  • CdbCopyStart会执行buildGang,建立QD→QE之间的connection,通过pg中的libpq来传输数据。
  • ReadBinaryData会从libpq中读取二进制数据流。
  • Md5Sum会动态计算md5,直至文件传输完成得到整个文件的md5。
  • ComputeTargetSeg会基于relative path分布键计算tuple需要发送的QE。
  • CdbCopyEnd会等待Copy到QE过程的结束,并收集QE返回的状态和统计信息。


接下来是QE的执行流程:


ad5e6482ac799355eae5da20f2000a47.jpeg

图8 Copy导入-QE流程


  • NextCopyFromExecute会从libpq中读取QD发送的数据并存到TupleTableSlot中。
  • Index Tuple Check会基于主键检查当前tuple是否已经在index中存在,这里主键为relative_path,可以避免相同文件名覆盖。
  • UFileAddCreatePendingEntry会添加一个PendingDelete对象到链表中,类似于pg中pending delete的机制,该链表会在事务提交将数据文件落盘,在事务回滚时删除数据文件,保证了数据文件的事务性。
  • UFileOpen/UFileWrite/UFileSync/UFileClose是数据文件操作的统一接口,通过这些接口可以实现对底层存储介质的透明,如本地存储或者远端对象存储。

查询数据


那么如何在Directory Table中查询数据呢?如下图所示,我们提供了一些UDF(用户定义函数)来进行查询。


b976a83ca6d994195204f188072ec1ac.jpeg

图9 查询数据流程


QD调用Directory Table的函数。函数执行时,QD会向QE发送查询计划。QE收到计划后执行它,并调用FunctionScan来扫描schema表,找到要查询的那条tuple,并获取具体的文件路径或URL(本地文件为路径,远端文件为URL)。


QE拿到这个路径或URL后,会到Tablespace找到对应的Directory Table,然后找到对应的非结构化数据,紧接着给QD返回一个TupleTableSlot,而返回的数据通过Motion的UDP传输方式,保证了传输的可靠性。




删除数据


既然存在数据的传输,那么也必然涉及到数据的删除操作。我们主要关注的是删除操作的交互流程,这一流程通过remove_file()的函数来实现的。如下图所示:


34ceb4411e9bd754181e8aff2c67e142.jpeg

图10 删除数据流程


当QD调用这个函数时,它会将删除命令发送给QE。QE收到命令后,会调用remove_file segment函数,执行一个顺序扫描,扫描schema表以找到要删除的tuple,并获取对应的路径或URL。


随后,QE会构造一个pending delete对象,并将其添加到pending delete链表中,同时在schema表中删除对应的tuple。这个pending delete机制在commit或rollback时决定文件的最终状态。




删除Directory Table


最后,展示最删除Directory Table的流程图,这里需要注意:

  • aclcheck会对权限进行检查,只有超级用户或者是directory table的owner才有权限执行删除。

  • heap_drop_with_catalog会在pg_class元数据的tuple进行删除。

  • RemoveDirectoryTableEntry会将pg_directory_table系统表中对应的tuple删除。

  • UFileAddDeletePendingEntry类似于UFileAddCreatePendingEntry,在执行删除时会添加一个PendingDelete对象到链表中,该链表会在事务提交将数据文件删除,在事务回滚时不做处理。

cb094a6e39560a6b08029be941d92a78.jpeg

图11 删除Directory Table的流程




结 语‍



本次分享,我们为大家深入讲解了Directory Table的实现原理、创建流程、数据导入、查询与删除操作等核心内容,希望帮助开发者朋友们更全面、更深入地理解CloudberryDB的Directory Table,并能够在实践中灵活运用,为企业的AI应用创新提供更高质量的非结构化数据语料输入和知识库支持。



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

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

相关文章

杂七杂八-系统环境安装

杂七杂八-系统&环境安装 1. 系统安装2.环境安装 仅个人笔记使用,感谢点赞关注 1. 系统安装 Windows安装linux子系统WSL2:使用windows系统跑linux程序(大模型) 2.环境安装 目前仅专注于 NLP 大模型 机器学习和前后端的技术学习和分享 感谢大家的关注…

基于spring的博客系统(总)

通过前⾯课程的学习, 我们掌握了Spring框架和MyBatis的基本使⽤, 并完成了图书管理系统的常规功能 开发, 接下来我们系统的从0到1完成⼀个项⽬的开发; 1. 项⽬介绍 使⽤SSM框架实现⼀个简单的博客系统 共5个⻚⾯ 1. 用户登录 2. 博客发表⻚ 3. 博客编辑⻚ 4. 博客…

零工市场小程序是灵活就业的新趋势?

人力资源社会保障部曾发文《人力资源社会保障部 民政部 财政部 住房和城乡建设部 国家市场监管总局关于加强零工市场建设 完善求职招聘服务的意见》。 找零工在传统情况下会有比较多的困难,比如能能够掌握的信息较少、不知道工作单位是否靠谱等等的问题&#xff0c…

心觉:如何打破用脑学习的瓶颈?教你用心学习,实现真正蜕变!

Hi,我是心觉,与你一起玩转潜意识、脑波音乐和吸引力法则,轻松掌控自己的人生! 挑战每日一省写作167/1000天 我们经常听到父母对孩子说要“用心学习,用心学习” 大概意思是告诉孩子学习的时候要专注,要认真…

【9月持续更新】国内ChatGPT-4中文镜像网站大全

一、国内大模型与ChatGPT的区别 🧠 国内大模型:专注于国内市场,支持本土企业及用户,适用于中文语境下的客服、教育、内容生成等应用场景。ChatGPT:全球适用性强,但在中文环境下的本地化程度不如国内大模型…

Arm GIC-v3中断原理及验证(通过kvm-unit-tests)

一、参考连接 gic-v3相关原理可参考https://zhuanlan.zhihu.com/p/520133301 本文主要通过开源测试工具kvm-unit-tests,针对GIC的中断进行一系列验证,这样可以直入中断底层,熟悉整个原理。 kvm-unit-tests官网为kvm-unit-tests / KVM-Unit…

『 Linux 』协议的定制

文章目录 协议的概念序列化和反序列化网络计算器套接字接口的封装服务端大致框架协议的定制Request的序列化与反序列化Response的序列化与反序列化报头的封装的解包网络服务服务端的封装已提取报文的移除客户端的封装客户端的调用服务端接收多个请求 JSON 自动序列化反序列化使…

QT打开摄像头采集

QT打开摄像头采集 今天好不容易把opencv的环境装好,然后想学习一下人脸识别的功能,但是在图书馆坐了4个多小时了,屁股疼就先写个摄像头采集的功能,明天继续学习吧,废话不多,嚼个奶片开始发车!&…

3.安卓逆向-java语言控制流和数据类型

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:图灵Python学院 上一个内容:2.安卓逆向-初识java语言 上一个内容里写了编写java语言代码的环境搭建,也就是下载…

你的个人生成式AI创新课程

我曾经写过许多博客文章,讨论如何使用生成式AI(GenAI)工具,例如OpenAI ChatGPT、微软Copilot和Google Gemini来提升专业效率和个人发展。然而,我们必须从仅仅使用这些GenAI工具来提高生产力的思维模式,转变…

echarts 关系图 legend 图例不显示问题

关系图希望显示图例,如下效果: 按照常规echarts图表的配置,配置完legend,图例居然不显示。 legend: {show: true,icon: circle,left: left }经过一番查找和思考,原来是因为series配置中没有设置categories项&#xf…

通信工程学习:什么是SLF签约数据定位功能

SLF:签约数据定位功能 SLF(Subscription Locator Function)即签约数据定位功能,是IMS(IP Multimedia Subsystem)IP多媒体子系统体系结构中的一个关键组成部分。其主要功能是在网络运营商部署了多个独立可寻…

Android平台RTMP|RTSP播放器如何回调YUV或RGB数据?

技术选型 我们知道,Android平台一般RTMP|RTSP播放器通常不直接提供回调YUV或RGB数据的功能。如果播放端有视觉分析或类似的需求,需要播放端,能支持YUV或ARG的数据回调,一般来说,可参考的方法如下: 1. 使用…

尚硅谷的尚乐代驾项目

项目源码 乐尚代驾项目: 重做乐尚代驾项目 (gitee.com) 一 项目介绍 1 介绍 【**乐尚代驾**】代驾是一种新型的出行服务模式,主营业务:酒后代驾、商务代驾、长途代驾,其主要特点是通过线上平台为用户提供代驾服务,伴随中国家…

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、…

Navicat备份数据库

Navicat备份数据库 📔 千寻简笔记介绍 千寻简文库已开源,Gitee与GitHub搜索chihiro-doc,包含笔记源文件.md,以及PDF版本方便阅读,文库采用精美主题,阅读体验更佳,如果文章对你有帮助请帮我点一…

【Hot100】LeetCode—300. 最长递增子序列

目录 1- 思路题目识别动规五部曲 2- 实现⭐最长递增子序列——题解思路 3- ACM 实现 原题链接:300. 最长递增子序列 1- 思路 题目识别 识别1 :给出一个数组输入 nums识别2:严格递增的子序列,子序列可以是不连续的 动规五部曲 …

数据处理与统计分析篇-day02-Linux进阶

day02-Linux进阶 补充昨日内容 Linux基础 文件编辑 命令模式 编辑模式 esc回到命令模式 正常编辑 底行(底线)模式 查看Linux命令帮助文档 # --help 可以查看命令的详细信息 命令名 --help ​ # 例如: ls --help ​ # man 可以查看命令的主要(简单)信息 man 命令名…

树莓派替代台式计算机?树莓派上七款最佳的轻量级操作系统!

​Raspberry Pi 是一款超级实惠的单板计算机(SBC),可用于各种不同的项目。Raspberry Pi 的一些最流行用途包括将其变成媒体播放器或模拟机器。鉴于该系统的多功能性,有人想知道它是否可以替代台式计算机。好吧,它可以&…

【CTF Web】BUUCTF Upload-Labs-Linux Pass-13 Writeup(文件上传+PHP+文件包含漏洞+PNG图片马)

Upload-Labs-Linux 1 点击部署靶机。 简介 upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式。 注意 1.每一关没有固定的…