为 Amazon Redshift Spectrum 创建外部 schema - Amazon Redshift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

为 Amazon Redshift Spectrum 创建外部 schema

所有外部表都必须在您使用 CREATE EXTERNAL SCHEMA 语句创建的外部 schema 中创建。

注意

某些应用程序将术语数据库 schema 互换使用。在 Amazon Redshift 中,我们使用术语 schema

Amazon Redshift 外部 schema 引用了外部数据目录中的外部数据库。您可在 Amazon Redshift、Amazon AthenaAmazon Glue Data Catalog 或在 Apache Hive 元存储(如 Amazon EMR)中创建外部数据库。如果您在 Amazon Redshift 中创建了外部数据库,该数据库将驻留在 Athena Data Catalog 中。要在 Hive 元存储中创建数据库,您需要在您的 Hive 应用程序中创建数据库。

Amazon Redshift 需要授权才能代表您访问 Athena 中的 Data Catalog 和 Amazon S3 中的数据文件。要提供授权,您首先应创建 Amazon Identity and Access Management (IAM) 角色。然后,您应将该角色附加到您的集群并在 Amazon Redshift CREATE EXTERNAL SCHEMA 语句中为该角色提供 Amazon Resource Name (ARN)。有关 授权的更多信息,请参阅适用于 Amazon Redshift Spectrum 的 IAM 策略

注意

如果您当前在 Athena Data Catalog 中有 Redshift Spectrum 外部表,则可以将您的 Athena Data Catalog 迁移到 Amazon Glue Data Catalog。要将 Amazon Glue 数据目录用于 Redshift Spectrum,您可能需要更改您的 IAM 策略。有关更多信息,请参阅 Amazon Athena 用户指南中的升级到 Amazon Glue Data Catalog

要在创建外部 schema 的同时创建外部数据库,请指定 FROM DATA CATALOG 并在您的 CREATE EXTERNAL DATABASE 语句中包含 CREATE EXTERNAL SCHEMA 子句。

以下示例使用外部数据库 spectrum_schema 创建名为 spectrum_db 的外部 schema。

create external schema spectrum_schema from data catalog database 'spectrum_db' iam_role 'arn:aws:iam::123456789012:role/MySpectrumRole' create external database if not exists;

如果您使用 Athena 管理您的数据目录,请指定 Athena 数据库名称和 Athena Data Catalog 所在的 Amazon 区域。

以下示例使用 Athena Data Catalog 中的默认 sampledb 数据库创建外部 schema。

create external schema athena_schema from data catalog database 'sampledb' iam_role 'arn:aws:iam::123456789012:role/MySpectrumRole' region 'us-east-2';
注意

region 参数将引用 Athena Data Catalog 所在的 Amazon 区域而不是数据文件在 Amazon S3 中的位置。

如果使用 Hive 元存储(例如 Amazon EMR)来管理数据目录,则必须将安全组配置为允许集群之间的流量。

在 CREATE EXTERNAL SCHEMA 语句中,指定 FROM HIVE METASTORE 并包含元存储的 URI 和端口号。以下示例创建一个使用名为 hive_db 的 Hive 元存储数据库的外部 schema。

create external schema hive_schema from hive metastore database 'hive_db' uri '172.10.10.10' port 99 iam_role 'arn:aws:iam::123456789012:role/MySpectrumRole'

要查看集群的外部 schema,请查询 PG_EXTERNAL_SCHEMA 目录表或 SVV_EXTERNAL_SCHEMAS 视图。下面的示例查询联接 PG_EXTERNAL_SCHEMA 和 PG_NAMESPACE 的 SVV_EXTERNAL_SCHEMAS。

select * from svv_external_schemas

有关完整的命令语法和示例,请参阅 CREATE EXTERNAL SCHEMA

在 Amazon Redshift Spectrum 中使用外部目录

Amazon Redshift Spectrum 外部数据库和外部表的元数据存储在外部数据目录中。预设情况下,Redshift Spectrum 元数据存储在 Athena Data Catalog 中。您可在 Athena 控制台中查看和管理 Redshift Spectrum 数据库和表。

您还可使用 Hive 数据定义语言 (DDL) 通过 Athena 或 Hive 元存储(如 Amazon EMR)创建和管理外部数据库和外部表。

注意

我们建议使用 Amazon Redshift 在 Redshift Spectrum 中创建和管理外部数据库和外部表。

在 Athena 中查看 Redshift Spectrum 数据库

您可以通过将 CREATE EXTERNAL DATABASE IF NOT EXISTS 子句作为 CREATE EXTERNAL SCHEMA 语句的一部分来创建外部数据库。在此情况下,外部数据库元数据将存储在您的 Athena 数据目录中。您创建的由外部 schema 限定的外部表的元数据也存储在您的 Athena Data Catalog 中。

Athena 将为每个受支持的 Amazon 区域保留一个数据目录。要查看表元数据,请登录 Athena 控制台并选择 Catalog Manager(目录管理器)。以下示例显示美国西部(俄勒冈)区域的 Athena Catalog Manager。

