StarRocks数据库FE——Catalog层

​仓外挂湖是指以 MPP 数据库为基础,使用可插拔架构,通过开放接口对接外部存储实现统一存储,在存储底层共享一份数据,计算、存储完全分离,实现从强管理到兼容开放存储和多引擎。实现方向为增加存储能力,提升查询引擎效率。总的来看,“仓外挂湖”路径本质是在仓的基础上增加湖的多类型存储等能力,需解决以下五大技术难点:

统一元数据管理。打通不同数据系统,具备数据共享和跨库分析的能力,并支持互联互通、计算下推、协同计算,实现数据多平台之间透明流动。仓外挂湖路径目前主要是将对接外部存储如Hadoop、对象存储等的元数据进行采集,统一存储、管理。

存储开放性。仓外挂湖路径的存储开放性主要表现在:存储介质兼容方面,将非数仓自身存储如 Hadoop、云对象存储等的数据纳入管理;数据格式方面,采用开放、标准化的数据格式,既包含 Hudi、Iceberg、Delta Lake 等开放格式,也包括 Parquet、ORC、CSV 等存储格式的支持。

扩展查询引擎。仓外挂湖路径保留原 MPP 计算引擎计算能力的基础之上,主要是增加批处理和实时数据处理的能力。其中批处理方面是融合更轻量级、高效率的计算能力,而实时处理方面则是通过微批以及增量计算的方式,增强流的计算能力。

存算分离。仓外挂湖需进行存算分离架构改造,而传统的MPP 存算耦合架构,不具备云原生能力。目前,仓外挂湖路径主要基于存算分离架构改造后的云原生 MPP 数据库实现。

弹性伸缩。基于 K8S、Docker 等容器化技术对 MPP 体系的组件、服务进行容器化改造。目前该路径有实现计算层、存储层弹性伸缩,少量产品实现了根据业务负载自动弹性伸缩计算资源。

本篇文章借助StarRocks FE的源码研究一下如何对接大数据系统的元数据。为了更简单地直接分析开放数据湖上的数据,StarRocks 提供了统一 Catalog 管理的能力,用户可以通过一键创建 Apache Hive/Apache Hudi/Apache Iceberg(以下简称 Hive/Hudi/Iceberg) 的 Catalog,轻松地分析湖上的所有数据,而无需逐个表进行 schema 建模。此外,通过统一的 Catalog,StarRocks 可以实现对湖上数据的统一管理。

在这里插入图片描述

Internal catalog: 内部数据目录,用于管理 StarRocks 所有内部数据。例如,执行 CREATE DATABASE 和 CREATE TABLE 语句创建的数据库和数据表都由 internal catalog 管理。每个 StarRocks 集群都有且只有一个 internal catalog 名为 default_catalog。
External catalog: 外部数据目录,用于连接外部 metastore。在 StarRocks 中,您可以通过 external catalog 直接查询外部数据,无需进行数据导入或迁移。当前支持创建以下类型的 external catalog:Hive catalog:用于查询 Hive 数据;Iceberg catalog:用于查询 Iceberg 数据;Hudi catalog:用于查询 Hudi 数据;Delta Lake catalog:用于查询 Delta Lake 数据;JDBC catalog:用于查询 JDBC 数据源的数据。

如上图所示,右上角的Catalog类就是上述Internal Catalog和External Catalog的父类,就是catalog在内存中的对象。这里使用一个CatalogMgr来管理集群中所有的Catalog对象:

其中有一个字典对象catalogs,存放的是CatalogName到Catalog对象的映射,通过该catalog的名字查找catalogs就是获取对应的Catalog对象。

其中还有一个对象connectorMgr其类型是ConnectorMgr,该对象引用的就是集群中所有外部元数据连接器的管理类。

