Hologres和MaxCompute深度兼容,无需数据搬迁,即可通过外部表查询MaxCompute的数据。当实例中需要加速的MaxCompute表较多时,操作会比较繁琐,Hologres从V1.1.43版本开始支持MaxCompute外部表自动加载功能。本文将为您介绍如何使用MaxCompute外部表自动加载功能。

技术原理

Hologres从 V1.1.43版本开始支持MaxCompute外部表自动加载,通过一定的参数设置,自动同步MaxCompute元数据,自动创建Hologres外部表,无需再手动创建外部表,即可加速查询MaxCompute数据。自动加载外部表有两种方式,如下图所示:自动加载
  • 外部表按需加载

    针对MaxCompute数量较少的场景,可以直接开启外部表按需加载功能。开启后在Hologres中查询同名MaxCompute外部表时,会自动创建对应的Hologres外部表,从而实现加速的能力。该功能仅查询时触发外部表自动加载,不会周期性加载。

  • 外部表全量自动加载。

    若是MaxCompute Project中的表数量较多或者有多个Project需要加速查询,可以通过参数开启Project全量数据自动加载。这种方式在指定Project后,发起查询时会将Project中所有MaxCompute表自动创建为Hologres外部表,实现整个Project全量映射。同时在全量Project数据加载完成后,如果有新增MaxCompute表,可以通过参数设置周期性巡检,在查询发起时自动创建对应的外表。该功能适用于需要加速大量MaxCompute表的场景,如BI加速场景。

使用限制

  • 仅Hologres V1.1.43及以上版本支持MaxCompute外部表自动加载,如果您的实例是V1.1.43以下版本,请您使用自助升级或加入实时数仓Hologres交流群(钉钉群号:32314975)申请升级实例。
  • 使用MaxCompute外部表自动加载时,MaxCompute的Project Name不能以hg_或者holo_开头,这些是Hologres的保留关键字。
  • 自动创建外部表时,对应MaxCompute表中存在Hologres外部表目前不支持的数据类型,则该外部表无法自动创建,需要您手动选择支持的字段创建外部表。
  • 外部表按需加载场景下:
    • 查询外部表时,如果以Project Name为Schema下外部表不存在时,Hologres会自动以MaxCompute中的Project Name作为Schema名、以Table Name作为Hologres外部表名称自动创建对应的外部表。
    • 如果已经存在相同的Schema和Table名称的内部表,实际查询的是Hologres的内部表,此时并不会触发MaxCompute外部表自动加载功能。
    • 由于自动加载时会创建外部表,需要查询账号拥有该数据库的创建、删除Schema和Table的权限。若使用自动加载已经创建出了外部表,查询账号仅需要查询权限即可。
    • 一次查询最多只能自动加载6张表,即一个SQL中最多包含6张表,超过6张表后,自动加载会失败,需要重新查询才能自动加载外表。
  • 外部表全量自动加载场景下:
    • 不建议设置自动加载时间小于5分钟。
    • 不建议将表超过1000张的MaxCompute的项目设置为默认Project。
    • 针对已加载的Hologres外表,如果MaxCompute中该表有表结构改变,指定Project全量加载将不会自动对该外表结构更新,需要使用import命令手动更新该表。
  • 从Hologres V1.3.28版本开始,为了降低自动巡检的系统资源消耗,全量自动加载的周期性巡检参数hg_experimental_load_all_foreign_table_interval_time5min变为30min
  • 外部表自动加载暂不支持加载开启了三层模型的MaxCompute Project。

