Spark Catalog深入理解与实战——《DEEPNOVA开发者社区》

本文深入探讨了Spark如何识别和访问Hive数据源,通过SessionCatalog和ExternalCatalog实现,以及如何应对新数据源(DataSourceV2)的挑战。文章详细介绍了CatalogPlugin接口及其在V2SessionCatalog中的应用,揭示了Spark使用CatalogManager管理多个Catalog实例的过程,并通过Spark Iceberg的实现展示了如何支持多类型Catalog,最后讨论了Catalog在数据入湖和跨Hive版本迁移等场景的应用。
摘要由CSDN通过智能技术生成

作者:闻乃松

写过Spark应用程序的同学都知道,通过下面这段代码就可以加载和访问外部Hive数据源:

SparkSession.builder().

    appName(TestSparkHive.class.getSimpleName()).

    master("local[*]").

    enableHiveSupport().

    getOrCreate();

List<Row> list= spark.sql("show databases").collectAsList();

也许你会好奇,它是怎么找到并访问外部Hive数据源的?

其实,Spark识别Hive,也是需要依赖Hive配置项的,配置项的来源可以是$HIVE_HOME环境变量,也可以从Spark的运行环境的classpath下加载Hive相关的配置文件。

创建对Hive外部数据源的访问,不得不提到Spark的两个类:SessionCatalog和ExternalCatalog。前者是对后者的封装,对外部数据源的访问都是通过ExternalCatalog实现。而ExternalCatalog是一个Trait类型,提供了对表、函数和分区的增删改查基本接口。对Hive数据源来讲,分别继承上述两个类,提供了具体的实现:HiveSessionCatalog和HiveExternalCatalog。

随着新数据源(Spark中称为DataSourceV2)的出现,原来的SessionCatalog暴露出弊端和不足,为了适应新的数据源特性,Spark推出了新的接口:CatalogPlugin,因为属于顶层接口,CatalogPlugin本身很简单,只有3个方法:

public interface CatalogPlugin {

   void initialize(String name, CaseInsensitiveStringMap options);

   String name();

   default String[] defaultNamespace() { return new String[0]; }

}

实现自定义Catalog,既可以直接实现CatalogPlugin,也可以扩展TableCatalog接口,TableCatalog扩展了CatalogPlugin并提供了表操作相关功能的接口。同理,实现函数相关的Catalog,也可以直接扩展FunctionCatalog,因为它提供了函数管理相关的接口。同SessionCatalog相对应,CatalogPlugin接口体系也实现了V2SessionCatalog,整个CatalogPlugin类体系表示为下图所示:

V2SessionCatalog不同于SessionCataolog,主要表现在:

1. V2SessionCatalog实现了CatalogPlugIn接口,CatalogPlugIn是针对新数据源(DatasourceV2)的元数据管理。

2. SessionCatalog 只是普通类,封装了外部数据源的元数据管理接口ExternalCatalog。

3. SessionCatalog 作为V2SessionCatalog的属性,或者说 V2SessionCatalog是SessionCatalog的代理实现。

关于第3点,可以从V2SessionCatalog的实现得到佐证,同时以一个方法listTables的实现为例来看:

 /**translates calls to the v1 SessionCatalog. */

class V2SessionCatalog(catalog: SessionCatalog) extends TableCatalog

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值