一、概述

在 Spark SQL 系统中,Catalog 主要用于各种函数资源信息和元数据信息(数据库、数据表、数据视图、数据分区与函数等)的统一管理。Spark SQL 的 Catalog 体系涉及多个方面。

二、架构设计

Spark SQL 中的 Catalog 体系实现以 SessionCatalog 为主体,通过 SparkSession (Spark 程序入口)提供给外部调用。一般一个 SparkSession 对应一个 SessionCatalog。本质上,SessionCatalog 起到了一个代理的作用,对底层的元数据信息、临时表信息、视图信息和函数信息进行了封装。

2.1. 构造参数

SessionCatalog 的构造参数包括 6 部分,除传入 Spark SQL 和 Hadoop 配置信息的 CatalystConf 与 Configuration 外,还涉及以下4个方面的内容。

2.1.1. GlobalTempViewManager

对应 DataFrame 中常用的 $createGlobalTempView()$ 方法,进行跨 Session 的视图管理。GlobalTempViewManager 是一个线程安全的类,提供了对全局视图的原子操作,包括创建、更新、删除和重命名等。

GlobalTempViewManager 对视图名是大小写敏感的。

2.1.2. FunctionResourceLoader(函数资源加载器)

在 Spark SQL 中除内置实现的各种函数外,还支持用户自定义的函数和 Hive 中的各种函数。这些函数往往通过 Jar 包或文件类型提供,FunctionResourceLoader 主是用来加载这两种类型的资源以提供函数的调用。

对于 Archive 类型的资源,目前仅支持在 YARN 模式下以 spark-submit 方式提交时进行加载。

2.1.3. FunctionRegistry(函数注册接口)

用来实现对函数的注册(Register)、查找(Lookup)和删除(Drop)等功能。一般来讲,FunctionRegistry 的具体实现需要是线程安全的,以支持并发访问。在 Spark SQL 中默认实现是 SimpleFunctionRegistry,其中采用 Map 数据结构注册了各种内置的函数。

2.1.4. ExternalCatalog (外部系统 Catalog)

SessionCatalog 实例持有对 ExternalCatalog 的引用, 对外部数据源的访问都是通过 ExternalCatalog 实现。ExternalCatalog 提供了对表、函数和分区的增删改查基本接口。通过实现 ExternalCatalog 接口可以实现对 Catalog 的扩展~

ExternalCatalog 是一个抽象类,定义了上述 4 个方面的功能。在 Spark SQL 中,具体实现有 InMemoryCatalog 和 HiveExternalCatalog 两种。

  1. InMemoryCatalog

    InMemoryCatalog 将元数据储存在内存之中,其使用一个HashMap类型,储存数据库元信息,一般用于测试或比较简单的 SQL 处理

    1
    2
    // Database name -> description
    private val catalog = new scala.collection.mutable.HashMap[String, DatabaseDesc]

    DatabaseDesc 表示数据库元信息

    DatabaseDesc

    InMemoryCatalog 会将元数据全部储存在内存之中,不会在当前目录下创建 metastore_db 目录。数据库的真实数据(数据库、表数据)会储存在磁盘中,具体位置由 spark.sql.warehouse.dir 参数决定

    默认在当前目录下的spark-warehouse目录。

  2. HiveExternalCatalog 利用 Hive 原数据库来实现持久化的管理,在生产环境中广泛应用。

    HiveExternalCatalog 为 Spark 提供了与 Hive MetaStore 的交互能力。

除上述的构造参数外,其内部还包括一个 mutable 类型的 HashMap 用来管理临时表信息,以及 currentDb 成员变量用来指代当前操作所对应的数据库名称。