Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

为 Amazon Redshift Spectrum 创建外部架构

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

注意

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

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

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

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

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

Copy
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 数据库目录所在的 AWS 区域。

以下示例使用 Athena 数据目录中的默认 sampledb 数据库创建外部架构。

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

注意

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

当使用 Athena 数据目录时,以下限制适用:

  • 每个账户最多 100 个数据库。

  • 每个数据库最多 100 个表。

  • 每个表最多 20000 个分区。

您可通过联系 AWS Support 来请求增加限制。

要规避限制,请使用 Hive 元存储而不是 Athena 数据目录。

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

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

Copy
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'

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

Copy
select * from svv_external_schemas

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

使用 Amazon Redshift Spectrum 外部目录

Amazon Redshift Spectrum 外部数据库和外部表的元数据存储在外部数据目录中。默认情况下,Redshift Spectrum 元数据存储在 Athena 数据目录中。您可在 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 数据目录中。您创建的由外部架构限定的外部表的元数据也存储在您的 Athena 数据目录中。

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

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

Copy
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 中创建的表。

Copy
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 元存储。

Copy
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 控制面板中,选择您的群集。在 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. 选择 Create

  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. 依次选择 ActionsNetworkingChange Security Groups

    8. 选择新的安全组。

    9. 选择 Assign Security Groups

本页内容: