StarRocks数据库FE——Catalog层

news2024/9/23 3:28:53

​仓外挂湖是指以 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 type
        if (!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.coloradmin.cn/o/986585.html

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

相关文章

Blender之锁定摄像机到视图方位

文章目录 当你在blender 中时&#xff0c;想要让你的摄像机跟随你的视图方位&#xff0c;以方便你的后期的制作&#xff0c;那应该怎么半&#xff1f; 先点击摄像机的图标&#xff0c;进入摄像机视图 然后按一下键盘的N 键&#xff0c;进入编辑模式&#xff0c;选择视图 最后…

【笔试强训选择题】Day34.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&#xff…

蓝天转债,双良转债上市价格预测

蓝天转债111017 基本信息 转债名称&#xff1a;蓝天转债&#xff0c;评级&#xff1a;AA&#xff0c;发行规模&#xff1a;8.7亿元。 正股名称&#xff1a;蓝天燃气&#xff0c;今日收盘价&#xff1a;9.74元&#xff0c;转股价格&#xff1a;10.13元。 当前转股价值 转债面值…

阿里巴巴API接口解析,实现获得商品详情

要解析阿里巴巴API接口并实现获取商品详情&#xff0c;你需要按照以下步骤进行操作&#xff1a; 了解阿里巴巴开放平台&#xff1a;访问阿里巴巴开放平台&#xff0c;并了解相关的API文档、开发者指南和规定。注册开发者账号&#xff1a;在阿里巴巴开放平台上注册一个开发者账…

【Unity编辑器扩展】| Inspector监视器面板扩展

前言【Unity编辑器扩展】| Inspector监视器面板扩展一、ContextMenu和ContextMenuItem二、Custom Editors 自定义编辑器三、Property Drawer 属性绘制器总结前言 前面我们介绍了Unity中编辑器扩展的一些基本概念及基础知识,还有编辑器扩展中用到的相关特性Attribute介绍。后面…

C高级文件相关指令

使用cut截取出Ubuntu用户的家目录&#xff0c;要求:不能使用“&#xff1a;”作为分隔 XMind

嵌入式Linux驱动开发(LCD屏幕专题)(三)

1. 硬件相关的操作 LCD驱动程序的核心就是&#xff1a; 分配fb_info设置fb_info注册fb_info硬件相关的设置 硬件相关的设置又可以分为3部分&#xff1a; 引脚设置时钟设置LCD控制器设置 2. 在设备树里指定LCD参数 framebuffer-mylcd {compatible "100ask,lcd_drv&qu…

E. Nastya and Potions

Problem - E - Codeforces 思路&#xff1a;想到用图论前驱图了&#xff0c;但是因为考虑可能有环的存在&#xff0c;但是其实题干中说明了不能通过一种或几种混合得到自己&#xff0c;所以就保证了不存在环&#xff0c;那就能用拓扑结构的性质做&#xff0c;用记忆化搜索就可以…

DHCP的interface(接口),global(全局)配置以及DHCP relay(中继),DHCP snooping,DHCP option

目录 1.DHCP的接口&#xff08;interface&#xff09;配置 2.DHCP的全局&#xff08;global&#xff09;配置 3.dhcp relay 4.dhcp snooping 5.option 这里有一个简单的拓扑图 交换机配置命令如下 The device is running!<Huawei> <Huawei>sys Enter system …

go语言基本操作---五

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

【 XXL-JOB】 XXL-JOB任务分片

文章目录 前言xxl-job 分片广播任务的详细教程创建任务编写任务代码分片参数设置执行任务查看任务执行结果示例1示例2 总结 前言 xxl-job 是一个分布式任务调度平台&#xff0c;支持定时任务和分片任务。其中&#xff0c;分片任务可以将一个大任务拆分成多个小任务&#xff0c…

用vagrant快速创建linux虚拟机

参考B站&#xff1a;https://www.bilibili.com/video/BV1np4y1C7Yf 1、下载VirtualBox 2、下载vagrant 3、vagrant官网下载.box文件 官网&#xff1a;https://app.vagrantup.com/boxes/search 例如要下载这个centos/7 点进去&#xff0c;点击下载 下载后放到一个指定目录…

qt作业day2

//widget.cpp#include "widget.h" #include "ui_widget.h"void Widget::usr_login() {if("admin" this->edit_acc->text()){if("123456" this->edit_psd->text()){speech->say("登录成功");emit jump_sig1…

latex修改公式的默认编号

文章目录 问题描述省流出错演示没有载入amsmath包载入amsmath包 总结 问题描述 有时想自己定义公式的编号&#xff0c;不想用默认的编号(1) (2)…&#xff0c;我们应该怎么做呢&#xff1f; 只需看本文一分钟就能解决。 省流 开头载入amsmath包&#xff0c;然后在公式后面加…

【C4bp】

--- --- # 2% of all animal proteins contain FN3 repeat # Humans in protein body of 1/3 constitutes Collagen

最小可用产品MVP,投石问路

最小可用产品MVP【安志强趣讲281期】 MVP(Minimum Viable Product) 趣讲大白话&#xff1a;投是问路 **************************** 最小可用产品MVP可以是如下形式&#xff1a; 1、简陋产品 2、贵宾式MVP&#xff1a;为少量客户全力周到服务&#xff0c;获得市场反馈 3、静态页…

数字 IC 设计职位经典笔/面试题(四)

共100道经典笔试、面试题目&#xff08;文末可全领&#xff09; 画出 CMOS 电路的晶体管级电路图,实现 YA*BC(DE).&#xff1f; 画出 YABC 的 CMOS 电路图&#xff0c;画出 YABCD 的 CMOS 电路图。 利用与非门和或非门实现 YABC(DE)((AB’)(CD)’(CE)’)’ 三个两输入与非门&a…

2023高教社杯数学建模A题思路分析 - 定日镜场的优化设计

# 1 赛题 A 题 定日镜场的优化设计 构建以新能源为主体的新型电力系统&#xff0c; 是我国实现“碳达峰”“碳中和”目标的一项重要 措施。塔式太阳能光热发电是一种低碳环保的新型清洁能源技术[1]。 定日镜是塔式太阳能光热发电站(以下简称塔式电站)收集太阳能的基本组件&…

物理层-数据链路层-网络层-传输层-会话层-表示层-应用层

Go网络编程 网络协议 从应用的角度出发&#xff0c;协议可理解为“规则”&#xff0c;是数据传输和数据的解释的规则。假设&#xff0c;A、B双方欲传输文件。规定&#xff1a; 第一次&#xff0c;传输文件名&#xff0c;接收方接收到文件名&#xff0c;应答OK给传输方&…

DC/DC开关电源学习笔记(四)开关电源电路主要器件及技术动态

(四)开关电源电路主要器件及技术动态 1.半导体器件2.变压器3.电容器4.功率二极管5.其他常用元件5.1 电阻5.2 电容5.3 电感5.4 变压器5.5 二极管5.6 整流桥5.7 稳压管5.8 绝缘栅-双极性晶体管1.半导体器件 功率半导体器件仍然是电力电子技术发展的龙头, 电力电子技术的进步必…