Hologres外部表

本文介绍如何创建Hologres外部表,以及如何在外部表建表语句中指定Hologres数据源、STS认证信息或打开双签名开关、映射目标表、JDBC驱动信息。

功能介绍

Hologres是兼容PostgreSQL协议的实时交互式分析数据仓库,在底层与MaxCompute无缝连接。通过在MaxCompute上创建Hologres外部表,可以实现基于PostgreSQL JDBC驱动及STS认证信息查询Hologres数据源的数据。该方式无冗余存储,无需导入导出数据,可实现快速获取查询结果。

适用范围

  • 数据操作(DML)

    • MaxCompute不支持对创建的Hologres外部表执行更新(UPDATE)、删除(DELETE)操作。

    • 不支持对Hologres外部表执行INSERT OVERWRITE操作:

      Hologres侧读取Hologres映射MaxCompute的外表,通过HologresINSERT OVERWRITE语义完成从MaxComputeHologres的数据覆盖写入,详情请参见INSERT OVERWRITE

  • 数据写入风险

    当向Hologres外部表写入大量数据时,由于采用并行多进程写入,会存在小概率某个写入进程数据重写的情况,从而导致数据重复。

  • 分区

    Hologres的分区表和MaxCompute的分区表没有对应关系。Hologres外部表不支持分区,但直读模式下,查询MaxComputeHologres外部表映射Hologres的分区父表时,查询条件匹配分区子表的分区列,可以进行分区裁剪。

  • Hologres外部表不支持cluster属性。

  • Hologres外部表不支持映射HologresDynamic Table。

支持数据类型

  • DECIMAL类型限制:

    MaxCompute中创建的Hologres外部表,DECIMAL数据类型默认且固定为decimal(38,18),不能修改。如果源表小数位数较少,可以在MaxCompute外部表中将该列定义为STRING类型,在使用时再通过CAST函数强制转换。

  • 复杂类型限制:

    MaxCompute创建的Hologres外部表,不支持ArrayMapStruct等复杂数据类型。

  • 其他不兼容类型:

    Hologres中的MONEY等数据类型,目前在MaxCompute中没有对应的数据类型,暂时不支持。

详情如下表所示

Hologres数据类型

MaxCompute数据类型

JDBC

JDBC

直读(odps.table.api.enable.holo.table=true)

说明

INTEGER(别名INTINT4)

INT

已开通

已开通

已开通

32位有符号整型。

TEXT

STRING、VARCHAR

已开通

已开通

已开通

字符串类型,目前长度限制为8 MB。

SMALLINT

SMALLINT

已开通

已开通

已开通

16位有符号整型。

INT2

SMALLINT

已开通

已开通

已开通

16位有符号整型。

BIGINT(别名INT8)

BIGINT

已开通

已开通

已开通

64位有符号整型。

BYTEA

BINARY

已开通

已开通

已开通

二进制数据类型,目前长度限制为8 MB。HologresBINARY最大为1 GB。

REAL(别名FLOAT4)

FLOAT

已开通

已开通

已开通

32位二进制浮点型。

DOUBLE PRECISION(别名FLOAT8)

DOUBLE

已开通

已开通

已开通

64位二进制浮点型。

BOOLEAN(别名BOOL)

BOOLEAN

已开通

已开通

已开通

BOOLEAN类型。

TIMESTAMP

TIMESTAMP_NTZ

已开通

未开通

已开通

存储精度为纳秒,存在时区的时间误差。

HologresTIMESTAMP类型不包含时区,存储精度为微秒。

TIMESTAMP WITH TIME ZONE(别名TIMESTAMPTZ)

TIMESTAMP

已开通

未开通

已开通

时间戳类型,精确到纳秒,格式为yyyy-mm-dd hh:mm:ss.xxxxxxxxx

MaxComputeHologres在底层已经进行了精度转换。MaxCompute输出不包含时区格式。

DECIMAL(别名NUMERIC)

DECIMAL(precision,scale)

已开通

已开通

已开通

10进制精确数字类型。

  • precision:表示最多可以表示多少位的数字。取值范围:1 <= precision <= 38

  • scale:表示小数部分的位数。默认取值范围: 0 <= scale <= 18

MaxComputeDECIMAL如果未指定精度,则默认为(38,18),使用IMPORT FOREIGN SCHEMA语句创建表时系统会自动转换精度。

