由于湖仓一体1.0的外部项目(简称:外部项目1.0)功能及用法不再发展,且会收敛下线,如果继续使用MaxCompute访问联邦数据源,联邦方案需要升级至湖仓一体2.0。本文介绍了使用湖仓一体2.0开启项目级别元数据支持的Schema开关和SQL语法支持的Schema开关后,存量作业的兼容情况,以及将湖仓一体1.0外部项目的存量作业迁移至湖仓一体2.0外部Schema的不同场景的修改方法,以便于您进行评估和迁移。
背景信息
湖仓一体1.0支持使用外部项目联邦DLF+OSS,以及HMS+DFS两种数据源。外部项目1.0中表的上一级即为项目,使用项目层级与DLF的Database或Hive的Database映射。
联邦DLF+OSS数据湖的外部项目1.0直接包含连接信息,MaxCompute引擎通过外部项目1.0的属性对接DLF元数据和OSS数据,而对HMS+HDFS Hadoop实例的访问,则抽象出了外部数据源(Foreign Server)对象来保存连接信息,MaxCompute引擎依赖外部数据源读取Hive元数据和数据。内外部映射关系如图所示。
当前湖仓一体1.0的联邦方式有一些不便,例如:
外部数据源对象在不同联邦场景下不统一,没有抽象外部数据源不利于租户面资源共享和权限控制。
Project内即是Table的外部项目1.0与更常见的
Project.Schema.Table
层析的数据源不匹配,为了映射数据源的表的上一级的管理对象(例如DLF的Database、Hologres的Schema),需要创建大量的外部项目。外部项目1.0虽是项目级别的对象,但必须依赖一个数仓项目才可以执行计算任务,进而增加跨项目数据访问授权复杂操作等。
为了解决这些问题,湖仓一体2.0做了如下改动:
抽象了统一的外部数据源(Foreign Server),更利于租户面权限和数据面权限分离,便于共享和权限管理。
MaxCompute项目也升级为支持Schema模式,可以新建或将存量的
Project.Table
层析替换为Project.Schema.Table
层析,以匹配更多数据库、大数据生态的数据源。湖仓一体2.0推出外部Schema(External Schema),以映射数据源表对象上一级的层次。同时外部Schema使用归属的数仓项目计算资源进行计算。
湖仓一体2.0内外部映射关系如图所示。
外部数据源的创建和新外部项目的创建详情,请参见湖仓一体2.0使用指南。
支持Schema模式及兼容性影响说明
MaxCompute支持开启Schema功能,分两个开关,分别如下:
项目级元数据支持的Schema开关
您可以在MaxCompute控制台的 页面,对需要元数据支持的Schema的项目进行开启操作。若项目未支持Schema,则操作列会有如下入口,您可自行操作。
项目级元数据支持的Schema模式开启后,需注意以下情况:
项目层析结构为
Project.Schema.Table
。说明若未开启,项目层析结构为
Project.Table
。若需要访问自定义Schema下的数据,需要开启SQL语法支持的Schema模式,否则只能访问DEFAULT Schema下的数据。
打开后不支持回退关闭,且开启后原项目中的其他任务,以及访问此项目都可能会存在兼容性变化,需谨慎操作。
每个Project下会内建有一个名称为Default的Schema,且不可自定义单独删除。
SQL语法支持的Schema开关
Session级别设置:仅影响当前Session的语义,优先级高于租户级别设置,可通过
SET odps.namespace.schema=true | false;
命令打开或关闭SQL语法支持的Schema模式。租户级别设置:您可以在MaxCompute控制台的租户管理>租户属性页面查看,同时如果当前租户下没有任何项目,则可以在租户属性页面打开租户级Schema语法开关,如果当前租户下有项目,不允许也不建议您修改。关于开启租户级Schema详情,请参见租户属性。
租户级SQL语法支持的Schema模式开启后,需注意以下情况:
所有任务不用再加Session级别语法开关,且新建的项目默认为元数据支持Schema模式。
所有项目均支持SQL语法支持的Schema模式,且打开后不支持回退关闭。
如果项目中存量任务以SQL语法支持的Schema模式运行不兼容时,开启此开关会造成存量任务运行失败。因此,建议先Session级别开启SQL语法支持的Schema模式,验证通过后,再开启租户级SQL语法支持的Schema模式。
未开启Schema功能时,不支持a.b.c
层析结构,并将a.b
层析结构,解析为project.table
。开启Schema功能后,可将a.b.c
层析结构,解析为project.schema.table
;将a.b
层析结构,解析为schema.table
。
若湖仓一体2.0项目级元数据支持的Schema模式与SQL语法支持的Schema模式,开启或关闭的状态不一致,会产生兼容错误。对于均未开启项目级别元数据支持的Schema模式与SQL语法支持的Schema模式的数仓项目(层析结构为:project(p).table(t)
),且存量任务可正常运行的背景下,对数仓项目开启元数据支持的Schema模式,对数仓项目中的查询任务开启SQL语法支持的Schema模式,若原查询任务的SQL表达式不变,直接运行可能产生兼容性报错,详情如下表所示。
Schema功能状态 | 任务类型 | 兼容情况 | 修改建议 |
| 存量任务 |
|
|
新任务 |
| 无。 | |
| 存量任务 |
| 无。 |
新任务 |
说明 当前状态下,不支持访问自定义Schema,也不支持使用 | 无。 | |
| 存量任务 |
|
|
新任务 | 按照支持Schema模式和语法规则使用。 | 无。 |
迁移说明
根据不同场景,选择存量项目或创建新项目开启项目级元数据支持的Schema开关。
开启后会自动生成一个Default Schema,该项目下所有的内部表会归属到Default下。关于更多Schema介绍,详情请参见Schema和Schema操作。
说明开启项目级别元数据支持的Schema模式后不支持关闭,且开启后原项目中的其他任务,以及访问此项目都可能会存在兼容性变化,需谨慎操作。关于Schema兼容性介绍详情,请参见支持Schema模式及兼容性影响说明。
在已开启元数据支持的Schema模式的项目中,创建外部Schema。您可以根据数据源类型查看相应的创建详情,请参见湖仓一体2.0使用指南。
说明建议外部Schema名称要与外部项目的名称一致。
改造存量项目。
场景一:在运行存量任务的项目中创建并访问外部Schema中的数据
例如:运行存量任务的项目为Project(p1),查询外部项目为
external_project(e).table(t)
。经过上述步骤改造后,联邦数据源已经重新映射的层析结构为project (p1).external_schema(e).table(t)
。若存量任务为
SELECT * FROM e.t;
,开启SQL语法支持的Schema开关后,e.t
的层析结构被解析为external_schema(e).table(t)
,在项目Project(p1)中可正常运行无需修改。说明若未开启SQL语法支持的Schema模式,存量任务
SELECT * FROM e.t;
中e.t
的层析结构将被解析为project (e).table(t)
,会查询名称为e
的内部或外部项目,与重新映射的层析结构不一致,存量访问任务将报错。若Project(p1)关联外部项目进行数据查询,例如:
SELECT * FROM e.t1 JOIN p1.t2;
,开启SQL语法支持的Schema开关后,会将p1.t2
中的p1
解析为Schema层级,因此需要将SQL修改为:SELECT * FROM e.t1 JION p1.default.t2;
。
场景二:跨项目创建并访问外部Schema中的数据
例如:运行存量任务的项目为Project(p1),外部项目层析结构为
external_project(e).table(t)
。由于Project(p1)不适合开启元数据支持的Schema模式,可重新选择或创建项目Project(p2)进行上述步骤改造。经过改造后,联邦数据源重新映射的层析结构为project (p2).external_schema(e).table(t)
。Project(p1)中存量任务,例如:
SELECT * FROM e.t;
,开启SQL语法支持的Schema开关后,需要将SQL修改为:SELECT * FROM p2.e.t;
。说明若将上述任务在Project(p2)中运行,则无需修改。
跨项目进行外部Schema和数仓项目的关联查询时,如果在Project(p1)下运行
SELECT * FROM e.t1 JOIN p1.t2;
,虽然Project(p1)未开启元数据支持的Schema模式,但是开启了SQL语法支持的Schema模式,查询p1.t2
还是会在Project(p1)下查询Schema(p1),因此需要将SQL修改为:SELECT * FROM p2.e.t1 JOIN p1.default.t2;
。