外部表按需加载

  • 开启外部表按需加载。
    可以通过设置hg_experimental_enable_auto_load_foreign_table参数开启外部表自动加载。
    ALTER DATABASE <database name> SET hg_experimental_enable_auto_load_foreign_table = on;
    database name为需要开启MaxCompute外部表自动加载的数据库名称。MaxCompute外部表自动加载默认为关闭状态,即默认值为off。
    开启后,您可以通过select schema_name.table_name直接查询MaxCompute中的表。其中schema_name对应MaxCompute中的Project Name,table_name对应该Project下的Table Name。如您通过JDBC连接Hologres,可通过在JDBC URL中配置currentSchema参数,关联MaxCompute中的目标Project,详情请参见JDBC
    说明 如您查询时未指定schema_name,则系统会把当前Schema Name(例如系统默认schema: public)作为MaxCompute中的Project Name,在该Project中查找这个外表的元数据。请确保MaxCompute中存在同名Project。
  • 关闭外部表按需加载。
    使用如下SQL关闭自动加载功能。关闭后将不再自动同步MaxCompute元数据,不再自动创建MaxCompute外部表,Hologres侧仅可看到已经加载的外部表和数据,如需增加更多MaxCompute外部表,需要手动执行import命令,详情请参见IMPORT FOREIGN SCHEMA
    ALTER DATABASE <database name> SET hg_experimental_enable_auto_load_foreign_table = off;
    database name为需要关闭MaxCompute外部表自动加载的数据库名称。
  • 删除已加载的外部表。

    如果不再需要加速查询外部表数据,执行DROP语句删除外部表即可,详情请参见DROP TABLE

外部表全量自动加载

  • 开启指定Project全量自动加载。
    若是需要加速的MaxCompute表较多,可以开启Project全量数据自动加载。该功能需要指定MaxCompute Project名称,同时如果Project中有新增MaxComute外表,可以通过参数周期性巡检,并在查询外表时自动加载,实现Project的全量和增量加速。使用步骤如下:
    1. 开启外部表自动加载。
      在Project全量加载前,需要先使用如下命令开启外部表自动加载。
      ALTER DATABASE <database name> SET hg_experimental_enable_auto_load_foreign_table = on;
      database name为需要开启MaxCompute外部表自动加载的数据库名称。
    2. 开启指定Project全量自动加载。
      开启外部表自动加载后,通过如下参数自动将指定MaxCompute Project的所有表加载为Hologres的外部表,当查询外部表时,系统将会自动将Project中的所有表加载为Hologres外部表,实现全量加载。
      ALTER DATABASE <database name> 
      SET hg_experimental_default_odps_project_list='<odps_project_name_1>,<odps_project_name_2>...';
      参数说明如下。
      参数说明
      database name需要设置MaxCompute外部表自动加载的数据库名称。
      odps_project_name_1MaxCompute的项目名称。
      odps_project_name_2MaxCompute的项目名称。
      MaxCompute项目名称为空,即不周期性的加载任何Project中表的元数据。
    3. 开启周期性巡检。
      配置指定project全量加载后,如果Project中有新增MaxCompute表,可以通过如下时间参数进行周期性巡检。在超过设置的巡检时间后,系统会在查询对应外部表时,自动加载新增的MaxCompute为Hologres外部表,实现增量外部表加速。
      -- 查看数据库的自动加载间隔时间
      show hg_experimental_load_all_foreign_table_interval_time;
      
      -- 修改数据库的自动加载间隔时间
      ALTER DATABASE <database name> SET hg_experimental_load_all_foreign_table_interval_time = '5min';
      database name为需要设置MaxCompute外部表自动加载的数据库名称。默认间隔时间5分钟,即5分钟内有新增MaxCompute表,在5分钟之后查询发起时,会自动将新增的MaxCompute表加载为Hologres外表。
  • 查看自动加载Project。
    您可以使用如下SQL查看已设置自动加载的Project。
    show hg_experimental_default_odps_project_list;

使用示例

  • 示例1:外部表按需加载。
    打开demo数据库的MaxCompute外部表自动加载。打开后,当查询外部表时,若数据库中没有同名外部表,则会自动创建,从而实现加速的功能。
    ALTER DATABASE demo SET hg_experimental_enable_auto_load_foreign_table = on;
  • 示例2:外部表全量自动加载。
    将MaxCompute的Project:odps_hologres设置为自动加载的Project,设置后会将该Project中的全部表自动创建为Hologres外部表。同时系统会根据hg_experimental_load_all_foreign_table_interval_time的配置周期性巡检,周期巡检时间为10分钟,自动周期性加载odps_hologres这个Project中新增的表。
    --开启外表加速
    ALTER DATABASE demo SET hg_experimental_enable_auto_load_foreign_table = on;
    --自动全量加载odps_project中的表
    ALTER DATABASE demo SET hg_experimental_default_odps_project_list='odps_hologres';
    --设置巡检周期为10min
    ALTER DATABASE demo SET hg_experimental_load_all_foreign_table_interval_time = '10min';