CHAR(n)

CHAR(n)

已开通

已开通

已开通

MaxComputeCHAR(n)为固定长度字符类型,n为长度。最大取值为255。长度不足则使用空格填充。

HologresCHAR(n) 最大为1G。

VARCHAR(n)

VARCHAR(n)

已开通

已开通

已开通

MaxComputeVARCHAR(n)为可变长度字符类型,n为长度。取值范围为1~65535。

HologresVARCHAR(n) 最大为1G。

DATE

DATE

已开通

已开通

已开通

日期类型,格式为yyyy-mm-dd

INT4[]

ARRAY<INT>

已开通

未开通

已开通

复杂类型ARRAY。

INT8[]

ARRAY<BIGINT>

已开通

未开通

已开通

FLOAT4[]

ARRAY<FLOAT>

已开通

未开通

已开通

FLOAT8[]

ARRAY<DOUBLE>

已开通

未开通

已开通

BOOLEAN[]

ARRAY<BOOLEAN>

已开通

未开通

已开通

TEXT[]

ARRAY<STRING>

已开通

未开通

已开通

JSONB

JSON

未开通

未开通

已开通

复杂类型 JSON,直读模式支持。

JSON

STRING

已开通

未开通

未开通

字符串类型,目前长度限制为8 MB。JDBC模式支持HologresJSON类型。

SERIAL(自增序列)

INT

已开通

未开通

已开通

Hologres的自增序列字段,MaxCompute可用INT类型接收,但写入时无法实现自增功能。

RoaringBitmap

不支持

未开通

未开通

未开通

MaxCompute侧没有映射的类型。

RoaringBitmap64

不支持

未开通

未开通

未开通

MaxCompute侧没有映射的类型。

BIT(n)

不支持

未开通

未开通

未开通

MaxCompute侧没有映射的类型。

VARBIT(n)

不支持

未开通

未开通

未开通

MaxCompute侧没有映射的类型。

INTERVAL

不支持

未开通

未开通

未开通

MaxCompute侧没有映射的类型。

TIMETZ

不支持

未开通

未开通

未开通

MaxCompute侧没有映射的类型。

TIME

不支持

未开通

未开通

未开通

MaxCompute侧没有映射的类型。

INET

不支持

未开通

未开通

未开通

MaxCompute侧没有映射的类型。

MONEY

不支持

未开通

未开通

未开通

MaxCompute侧没有映射的类型。

OID

不支持

未开通

未开通

未开通

MaxCompute侧没有映射的类型。

UUID

不支持

未开通

未开通

未开通

MaxCompute侧没有映射的类型。

创建Hologres外部表

可以通过如下两种方式创建Hologres外部表:STS模式和双签名模式。

注意事项

外部表创建规范

  • 如果Hologres开启了IP白名单功能,用户需要采用双签名模式创建Hologres外部表。如果用STS模式创建Hologres外部表,MaxCompute访问Hologres时会被IP白名单拦截。

  • 对于Hologres的父表、子表,Hologres外部表中会指定表名,并执行SQL语句。父表、子表都可以映射至Hologres外部表,但是父表只能读不能写。

  • Hologres外部表写入数据时,暂不支持HologresINSERT ON CONFLICT(UPSERT)机制。如果Hologres源表有主键,请避免写入的数据与Hologres源表中的数据产生主键唯一性冲突。

  • 表名和字段名大小写不敏感,且在创建表、查询表及字段时不支持强制转换大小写。

Schema兼容性

Hologres源表中的Schema与外表Schema不一致时:

  • 列数不一致:如果Hologres源表中的列数小于外表DDL的列数,则读取RDS数据时,系统会报错。例如column "xxx" does not exist。当Hologres源表中的列数大于外表DDL的列数时,系统会丢弃超出的列数据。

  • 列类型不一致:MaxCompute不支持使用INT类型接收Hologres源表中的STRING类型数据,支持使用STRING类型接收INT类型数据(不推荐)。

语法说明

在创建外部表时,需要在建表DDL语句中指定StorageHandler,并配置STS认证信息(或打开双签名开关)、JDBC连接地址,以实现访问Hologres数据源。

STS模式创建Hologres外部表

具体使用示例代码,详情请参见创建Hologres外部表(STS模式)

