本文介绍将湖仓一体1.0外部项目存量作业迁移至湖仓一体2.0外部Schema不同场景的修改方法。并说明使用湖仓一体2.0开启项目级别元数据支持的Schema开关和SQL语法支持的Schema开关后,存量作业的兼容情况。
湖仓一体1.0的外部项目(简称:外部项目1.0)功能及用法不再发展,且会收敛下线。如果继续使用MaxCompute访问联邦数据源,建议将联邦方案升级至湖仓一体2.0。
背景信息
湖仓一体1.0支持使用外部项目联邦DLF+OSS、HMS+HDFS两种数据源。外部项目1.0中表的上一级即为项目,使用项目层级与DLF的Database或Hive的Database映射。
联邦DLF+OSS数据湖的外部项目1.0直接包含连接信息,MaxCompute引擎通过外部项目1.0的属性对接DLF元数据和OSS数据。
对于HMS+HDFS Hadoop实例,通过抽象出外部数据源(Foreign Server)对象保存连接信息访问实例。MaxCompute引擎依赖外部数据源读取Hive元数据和数据。
湖仓一体1.0与湖仓一体2.0对比
当前湖仓一体1.0的联邦方式存在一些限制,针对这些问题湖仓一体2.0作出了相应优化,对比项如下表所示:
对比项 | 湖仓一体1.0 | 湖仓一体2.0 |
外部数据源 | 外部数据源对象在不同联邦场景下不统一,没有抽象外部数据源不利于租户面资源共享和权限控制。 | 抽象出统一的外部数据源(Foreign Server),更利于租户面权限和数据面权限分离,便于共享和权限管理。 |
项目模式 | 项目内即是表,与更常见的 为了映射数据源的表的上一级的管理对象(例如DLF的Database、Hologres的Schema),需要创建大量的外部项目。 | 项目升级为支持Schema模式,可以新建或将存量的 |
计算方式 | 外部项目1.0虽是项目级别的对象,但必须依赖一个数仓项目才可以执行计算任务,进而增加跨项目数据访问授权复杂性。 | 湖仓一体2.0推出外部Schema(External Schema),以映射数据源表对象上一级的层次。同时外部Schema使用归属的数仓项目计算资源进行计算。 |
内外部映射关系 |
|
|
外部数据源的创建和新外部项目的创建详情,请参见湖仓一体2.0使用指南。
支持Schema模式及兼容性影响说明
MaxCompute支持开启Schema功能,分为项目级元数据支持的Schema开关和SQL语法支持的Schema开关两个开关。
项目级元数据支持的Schema开关
开关打开后不支持回退关闭,且开启后原项目中的其他任务,以及访问此项目都可能会存在兼容性变化,需谨慎操作。
项目层析结构变化
项目级元数据支持的Schema模式开启后,项目层析结构为
Project.Schema.Table;Schema模式关闭时,项目层析结构为
Project.Table。
访问自定义Schema数据
若需要访问自定义Schema下的数据,需要开启SQL语法支持的Schema模式,否则只能访问DEFAULT Schema下的数据。
内建Schema
每个项目下会内建有一个名称为Default的Schema,且不可自定义单独删除。
操作步骤
登录MaxCompute控制台,在左上角选择地域。
在左侧导航栏,选择。
在项目管理页面,单击目标项目操作列的升级到支持Schema层级。
SQL语法支持的Schema开关
SQL语法支持的Schema存在两个不同层级,Session级别和租户级别。二者作用范围不同,详情如下:
Session级别设置
仅影响当前Session的语义,优先级高于租户级别设置,可通过SET odps.namespace.schema= true | false;命令打开或关闭SQL语法支持的Schema模式。
租户级别设置
租户级SQL语法支持的Schema模式开启后,需注意以下情况:
所有任务不用再加Session级别语法开关,且新建的项目默认为元数据支持Schema模式。
所有项目均支持SQL语法支持的Schema模式,且打开后不支持回退关闭。
如果项目中存量任务以SQL语法支持的Schema模式运行不兼容时,开启此开关会造成存量任务运行失败。因此,建议先Session级别开启SQL语法支持的Schema模式,验证通过后,再开启租户级SQL语法支持的Schema模式。
操作步骤
登录MaxCompute控制台,在左上角选择地域。
在左侧导航栏,选择 。
在租户管理页面,单击租户属性页签。
如果当前租户下没有任何项目
在租户属性页签,打开租户级Schema语法开关。
如果当前租户下有项目
不允许也不建议修改。
关于开启租户级Schema详情,请参见租户属性。
兼容性影响
若湖仓一体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;。

