Spark-源码学习-SparkSQL-架构设计-Catalog 体系-架构设计(2.x)
一、概述
在 Spark SQL 系统中,Catalog 主要用于各种函数资源信息和元数据信息(数据库、数据表、数据视图、数据分区与函数等)的统一管理。Spark SQL 的 Catalog 体系涉及多个方面。
二、架构设计
Spark SQL 中的 Catalog 体系实现以 SessionCatalog 为主体,通过 SparkSession (Spark 程序入口)提供给外部调用。一般一个 SparkSession 对应一个 SessionCatalog。本质上,SessionCatalog 起到了一个代理的作用,对底层的元数据信息、临时表信息、视图信息和函数信息进行了封装。
![](https://note3.oss-cn-hangzhou.aliyuncs.com/source/%E6%88%AA%E5%B1%8F2023-02-25%2018.30.44.png)
2.1. 构造参数
SessionCatalog 的构造参数包括 6 部分,除传入 Spark SQL 和 Hadoop 配置信息的 CatalystConf 与 Configuration 外,还涉及以下4个方面的内容。
2.1.1. GlobalTempViewManager
对应 DataFrame 中常用的 $createGlobalTempView()$ 方法,进行跨 Session 的视图管理。GlobalTempViewManager 是一个线程安全的类,提供了对全局视图的原子操作,包括创建、更新、删除和重命名等。
![](https://note3.oss-cn-hangzhou.aliyuncs.com/source/image-20230702151825568.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,text_d3d3Lnp4Y2hvbWUuY29tCg==,size_36,g_center,color_FFFFFF,shadow_100,t_100,g_se,x_30,y_160)
GlobalTempViewManager 对视图名是大小写敏感的。
2.1.2. FunctionResourceLoader(函数资源加载器)
在 Spark SQL 中除内置实现的各种函数外,还支持用户自定义的函数和 Hive 中的各种函数。这些函数往往通过 Jar 包或文件类型提供,FunctionResourceLoader 主是用来加载这两种类型的资源以提供函数的调用。
![](https://note3.oss-cn-hangzhou.aliyuncs.com/source/image-20230702152827388.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,text_d3d3Lnp4Y2hvbWUuY29tCg==,size_36,g_center,color_FFFFFF,shadow_100,t_100,g_se,x_30,y_160)
对于 Archive 类型的资源,目前仅支持在 YARN 模式下以 spark-submit 方式提交时进行加载。
2.1.3. FunctionRegistry(函数注册接口)
用来实现对函数的注册(Register)、查找(Lookup)和删除(Drop)等功能。一般来讲,FunctionRegistry 的具体实现需要是线程安全的,以支持并发访问。在 Spark SQL 中默认实现是 SimpleFunctionRegistry,其中采用 Map 数据结构注册了各种内置的函数。
![](https://note3.oss-cn-hangzhou.aliyuncs.com/source/image-20230702152458079.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,text_d3d3Lnp4Y2hvbWUuY29tCg==,size_36,g_center,color_FFFFFF,shadow_100,t_100,g_se,x_30,y_160)
2.1.4. ExternalCatalog (外部系统 Catalog)
SessionCatalog 实例持有对 ExternalCatalog 的引用, 对外部数据源的访问都是通过 ExternalCatalog 实现。ExternalCatalog 提供了对表、函数和分区的增删改查基本接口。通过实现 ExternalCatalog 接口可以实现对 Catalog 的扩展~
![](https://note3.oss-cn-hangzhou.aliyuncs.com/source/image-20230702153956164.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,text_d3d3Lnp4Y2hvbWUuY29tCg==,size_36,g_center,color_FFFFFF,shadow_100,t_100,g_se,x_30,y_160)
ExternalCatalog 是一个抽象类,定义了上述 4 个方面的功能。在 Spark SQL 中,具体实现有 InMemoryCatalog 和 HiveExternalCatalog 两种。
InMemoryCatalog
InMemoryCatalog 将元数据储存在内存之中,其使用一个HashMap类型,储存数据库元信息,一般用于测试或比较简单的 SQL 处理
1
2// Database name -> description
private val catalog = new scala.collection.mutable.HashMap[String, DatabaseDesc]DatabaseDesc 表示数据库元信息
InMemoryCatalog 会将元数据全部储存在内存之中,不会在当前目录下创建
metastore_db
目录。数据库的真实数据(数据库、表数据)会储存在磁盘中,具体位置由 spark.sql.warehouse.dir 参数决定默认在当前目录下的spark-warehouse目录。
HiveExternalCatalog 利用 Hive 原数据库来实现持久化的管理,在生产环境中广泛应用。
HiveExternalCatalog 为 Spark 提供了与 Hive MetaStore 的交互能力。
除上述的构造参数外,其内部还包括一个 mutable 类型的 HashMap 用来管理临时表信息,以及 currentDb 成员变量用来指代当前操作所对应的数据库名称。