在这里插入图片描述
CatalogMgr是内存中管理Catalog元数据对象的管理类,其包含private final Map<String, Catalog> catalogs = new HashMap<>();字典用于存放catalogName到Catalog元数据对象的映射,private final ConnectorMgr connectorMgr;外部元数据连接器管理类(非常重要),private final CatalogProcNode procNode = new CatalogProcNode();和相关函数向优化器提供对catalogs字典的二维访问。首先通过创建Catalog的函数说明CatalogMgr成员的作用。首先createCatalog函数传入形参CreateCatalogStmt,从其中提取catalog名、catalog类型、配置connector的Properties属性;createCatalog函数首先查找catalogs是否已经存在这样的catalogName,如果没有则需要调用connectorMgr.createConnector(new ConnectorContext(catalogName, type, properties))对这样的catalog创建connector(这里connector和catalog不需要关联【仅仅通过catalogName关联】,connector是存储在内存中,而catalog会持久化到磁盘上,恢复后connector需要再次新建);新建ExternalCatalog外部catalog对象,将其put到catalogs中去。这里的InternalCatalog目前在StarRocks中只有默认的一个,不能够动态创建,默认创建好。

    public void createCatalog(CreateCatalogStmt stmt) throws DdlException {createCatalog(stmt.getCatalogType(), stmt.getCatalogName(), stmt.getComment(), stmt.getProperties());}public void createCatalog(String type, String catalogName, String comment, Map<String, String> properties) throws DdlException {if (Strings.isNullOrEmpty(type)) { throw new DdlException("Missing properties 'type'"); }readLock();try { Preconditions.checkState(!catalogs.containsKey(catalogName), "Catalog '%s' already exists", catalogName);} finally {  readUnlock();}writeLock();try {Preconditions.checkState(!catalogs.containsKey(catalogName), "Catalog '%s' already exists", catalogName);Connector connector = connectorMgr.createConnector(new ConnectorContext(catalogName, type, properties));if (null == connector) {LOG.error("connector create failed. catalog [{}] encounter unknown catalog type [{}]", catalogName, type);  throw new DdlException("connector create failed");}long id = isResourceMappingCatalog(catalogName) ? ConnectorTableId.CONNECTOR_ID_GENERATOR.getNextId().asInt() : GlobalStateMgr.getCurrentState().getNextId();Catalog catalog = new ExternalCatalog(id, catalogName, comment, properties);catalogs.put(catalogName, catalog);if (!isResourceMappingCatalog(catalogName)) {GlobalStateMgr.getCurrentState().getEditLog().logCreateCatalog(catalog);}} finally {writeUnLock();}}

