目前对多Catalog的支持俨然成为计算引擎的标配,因为在OLAP场景,跨数据源的联合查询是一大刚需。但是,传统的计算引擎如Hive、Spark2对多Catalog支持能力很弱,也许是受Flink、Presto(Trino)的步步紧逼,Hive3也开始支持多Catalog,但是仅限于存储层面和API层面,还没有推进到SQL层。Spark相比Hive要进展好得多,在多Catalog的实现方式上甚至成为Flink实现多Catalog的借鉴对象。本文来研究下Spark3多Catalog的用法。
首先我们从简单的Spark查询开始。
SparkConf sparkConf = new SparkConf()
.set("hive.metastore.uris",hiveMetastoreURI)
.set("spark.sql.warehouse.dir",warehousePath)
.setMaster("local[*]") // spark-submit should remove this
.setAppName(getClass().getSimpleName());
SparkSession sparkSession = SparkSession.builder().config(sparkConf).enableHiveSupport().getOrCreate();
sparkSession.sql("show databases").show();
如上示例,Spark3 仅通过配置hive.metastore.uris 地址,我们就可以访问Hive Metastore的元数据,进行SQL查询等操作,最新Spark3 基于Hive Metastore Client 2.3.9版本开发,能够兼容HMS 2.x和3.x,但是使用有个限制:无法访问HMS3.x 非默认Catalog中的元数据。(此处所说的Catalog是HMS 存储模型中的Catalog,非本文说的Spark Catlalog)。
如果要访问HMS3.x 非默认Catalog中的元数据,就需要指定HMS的高版本jars路径,Spark3 提供了加载外部jars的方式,这里以Hive 3.1.2为例:
SparkConf sparkConf = new SparkConf()
.set("hive.metastore.uris",hiveMetastoreURI)
.set("spark.sql.warehouse.dir",warehousePath)
.set("spark.sql.hive.metastore.version", "3.1.2")
.set("metastore.catalog.default", defaultCatalogName)
.set("spark.sql.hive.metastore.jars", String.format("%s/lib/*", hiveHome))
.setMaster("local[*]") // spark-submit should remove this
.setAppName(getClass().getSimpleName());
SparkSession sparkSession = SparkSession.builder().config(sparkConf).enableHiveSupport().getOrCreate();
sparkSession.sql("show databases").show();
示例中通过metastore.catalog.default指定了当前要访问的HMS catalog,此时Spark就能够获取到defaultCatalogName指定的catalog 下的HMS元数据。
除了可以配置上述HMS地址参数外,还可以配置更多参数,而参数的名称和值,跟使用Hive、Hadoop参数一样的标准参数。以Spark 操作Ic

最低0.47元/天 解锁文章
1366

被折叠的 条评论
为什么被折叠?