CREATE EXTERNAL TABLE [IF NOT EXISTS] <table_name>(
  <col1_name> <data_type>,
  <col2_name> <data_type>,
  ......
)
stored BY 'com.aliyun.odps.jdbc.JdbcStorageHandler'
WITH serdeproperties (
  'odps.properties.rolearn'='<ram_arn>')
location '<jdbc:postgresql://<endpoint>:<port>/<database>?ApplicationName=MaxCompute&[currentSchema=<schema>&][useSSL={true|false}&]table=<holo_table_name>/>' 
tblproperties (
  'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver', 
  'odps.federation.jdbc.target.db.type'='holo',
  'odps.federation.jdbc.colmapping'='<table_column1>:<source_column1>, <table_column2>:<source_column2>,...'
);

双签名模式创建Hologres外部表

具体使用示例代码,详情请参见创建Hologres外部表(双签名模式)

双签名Hologres外部表支持相同RAM用户可以访问MaxComputeHologres对应有权限的表,不需要再手工授权。同时支持HologresIP白名单能力,便于使用。

-- 打开双签名开关
SET odps.sql.common.table.planner.ext.hive.bridge=true;
-- 创建外部表
CREATE EXTERNAL TABLE [IF NOT EXISTS]  <table_name>(
  <col1_name> <data_type>,
  <col2_name> <data_type>,
  ......
)
STORED BY '<com.aliyun.odps.jdbc.JdbcStorageHandler>'
LOCATION '<jdbc:postgresql://<endpoint>:<port>/<database>?ApplicationName=MaxCompute&[currentSchema=<schema>&][useSSL={true|false}&]table=<holo_table_name>/>' 
tblproperties (
  'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver', 
  'odps.federation.jdbc.target.db.type'='holo',
  ['odps.federation.jdbc.colmapping'='<table_column1>:<source_column1>, <table_column2>:<source_column2>,...']
);

参数说明

参数

是否必填

说明

odps.sql.common.table.planner.ext.hive.bridge

是否通过双签名模式创建Hologres外部表。值设置为true,表示打开双签名开关。

通过STS模式创建Hologres外部表不需要填写。

IF NOT EXISTS

  • 如果不指定IF NOT EXISTS选项且存在同名表,会报错。

  • 如果指定IF NOT EXISTS,无论是否存在同名表,即使原表结构与要创建的目标表结构不一致,均返回成功。已存在的同名表的元数据信息不会被改动。

table_name

MaxCompute上创建的Hologres外部表的名称。

col_name

Hologres外部表的列名称。

data_type

Hologres外部表的列的数据类型。

STORED BY

指定StorageHandler,定义如何查询Hologres外部表。

固定取值为com.aliyun.odps.jdbc.JdbcStorageHandler,使用JdbcStorageHandler连接方式。

ram_arn

通过STS模式创建Hologres外部表必填。指定RAM角色的ARN信息,用于创建外部表时STS认证信息的填写。

  1. 登录RAM控制台

  2. 在左侧导航栏选择身份管理 > 角色

  3. 角色页面,单击目标角色名称,进入该角色详情页。

  4. 基础信息区域,可以获取ARN信息。

通过双签名模式创建Hologres外部表不需要填写。

LOCATION

Hologres实例的JDBC连接地址。其中:

  • endpoint:必填。Hologres实例的经典网络域名

    重要

    目前仅支持通过经典网络域名进行访问。不支持通过VPC 网络域名访问Hologres。

  • port:必填。Hologres实例的网络端口

    1. 登录Hologres管理控制台,在左上角选择地域。

    2. 在左侧导航栏选择实例列表

      实例列表页面,单击目标实例名称。

    3. 网络信息区域获取Hologres实例的经典网络域名和网络端口。

  • database:必填。连接的Hologres数据库名称。更多Hologres数据库信息,请参见CREATE DATABASE

  • ApplicationName:必填。默认为MaxCompute,无需修改。

  • schema:可选。如果表名在Hologres数据库内是唯一的,或源表是默认Schema中的表,可以不配置该属性。更多Schema信息,请参见CREATE SCHEMA

  • holo_table_name:必填。Hologres源表名称。更多Hologres源表信息,请参见CREATE TABLE