这里再看看加载Catalogs的流程,其实就是读取序列化后的catalog信息,然后调用replayCreateCatalog将其重放到CatalogMgr中去。

    public long loadCatalogs(DataInputStream dis, long checksum) throws IOException, DdlException {int catalogCount = 0;try {String s = Text.readString(dis);SerializeData data = GsonUtils.GSON.fromJson(s, SerializeData.class);if (data != null) {if (data.catalogs != null) {for (Catalog catalog : data.catalogs.values()) {if (!isResourceMappingCatalog(catalog.getName())) {  replayCreateCatalog(catalog);}}catalogCount = data.catalogs.size();}}checksum ^= catalogCount;LOG.info("finished replaying CatalogMgr from image");} catch (EOFException e) {LOG.info("no CatalogMgr to replay.");}return checksum;}public void replayCreateCatalog(Catalog catalog) throws DdlException {String type = catalog.getType();String catalogName = catalog.getName();Map<String, String> config = catalog.getConfig();if (Strings.isNullOrEmpty(type)) { throw new DdlException("Missing properties 'type'");}// skip unsupport connector typeif (!ConnectorType.isSupport(type)) {LOG.error("Replay catalog [{}] encounter unknown catalog type [{}], ignore it", catalogName, type);return;}readLock();try { Preconditions.checkState(!catalogs.containsKey(catalogName), "Catalog '%s' already exists", catalogName);} finally { readUnlock();}Connector connector = connectorMgr.createConnector(new ConnectorContext(catalogName, type, config));if (null == connector) {LOG.error("connector create failed. catalog [{}] encounter unknown catalog type [{}]", catalogName, type);throw new DdlException("connector create failed");}writeLock();try {catalogs.put(catalogName, catalog);} finally {writeUnLock();}}

如下图所示Catalog类中只保持了catalog id全局唯一,catalog名、catalog Porperties配置。
在这里插入图片描述

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

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

相关文章

微信小程序实现连续签到七天

断签之后会从第一天重新开始 <template><view class"content" style"height: 100vh;background: white;"><view class"back"><view style"position: absolute;bottom: 200rpx;left: 40rpx;width: 90%;"><i…

MySQL 连接查询和存储过程

一、连接查询 mysql的连接查询&#xff0c;通常都是将来自两个或多个表的记录行结合起来&#xff0c;基于这些表之间的共同字段&#xff0c;进行数据的拼接 首先&#xff0c;要确定一个主表作为结果集&#xff0c;然后将其它表的行有选择性的连接到选定的主表结果上&#xff…

stride与padding对输出尺寸的计算

公式&#xff1a; 练习&#xff1a; 图1&#xff1a; input4&#xff0c;filter3&#xff0c;padding0&#xff0c;stride1 output2 图2&#xff1a; input5&#xff0c;filter3&#xff0c;padding0&#xff0c;stride2 output2 图3&#xff1a; input6&#xff0c;filter3&am…

go语言基本操作---五

error接口的使用 Go语言引入了一个关于错误处理的标准模式&#xff0c;即error接口&#xff0c;它是Go语言内建的接口类型 type error interface {Error() string }package mainimport ("errors""fmt" )type Student struct {name stringid int }func …

elementui表格自定义表头的两种方法

表格自定义表头的方式 多选框表头换文字 请查看上篇博客&#xff1a;http://t.csdn.cn/69De2 文字换按钮 render-header render-header方法详情 Table-column Attributes 参数说明类型可选值默认值render-header列标题 Label 区域渲染使用的 FunctionFunction(h, { column, $in…

异常的顶级理解

目录 1.异常的概念与体系结构 1.1异常的体系结构 1.2异常的举例 1.3错误的举例 2.异常的分类 2.1编译时异常 2.2运行时异常 3.异常的处理 3.1异常的抛出throw 3.2try-catch捕获并处理 3.3finally 3.4 异常声明throws 4.自定义异常类 1.异常的概念与体系结构 1.1异常的…

springboot项目实现helloworld

使用Spring官方源创建项目&#xff08;推荐&#xff09; 缺陷&#xff1a;镜像在国外下载速度有点慢 选择配置 选择版本 实现HelloWorld 删除部分不重要的文件 idea隐藏文件 使用云原生的方式创建项目&#xff08;spring官方源&#xff09; 访问地址&#xff1a;Spring Init…

深入理解联邦学习——纵向联邦学习

分类目录&#xff1a;《深入理解联邦学习》总目录 假设进行联邦学习的数据提供方为 A A A和 B B B&#xff0c;第三方为 C C C&#xff0c;则纵向联邦学习步骤如下&#xff1a; 在系统级做加密样本对齐&#xff0c;在企业感知层面不会暴露非交叉用户对齐样本进行模型加密训练&…

Hadoop:HDFS--分布式文件存储系统

目录 HDFS的基础架构 VMware虚拟机部署HDFS集群 HDFS集群启停命令 HDFS Shell操作 hadoop 命令体系&#xff1a; 创建文件夹 -mkdir 查看目录内容 -ls 上传文件到hdfs -put 查看HDFS文件内容 -cat 下载HDFS文件 -get 复制HDFS文件 -cp 追加数据到HDFS文件中 -appendTo…

【FusionInsight 迁移】HBase从C50迁移到6.5.1(01)迁移概述

【FusionInsight 迁移】HBase从C50迁移到6.5.1&#xff08;01&#xff09;迁移概述 HBase从C50迁移到6.5.1&#xff08;01&#xff09;迁移概述迁移范围迁移前的准备HDFS文件检查确认HBase迁移目录确保数据落盘停止老集群HBase服务停止新集群HBase服务 HBase从C50迁移到6.5.1&a…

设计模式之观察者模式、访问者模式与模板方法模式

目录 观察者模式 简介 优缺点 结构 实现 运用场景 访问者模式 简介 优缺点 结构 实现 运用场景 模板方法模式 简介 优缺点 结构 实现 运用场景 观察者模式 简介 又叫发布-订阅模式&#xff0c;定义对象间一种一对多的依赖关系&#xff0c;使得每当一个对象改…

vue3自定义指令

自定义指令是用来增强与扩展元素功能的 在vue官方文当中写的很明白,这里我就不在赘述官方文档.只记录在项目中的实际应用. 局部定义 <template><h4>指令</h4><p v-color-red>字体固定颜色的指令</p><p v-color-value"blue">可…

【List篇】ArrayList 详解(含图示说明)

Java中的ArrayList是一个动态数组&#xff0c;可以自动扩展容量以适应数据的添加和删除。它可以用来存储各种类型的数据&#xff0c;例如String&#xff0c;Integer&#xff0c;Boolean等。ArrayList实现了List接口&#xff0c;可以进行常见的List操作&#xff0c;例如添加、插…

Gridea+GitPage+Gittalk 搭建个人博客

&#x1f44b;通过GrideaGitPage 搭建属于自己的博客&#xff01; &#x1f47b;GitPage 负责提供 Web 功能&#xff01; &#x1f63d;Gridea 作为本地编辑器&#xff0c;方便 push 文章&#xff01; &#x1f3f7;本文讲解如何使用 GrideaGitPage 服务域名&#xff08;可选&a…

原生Js Canvas去除视频绿幕背景

Js去除视频背景 注&#xff1a; 这里的去除视频背景并不是对视频文件进行操作去除背景 如果需要对视频扣除背景并导出可以使用ffmpeg等库&#xff0c;这里仅作播放用所以采用这种方法 由于uniapp中的canvas经过封装&#xff0c;且 uniapp 的 drawImage 无法绘制视频帧画面&…

TOWE雷达光敏感应开关,让生活更智能、更安全

现代生活中&#xff0c;智能家居成为人们追求品质生活的必备之选。其中&#xff0c;照明控制的智能化已然成为一种趋势&#xff0c;传统的灯光开关需要人们手动操作&#xff0c;既不方便&#xff0c;有时候也会造成资源的过度浪费&#xff0c;而雷达光敏感应开关的出现&#xf…

QT之形态学操作

形态学操作包含以下操作&#xff1a; 腐蚀 (Erosion)膨胀 (Dilation)开运算 (Opening)闭运算 (Closing)形态梯度 (Morphological Gradient)顶帽 (Top Hat)黑帽(Black Hat) 其中腐蚀和膨胀操作是最基本的操作&#xff0c;其他操作由这两个操作变换而来。 腐蚀 用一个结构元素…

【MySQL】MySQL的安装,登录,配置和相关命令

文章目录 前言一. 卸载不需要的环境二. 获取MySQL的yum源三. 安装MySQL和启动四. 尝试登录MySQL方法1&#xff1a;获取临时root密码方法2&#xff1a;没有密码方法3&#xff1a;配置文件 五. 简单配置结束语 前言 本篇文章是基于云服务器&#xff1b;Linux&#xff1a;Centos7…

Leetcode.174 地下城游戏

题目链接 Leetcode.174 地下城游戏 hard 题目描述 恶魔们抓住了公主并将她关在了地下城 d u n g e o n dungeon dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里&#xff0c;他必须穿过地下城并通过对抗恶魔来拯救公…

Vuepress样式修改内容宽度

1、相关文件 一般所在目录node_modules\vuepress\theme-default\styles\wrapper.styl 2、调整宽度&#xff0c;截图中是已经调整好的&#xff0c;在我电脑上显示刚刚好。