外部项目1.0迁移为湖仓一体2.0方案

由于湖仓一体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元数据和数据。内外部映射关系如图所示。

image.png

当前湖仓一体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内外部映射关系如图所示。

image.png

外部数据源的创建和新外部项目的创建详情,请参见湖仓一体2.0使用指南

支持Schema模式及兼容性影响说明

MaxCompute支持开启Schema功能,分两个开关,分别如下:

  • 项目级元数据支持的Schema开关

    您可以在MaxCompute控制台工作区 > 项目管理页面,对需要元数据支持的Schema的项目进行开启操作。若项目未支持Schema,则操作列会有如下入口,您可自行操作。

    image

    项目级元数据支持的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模式

  • 开启SQL语法支持的Schema模式

存量任务

  • 若存量任务是...FROM tt的层析结构将被解析为current_project(p).table(t),语法兼容。

  • 若存量任务是...FROM p.tp.t的层析结构将被解析为current_project.schema(p).table(t),而数据位于project(p).table(t)下,并不存在Schema(p)层析,因此会报错。

  • 无需修改。

  • 建议修改为:...FROM p.default.t

新任务

  • 若新任务写成p.default.t,将被解析为project(p).schema(default).table(t)

  • 若新任务写成default.t,将被解析为current_project.schema(default).table(t)

  • 若新任务写成t,将被解析为 current_project.current_schema.table(t)

  • 若新任务写成p.s.t,将被解析为project(p).schema(s).table(t),若Project(p)项目下并没有Schema(s)层析,将报错找不到对应的Schema(s)。

无。

  • 开启元数据支持的Schema模式

  • 未开启SQL语法支持的Schema模式

存量任务

  • 若存量任务是...FROM tt的层析结构将被解析为current_project(p).schema(default).table(t),语法兼容。

  • 若存量任务是...FROM p.tp.t的层析结构将被解析为project(p).schema(default).table(t),系统将自动补全Default Schema层级,从而确保语法的兼容性。

无。

新任务

  • 若新任务写成p.t,将被解析为project(p).schema(default).table(t),系统将自动补全Default Schema层级。

  • 若新任务写成t,将被解析为project.schema(default).table(t),系统将自动补全Default Schema层级。

说明

当前状态下,不支持访问自定义Schema,也不支持使用USE SCHEMA <schema_name>

无。

  • 开启元数据支持的Schema模式

  • 开启SQL语法支持的Schema模式

存量任务

  • 若存量任务是...FROM tt的层析结构将被解析为current_project(p).schema(default).table(t),语法兼容。

  • 若存量任务是...FROM p.tp.t的层析结构将被解析为current_project.schema(p).table(t),而数据位于project(p).table(t)下,并不存在Schema(p)层析,因此会报错。

  • 场景一:无需修改。

  • 场景二:建议修改...FROM p.default.t

新任务

按照支持Schema模式和语法规则使用。

无。

迁移说明

  1. 根据不同场景,选择存量项目或创建新项目开启项目级元数据支持的Schema开关

    开启后会自动生成一个Default Schema,该项目下所有的内部表会归属到Default下。关于更多Schema介绍,详情请参见SchemaSchema操作

    说明

    开启项目级别元数据支持的Schema模式后不支持关闭,且开启后原项目中的其他任务,以及访问此项目都可能会存在兼容性变化,需谨慎操作。关于Schema兼容性介绍详情,请参见支持Schema模式及兼容性影响说明

  2. 在已开启元数据支持的Schema模式的项目中,创建外部Schema。您可以根据数据源类型查看相应的创建详情,请参见湖仓一体2.0使用指南

    说明

    建议外部Schema名称要与外部项目的名称一致。

  3. 改造存量项目。

    • 场景一:在运行存量任务的项目中创建并访问外部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;