tblproperties

  • mcfed.mapreduce.jdbc.driver.class:必填。

    指定连接Hologres数据库的驱动程序。固定取值为org.postgresql.Driver

  • odps.federation.jdbc.target.db.type:必填。

    指定连接的数据库类型。固定取值为holo

  • odps.federation.jdbc.colmapping:可选。

    如果需要将指定数据源的部分列映射至Hologres外部表,需要配置该参数,指定Hologres源表的字段和Hologres外部表字段的映射关系。

    • 若未配置该参数,按照源表字段名映射至Hologres外部表同名列。

    • 若配置该参数,但是只指定Hologres外部表部分列的映射关系,则按照源表字段名映射至Hologres外部表同名列,其他未指定的列,列名或类型不匹配会报错。

    • 若配置该参数,Hologres里的字段名称存在大写的情形,需要为Hologres字段名称添加双引号("")。格式为:MaxCompute字段1 : "Hologres字段1"[ ,MaxCompute字段2 : "Hologres字段2" ,...]

      说明

      Hologres源表字段是c bool, map_B string, a bigint。Hologres外部表字段是a bigint, x string, c bool

      colmapping配置的内容是'x: "map_B"',则可以成功映射并查询Hologres数据。

  • mcfed.mapreduce.jdbc.input.query:可选。

    读取Hologres数据源表数据。外部表的列、列名与直接查询的Hologres数据源表的列、列名及数据类型保持一致。如果使用了别名,则与别名保持一致。select_sentence格式为SELECT xxx FROM <holo_database_name>.<holo_schema_name>.<holo_table_name>

使用示例

准备数据

如果已有Hologres数据库、Hologres表及测试数据,可忽略该步骤。

创建Hologres数据库

  1. 登录Hologres管理控制台,在左上角选择地域。

  2. 在左侧导航栏选择实例列表

  3. 若没有实例,需要先购买Hologres实例

    实例列表页面,单击目标实例名称。

  4. 在实例详情页面,单击登录实例

  5. 单击上方元数据管理页签。

    单击新建数据库,在弹出的对话框中,填写数据库名称,其他参数保持默认。

创建Hologres

  1. 在实例详情页面,单击登录实例

  2. 单击上方SQL编辑器页签。

  3. 输入如下语句

    CREATE TABLE IF NOT EXISTS holo (
        id   INT PRIMARY KEY,
        name TEXT
    );
    
    INSERT INTO holo (id, name) VALUES
        (1, 'kate'),
        (2, 'mary'),
        (3, 'bob'),
        (4, 'tom'),
        (5, 'lulu'),
        (6, 'mark'),
        (7, 'haward'),
        (8, 'lilei'),
        (9, 'hanmeimei'),
        (10, 'lily'),
        (11, 'lucy');
    
    SELECT * FROM holo ORDER BY id;

创建Hologres外部表(STS模式)

前置准备

  1. 安装并配置MaxCompute客户端

  2. 已准备好待创建Hologres外部表的目标MaxCompute项目。

    创建MaxCompute项目信息,请参见创建MaxCompute项目

RAM角色创建及授权

说明

由于Hologres不支持将跨主账号的RAM Role添加至数据库实例,所以HologresSTS模式普通角色授权只支持同账号的RAM Role。

相应的,MaxCompute访问Hologres的外部表或外部schema,都只支持同账号的RAM Role。

  1. 创建RAM角色

    创建RAM角色获取ARN信息,用于创建外部表时填写STS认证信息。创建RAM角色的信任主体类型根据实际需求选择,本示例中信任主体类型为云账号。

    操作步骤如下:

    1. 登录RAM控制台

    2. 在左侧导航栏选择身份管理 > 角色

    3. 角色页面,单击创建角色

    4. 创建角色页面,选择信任主体类型云账号

    5. 信任主体名称选择当前云账号

  2. 修改信任策略配置内容

    1. 角色页面,单击目标角色名称,进入该角色详情页。

    2. 信任策略页签,单击编辑信任策略,在编辑信任策略页面选择脚本编辑页签。

    3. 参照如下内容修改信任策略配置

      修改信任策略配置内容与选择的可信实体类型相关。其中<UID>即阿里云账号ID,可在用户信息页面获取。

      可信实体类型为阿里云账号

      {
        "Statement": [
          {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Principal": {
              "RAM": [
                "acs:ram::<UID>:root"
              ]
            }
          },
          {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Principal": {
              "Service": [
                "<UID>@odps.aliyuncs.com"
              ]
            }
          }
        ],
        "Version": "1"
      }

      可信实体类型为身份提供商

      {
        "Statement": [
              {
                  "Action": "sts:AssumeRole",
                  "Condition": {
                      "StringEquals": {
                          "saml:recipient": "https://signin.aliyun.com/saml-role/sso"
                      }
                  },
                  "Effect": "Allow",
                  "Principal": {
                      "Federated": [
                          "acs:ram::<UID>:saml-provider/IDP"
                      ]
                  }
              },
              {
                  "Action": "sts:AssumeRole",
                  "Effect": "Allow",
                  "Principal": {
                      "Service": [
                          "<UID>@odps.aliyuncs.com"
                      ]
                  }
              }
          ],
          "Version": "1"
      }
  3. 添加RAM角色至Hologres实例并授权

    RAM角色需要有Hologres实例的开发权限,才能在权限范围内使用Hologres。由于RAM角色默认没有Hologres管理控制台的查看和操作实例的权限,因此需要阿里云账号完成RAM相关权限授予才能进行后续操作。将RAM角色添加至Hologres实例。授权方式及步骤如下:

    通过Hologres管理控制台授权

    1. 登录Hologres管理控制台,在左上角选择地域。

    2. 在左侧导航栏选择实例列表

    3. 实例列表页面,单击目标实例名称。

    4. 在实例详情页面,单击登录实例

    5. 单击上面安全中心页签。

      在左侧导航栏选择用户管理

    6. 用户管理页面,单击右上角新增用户,在弹出的新增用户页面,添加RAM角色至Hologres实例。

    7. DB授权页签,为该RAM角色授予实例的开发权限。

      若数据库的权限策略设置为专家模式,则需在用户管理页面将角色类型修改为SuperUser,后续将不再需要进行数据库授权操作。

      1. 在左侧导航栏选择DB 授权

      2. DB 授权页面,单击目标数据库对应操作列的用户授权

      3. 在授权页面,单击右上角新增授权,在弹出的新增授权对话框,选择RAM角色并配置Developer 用户组

    通过RAM访问控制台授权

    若是通过RAM用户扮演RAM角色,RAM用户默认没有Hologres管理控制台的权限,需要阿里云账号给RAM用户在访问控制页面授予AliyunRAMReadOnlyAccess权限,否则RAM用户无法在Hologres管理控制台进行任何操作。详情请参见文档授予RAM用户权限

    1. 登录RAM控制台

    2. 在左侧导航栏选择身份管理 > 角色

    3. 角色页面,单击目标角色名称所在行操作列的新增授权

    4. 选择AliyunRAMReadOnlyAccess权限为当前角色授权。

    通过SQL方式授权

    通过SQL方式进行授权,授权SQL请参见Hologres权限模型