如果您使用 Athena 创建和管理您的外部表,请使用 CREATE EXTERNAL SCHEMA 注册数据库。例如,以下命令将注册名为 sampledb 的 Athena 数据库。

create external schema athena_sample from data catalog database 'sampledb' iam_role 'arn:aws:iam::123456789012:role/mySpectrumRole' region 'us-east-1';

当您查询 SVV_EXTERNAL_TABLES 系统视图时,您将看到 Athena sampledb 数据库中的表以及您在 Amazon Redshift 中创建的表。

select * from svv_external_tables;
schemaname    | tablename        | location                                               
--------------+------------------+--------------------------------------------------------
athena_sample | elb_logs         | s3://athena-examples/elb/plaintext           
athena_sample | lineitem_1t_csv  | s3://myspectrum/tpch/1000/lineitem_csv                
athena_sample | lineitem_1t_part | s3://myspectrum/tpch/1000/lineitem_partition          
spectrum      | sales            | s3://awssampledbuswest2/tickit/spectrum/sales          
spectrum      | sales_part       | s3://awssampledbuswest2/tickit/spectrum/sales_part

注册 Apache Hive 元存储数据库

如果您在 Apache Hive 元存储中创建外部表,则可使用 CREATE EXTERNAL SCHEMA 在 Redshift Spectrum 中注册这些表。

在 CREATE EXTERNAL SCHEMA 语句中,指定 FROM HIVE METASTORE 子句并提供 Hive 元存储 URI 和端口号。IAM 角色必须包含对 Amazon S3 的访问权限,但无需任何 Athena 权限。以下示例注册 Hive 元存储。

create external schema if not exists hive_schema from hive metastore database 'hive_database' uri 'ip-10-0-111-111.us-west-2.compute.internal' port 9083 iam_role 'arn:aws:iam::123456789012:role/mySpectrumRole';

使您的 Amazon Redshift 集群能够访问您的 Amazon EMR 集群

如果 Hive 元存储位于 Amazon EMR 中,则您必须为您的 Amazon Redshift 集群授予访问 Amazon EMR 集群的权限。为此,请创建一个 Amazon EC2 安全组。之后,应允许从您的 Amazon Redshift 集群的安全组和您的 Amazon EMR 集群的安全组到 EC2 安全组的所有入站流量。然后,您应将 EC2 安全组添加到您的 Amazon Redshift 集群和您的 Amazon EMR 集群。

要使您的 Amazon Redshift 集群能够访问您的 Amazon EMR 集群

  1. 在 Amazon Redshift 中,记下您的集群的安全组名称。

    注意

    Amazon Redshift 有新的控制台可用。根据您使用的控制台,选择新控制台原始控制台说明。默认情况下会打开新控制台说明。

    新控制台

    要显示安全组,请执行以下操作:

    1. 登录到 Amazon Web Services Management Console并打开 Amazon Redshift 控制台,网址:https://console.aws.amazon.com/redshift/

    2. 在导航菜单上,选择 CLUSTERS (集群),然后从列表中选择该集群以打开其详细信息。选择 Properties (属性) 并查看 Network and security (网络和安全性) 部分。

    3. VPC security group (VPC 安全组) 中找到您的安全组。

    原始控制台

    在 Amazon Redshift 控制台中,选择您的集群。在 Cluster Properties 组中查找您的集群安全组。

  2. 在 Amazon EMR 中,记下 EMR 主节点安全组名称。

  3. 创建或修改 Amazon EC2 安全组,以允许 Amazon Redshift 和 Amazon EMR 之间的连接。

    1. 在 Amazon EC2 控制面板中,选择 Security Groups(安全组)。

    2. 选择 Create Security Group

    3. 如果使用的是 VPC,选择 Amazon Redshift 和 Amazon EMR 集群所在的 VPC。

    4. 添加一条入站规则。

    5. 对于 Type,选择 TCP

    6. 对于 Source,选择 Custom

    7. 输入您的 Amazon Redshift 安全组的名称。

    8. 再添加一条入站规则。

    9. 对于 Type,选择 TCP

    10. 对于 Port Range (端口范围),输入 9083

      注意

      EMR HMS 的默认端口是 9083。如果 HMS 使用了其他的端口,请在入站规则和外部模式定义中指定该端口。

    11. 对于 Source,选择 Custom

    12. 输入您的 Amazon EMR 安全组的名称。

    13. 选择创建

  4. 将您在上一步中创建的 Amazon EC2 安全组添加到您的 Amazon Redshift 集群和您的 Amazon EMR 集群:

    1. 在 Amazon Redshift 中,选择您的集群。

    2. 选择 ClusterModify

    3. VPC Security Groups 中,通过按 Ctrl 键并选择新的安全组名称来添加新的安全组。

    4. 在 Amazon EMR 中,选择您的集群。

    5. Hardware 下,选择主节点的链接。

    6. 选择 EC2 Instance ID 列中的链接。

    7. 对于 Actions (操作),依次选择 Networking (联网)Change Security Groups (更改安全组)

    8. 选择新的安全组。

    9. 选择 Assign Security Groups