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

为 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 资源名称 (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 和 Amazon Glue 中查看 Redshift Spectrum 数据库

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

Athena 和 Amazon Glue 将为每个受支持的 Amazon Web Services 区域保留一个数据目录。要查看表元数据,请登录 Athena 或 Amazon Glue 控制台。在 Athena 中,依次选择数据源和您的 Amazon Glue,然后查看数据库的详细信息。在 Amazon Glue 中,依次选择数据库和您的外部数据库,然后查看数据库的详细信息。

如果您使用 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://redshift-downloads/tickit/spectrum/sales          
spectrum      | sales_part       | s3://redshift-downloads/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 集群的安全组名称

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

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

  2. 在导航菜单上,选择集群,然后从列表中选择该集群以打开其详细信息。

  3. 选择属性并查看网络和安全设置部分。

  4. VPC 安全组中找到您的安全组并记下它。

查看 Amazon EMR 主节点安全组名称
  1. 打开您的 Amazon EMR 集群。有关更多信息,请参阅《Amazon EMR 管理指南》中的使用安全配置设置集群安全性

  2. 安全与访问下,记下 Amazon EMR 主节点安全组名称。

    在 Amazon EMR 控制台中突出显示 Amazon EMR 主节点安全组名称的屏幕截图。
创建或修改 Amazon EC2 安全组以允许 Amazon Redshift 和 Amazon EMR 之间的连接:
  1. 在 Amazon EC2 控制面板中,选择安全组。有关更多信息,请参阅适用于《Linux 实例的 Amazon EC2 用户指南》中的安全组规则

  2. 选择创建安全组

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

  4. 添加一条入站规则。

    1. 对于类型,选择自定义 TCP

    2. 对于 Source,选择 Custom

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

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

    1. 对于 Type,选择 TCP

    2. 对于端口范围,输入 9083

      注意

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

    3. 对于 Source,选择 Custom

  6. 输入安全组名称和描述。

  7. 选择创建安全组

将您在上一步中创建的 Amazon EC2 安全组添加到您的 Amazon Redshift 集群:
  1. 在 Amazon Redshift 中,选择您的集群。

  2. 选择属性

  3. 查看网络和安全设置,然后选择编辑

  4. VPC 安全组中,选择新的安全组名称。

  5. 选择保存更改

将 Amazon EC2 安全组添加到您的 Amazon EMR 集群:
  1. 在 Amazon EMR 中,选择您的集群。有关更多信息,请参阅《Amazon EMR 管理指南》中的使用安全配置设置集群安全性

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

  3. 选择 EC2 实例 ID列中的链接。

    
                        在 Amazon EMR 控制台中突出显示 Amazon EC2 实例 ID 值的屏幕截图。
  4. 依次选择操作安全更改安全组

  5. 关联的安全组中,选择新安全组,然后选择添加安全组

  6. 选择 Save(保存)。