MaxCompute中创建外部表

  1. 登录MaxCompute客户端,进入目标MaxCompute项目。

  2. 执行如下命令创建Hologres外部表。

    按照准备数据步骤,准备好的Hologres实例信息如下:

    • Hologres数据库名称:holo_external_test

    • Hologres数据库的Schema:public

    • Hologres表名称:holo

    • Hologres数据库经典网络连接地址:hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80

    CREATE EXTERNAL TABLE IF NOT EXISTS my_table_holo_jdbc
    (
     id bigint,
     name string
    )
    stored BY 'com.aliyun.odps.jdbc.JdbcStorageHandler' 
    WITH serdeproperties (
      'odps.properties.rolearn'='acs:ram::139699392458****:role/<role name>')
    location 'jdbc:postgresql://hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80/<holo database name>?ApplicationName=MaxCompute&currentSchema=public&useSSL=true&table=<table name>/'
    tblproperties (
      'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver',
      'odps.federation.jdbc.target.db.type'='holo',
      'odps.federation.jdbc.colmapping'='id:id,name:name'
    );
  3. 执行如下命令基于新建的Hologres外部表查询Hologres源表信息。

    -- 访问Hologres外部表需要添加如下属性。
    SET odps.sql.split.hive.bridge=true;
    SET odps.sql.hive.compatible=true;
    SET odps.table.api.enable.holo.table=true; --开启JDBC直读方式 
    -- 查询Hologres外部表数据。
    SELECT * FROM my_table_holo_jdbc limit 10;
    -- 返回结果。
    +------------+------------+
    | id         | name       | 
    +------------+------------+
    | 9          | hanmeimei  | 
    | 4          | tom        | 
    | 7          | haward     | 
    | 2          | mary       | 
    | 5          | lulu       | 
    | 8          | lilei      | 
    | 10         | lily       | 
    | 1          | kate       | 
    | 6          | mark       | 
    | 11         | lucy       | 
    +------------+------------+
  4. 基于Hologres外部表与Hologres进行数据交换、联合分析。

    • MaxCompute加工后的数据利用Hologres外部表,写入Hologres实现加速分析、在线服务。命令示例如下。

      -- 访问Hologres外部表需要添加如下属性。
      SET odps.sql.split.hive.bridge=true;
      SET odps.sql.hive.compatible=true;
      SET odps.table.api.enable.holo.table=true; --开启JDBC直读方式 
      -- 向Hologres外部表插入数据。
      INSERT INTO my_table_holo_jdbc VALUES (12,'alice');
      -- 查询Hologres外部表数据。
      SELECT * FROM my_table_holo_jdbc;
      -- 返回结果。
      +------------+------------+
      | id         | name       | 
      +------------+------------+
      | 9          | hanmeimei  | 
      | 4          | tom        | 
      | 7          | haward     | 
      | 2          | mary       | 
      | 5          | lulu       | 
      | 12         | alice      | 
      | 8          | lilei      | 
      | 10         | lily       | 
      | 1          | kate       | 
      | 11         | lucy       | 
      | 6          | mark       | 
      | 3          | bob        | 
      +------------+------------+
    • 频繁更新的维度表保存在Hologres,满足实时动态更新需要。MaxCompute通过外部表方式访问维度表与MaxCompute中事实表进行关联分析,命令示例如下。

      -- 访问Hologres外部表需要添加如下属性。
      SET odps.sql.split.hive.bridge=true;
      SET odps.sql.hive.compatible=true;
      -- 创建MaxCompute内部表。
      CREATE TABLE holo_test AS SELECT * FROM my_table_holo_jdbc;
      -- MaxCompute内部表与Hologres外部表进行关联分析。
      SELECT * FROM my_table_holo_jdbc t1 INNER JOIN holo_test t2 ON t1.id=t2.id;
      -- 返回结果。
      +------------+------------+------------+------------+
      | id         | name       | id2        | name2      | 
      +------------+------------+------------+------------+
      | 9          | hanmeimei  | 9          | hanmeimei  | 
      | 4          | tom        | 4          | tom        | 
      | 7          | haward     | 7          | haward     | 
      | 2          | mary       | 2          | mary       | 
      | 5          | lulu       | 5          | lulu       | 
      | 12         | alice      | 12         | alice      | 
      | 8          | lilei      | 8          | lilei      | 
      | 10         | lily       | 10         | lily       | 
      | 1          | kate       | 1          | kate       | 
      | 11         | lucy       | 11         | lucy       | 
      | 6          | mark       | 6          | mark       | 
      | 3          | bob        | 3          | bob        | 
      +------------+------------+------------+------------+

创建Hologres外部表(双签名模式)

双签名是MaxComputeHologres共同研发的认证及鉴权协议,在MaxCompute侧使用账号登录信息加签名后,把认证数据传递给Hologres侧,Hologres根据MaxCompute底层达成的协议,进行同名认证及鉴权。因此,只需在MaxComputeHologres中使用相同的账号,便可直接进行外部表访问,无需额外设置认证信息。

前置准备

  1. 安装并配置MaxCompute客户端

  2. 已准备好待创建Hologres外部表的目标MaxCompute项目。

    创建MaxCompute项目信息,请参见创建MaxCompute项目

  3. Hologres中存在跟MaxCompute相同名称的账号,并且该账号具有Hologres中对应表的读写权限

  4. Hologres V1.3及以上版本支持MaxCompute使用双签名模式创建Hologres外部表,目前双签名模式只支持从Hologres外部表中读取数据,不支持写入数据至Hologres外部表。

MaxCompute中创建外部表

  1. 登录MaxCompute客户端,进入目标MaxCompute项目。

  2. 执行如下命令创建Hologres外部表。

    按照准备数据步骤,准备好的Hologres实例信息如下:

    • Hologres数据库名称:holo_external_test

    • Hologres数据库的Schema:public

    • Hologres表名称:holo

    • Hologres数据库经典网络连接地址:hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80

    -- 创建外部表
    CREATE EXTERNAL TABLE IF NOT EXISTS holo_mc_external_dbl
    (
      id int,
      name string
    )
    STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler'
    location 'jdbc:postgresql://hgpostcn-cn-****-cn-hangzhou-internal.hologres.aliyuncs.com:80/<holo database name>?ApplicationName=MaxCompute&currentSchema=public&preferQueryMode=simple&useSSL=false&table=<table name>/'
    TBLPROPERTIES (
      'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver',
      'odps.federation.jdbc.target.db.type'='holo',
      'odps.federation.jdbc.colmapping'='id:id,name:name'
    );
  3. 查询外部表

    -- 查询外部表(必须与打开双签名开关命令一起执行)
    SET odps.sql.common.table.planner.ext.hive.bridge=true;
    SELECT * FROM holo_mc_external_dbl;
    
    -- 返回结果。
    +------------+------------+
    | id         | name       | 
    +------------+------------+
    | 9          | hanmeimei  | 
    | 4          | tom        | 
    | 7          | haward     | 
    | 2          | mary       | 
    | 5          | lulu       | 
    | 12         | alice      | 
    | 8          | lilei      | 
    | 10         | lily       | 
    | 1          | kate       | 
    | 11         | lucy       | 
    | 6          | mark       | 
    | 3          | bob        | 
    +------------+------------+

开启Hologres外部表存储直读功能

MaxComputeHologres外部表的读通过JDBC模式实现,目前版本支持MaxCompute直读Hologres存储层,能够带来以下优势:

  • 可以大幅降低读表的延迟,显著提高查询数据的速度。

  • 可以大幅度减少Hologres FE的连接数,大多数Query仅需要一个连接数。

使用限制

当开启Hologres直读模式时,使用限制如下,在条件不满足时会回退到JDBC模式。

  1. 版本要求

    Hologres实例版本必须为V1.3.34及以上。低于V1.3.34的版本不支持直读功能。

  2. 表类型限制

    • 不支持直读Hologres冷存表。

    • 不支持直读Hologres行存表。

  3. 数据类型映射限制

    MaxCompute直读模式使用Timestamp类型映射Hologres中的Timestamp With Time Zone类型会存在细微的时间误差,具体差异如下:

    • 时间值误差

      • HologresTimestamp With Time Zone类型列的时间在1900-12-31 15:54:15 之前,MaxCompute查询出来的时间会多544秒。

      • HologresTimestamp With Time Zone类型列的时间在1900-12-31 15:54:161969-12-31 23:59:58之间,MaxCompute查询出来的时间会多1秒。

      • HologresTimestamp With Time Zone类型列的时间在1969-12-31 23:59:59之后,MaxCompute查询出来的时间与Hologres中的无区别。

    • 时区偏移

      • MaxCompute的时区为东八区为例,HologresTimestamp With Time Zone类型列的时间为2000-01-01 00:00:00,MaxCompute查询出来的时间为2000-01-01 08:00:00

      • MaxCompute的时区为东八区为例,HologresTimestamp With Time Zone类型列的时间为1969-01-01 00:00:00,MaxCompute查询出来的时间为1969-01-01 08:00:01

  4. Region限制

    由于网络连通性限制,只支持同RegionMaxCompute访问Hologres实例。跨Region访问会报错:FAILED: ODPS-0010000:System internal error - fuxi job failed, caused by: Pangu request failed with error code 3

  5. Hologres配置为主从架构,仅支持配置连接URL为主实例,不支持配置为从实例。

  6. Foreign Server模式存在的额外限制:MaxCompute项目需要开启Schema级语法开关。

开启方式

MaxCompute中查询Hologres外部表时SQL前加上如下参数。

SET odps.table.api.enable.holo.table=true;

设置项目粒度直读开关。

-- 打开直读开关 和直读时关闭回退成jdbc 都可以设置为项目粒度。
-- 项目粒度打开直读开关: 
setproject odps.table.api.enable.holo.table=true; --true开启|false关闭

-- 关闭默认回退JDBC的开关: 
setproject odps.table.api.allow.fallback.jdbc=false; --true回退|false不回退

直读验证

可以在Logview里查看日志,判断查询是否走了直读模式,Logview使用详情请参见使用Logview 2.0查看作业运行信息

LogviewSummary页签下,查找external holo tables字段查看属性,属性格式如下:

<project_name>.<table_name>:<访问方式>[<(回退原因)>]

参数说明

参数

说明

project_name

项目名称。

table_name

表名称。

访问方式

外部表的访问方式,取值如下:

  • Optimized:代表走的是直读模式,Logview示例如下。直读模式

  • Fallback:代表回退到了JDBC模式,Logview示例如下。回退为JDBC模式

回退原因

如果访问方式Fallback,显示回退为JDBC模式的原因,取值及解决方案如下。

  • Column type map error Column name ${ColumnName}:MaxCompute表与Hologres表对应的列类型不匹配或者不兼容导致,需要参照数据类型映射更改外部表的数据类型后就可以走直读模式。

  • Holo connection error: Hologres实例连接异常,有可能是权限信息有误或者Hologres实例状态有误,请检查当前用户是否有权限访问对应的Hologres数据库或者查看Hologres实例目前是否处于可服务状态。

  • Odps table is partition table:MaxCompute创建的Hologres外部表为分区表导致,目前暂不支持。

  • Select hg_version errorHologres version check errorFetch hg_version data error:Hologres实例版本有误导致的,需要升级Hologres实例版本到V1.3.34或以上版本,升级实例版本详情请参见实例升级

开启了直读模式运行的任务,偶然触发直读限制场景,任务会回退成JDBC模式。如果直读时业务负载比较大,回退成JDCBC模式会占用大量的Hologres连接池资源,且JDBC方式数据传输效率远低于直读,占用资源释放也会比较慢。

需要关注直读回退成JDBC方式后,会对Hologres实例造成负载压力,极端情况下会因为大量回退的作业影响其他业务访问Hologres实例。为了预防这种情况,可以提前通过在直读任务中增加运行参数set odps.table.api.allow.fallback.jdbc=false;关闭自动回退,避免非预期影响。

Hologres数据导入导出

  • 如果需要将Hologres上的数据导入MaxCompute表或表的分区中,可以通过LOAD命令实现该操作。

  • 如果需要将MaxCompute项目中的数据导出至外部存储Hologres,以供其他计算引擎使用,可以通过UNLOAD命令实现该操作。

常见问题

通过MaxCompute直读Hologres数据时,报错ODPS-0130071,如何解决?

  • 问题现象

    直读Hologres数据时,报错ODPS-0130071 Failed to split to equal size...max count: 7777。例如:

    ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: storage/table/src/input_splits_builder.cpp(195): StorageException: Failed to split to equal size, total size: 2143570729934, min size: 268435456, max size: 272629760, max count: 7777, split size: 275629513, split count: 7777
  • 产生原因

    MaxCompute直读Hologres中的数据时,按照默认的拆分Mapper策略(输入数据量/split.size 256MB),导致任务产生的Mapper并发数超过了最大限制数7777。

    说明

    该限制是防止用户直接提交生成大量Mapper任务,从而对Hologres文件或网络连接的稳定性产生影响。

  • 解决措施

    您可以通过设置以下参数,解决报错问题。

    SET odps.external.holo.mapper.instances=10000; -- 提高并发上限,最高不超过10000。
    SET odps.sql.mapper.split.size=512; -- 调整任务并发数,最高不超过512M

基于Hologres外部表执行SQL作业时,运行慢,如何解决?

使用SDK搜索MaxCompute外部表数据速度慢。

  • 问题现象

    使用SDK搜索MaxCompute外部表数据速度慢。

  • 解决措施

    外部表仅支持全量搜索,所以较慢,建议您改用MaxCompute内部表。

Hologres侧使用关键字作为列名时报错,如何解决?

  • 问题现象

    Hologres侧使用关键字作为列名,如果不加特殊配置,会出现如下报错:

    ODPS-0123131:User defined function exception - SQLException in nextKeyValue

    Caused by: org.postgresql.util.PSQLException: ERROR: syntax error at or near ","

  • 解决措施

    添加参数映射Hologres源表和Hologres外部表字段关系:odps.federation.jdbc.colmapping

    例如:Hologres源表包含关键字字段"offset",则创建Hologres外部表时需要添加参数为'odps.federation.jdbc.colmapping'='offset:"offset"'

相关文档

Hologres外部表常见问题详情,请参见外部表常见问题