Amazon Redshift Spectrum 中的外部架构
本主题介绍如何使用 Redshift Spectrum 创建和使用外部架构。外部架构是表的集合,这些表包含有关 Amazon S3 中由 Redshift Spectrum 读取的文件的元数据。
所有外部表都必须在您使用 CREATE EXTERNAL SCHEMA 语句创建的外部 schema 中创建。
注意
某些应用程序将术语数据库 和 schema 互换使用。在 Amazon Redshift 中,我们使用术语 schema。
Amazon Redshift 外部 schema 引用了外部数据目录中的外部数据库。您可在 Amazon Redshift、Amazon Athena、AWS Glue Data Catalog 或在 Apache Hive 元存储(如 Amazon EMR)中创建外部数据库。如果您在 Amazon Redshift 中创建了外部数据库,该数据库将驻留在 Athena Data Catalog 中。要在 Hive 元存储中创建数据库,您需要在您的 Hive 应用程序中创建数据库。
Amazon Redshift 需要授权才能代表您访问 Athena 中的 Data Catalog 和 Amazon S3 中的数据文件。要提供授权,您首先应创建 AWS Identity and Access Management (IAM) 角色。然后,您应将该角色附加到您的集群并在 Amazon Redshift CREATE EXTERNAL SCHEMA
语句中为该角色提供 Amazon 资源名称 (ARN)。有关 授权的更多信息,请参阅适用于 Amazon Redshift Spectrum 的 IAM 策略。
注意
如果您当前在 Athena Data Catalog 中有 Redshift Spectrum 外部表,则可以将您的 Athena Data Catalog 迁移到 AWS Glue Data Catalog。要将 AWS Glue 数据目录用于 Redshift Spectrum,您可能需要更改您的 IAM 策略。有关更多信息,请参阅《Amazon Athena 用户指南》中的升级到 AWS 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 所在的 AWS 区域。
以下示例使用 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 所在的 AWS 区域而不是数据文件在 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 和 AWS Glue 中查看 Redshift Spectrum 数据库
您可以通过将 CREATE EXTERNAL DATABASE IF NOT EXISTS 子句作为 CREATE EXTERNAL SCHEMA 语句的一部分来创建外部数据库。在此情况下,外部数据库元数据将存储在您的数据目录中。您创建的由外部 schema 限定的外部表的元数据也存储在您的 Data Catalog 中。
Athena 和 AWS Glue 将为每个受支持的 AWS 区域保留一个数据目录。要查看表元数据,请登录 Athena 或 AWS Glue 控制台。在 Athena 中,依次选择数据来源和您的 AWS Glue,然后查看数据库的详细信息。在 AWS 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 集群的安全组名称
要显示安全组,请执行以下操作:
-
登录 AWS Management Console,然后通过以下网址打开 Amazon Redshift 控制台:https://console.aws.amazon.com/redshiftv2/
。 -
在导航菜单上,选择集群,然后从列表中选择该集群以打开其详细信息。
-
选择属性并查看网络和安全设置部分。
-
在 VPC 安全组中找到您的安全组并记下它。
查看 Amazon EMR 主节点安全组名称
打开您的 Amazon EMR 集群。有关更多信息,请参阅《Amazon EMR 管理指南》中的使用安全配置设置集群安全性。
在安全与访问下,记下 Amazon EMR 主节点安全组名称。
创建或修改 Amazon EC2 安全组以允许 Amazon Redshift 和 Amazon EMR 之间的连接:
在 Amazon EC2 控制面板中,选择安全组。有关更多信息,请参阅《Amazon EC2 用户指南》中的安全组规则。
选择创建安全组。
如果使用的是 VPC,选择 Amazon Redshift 和 Amazon EMR 集群所在的 VPC。
添加一条入站规则。
对于类型,选择自定义 TCP。
对于 Source,选择 Custom。
输入您的 Amazon Redshift 安全组的名称。
再添加一条入站规则。
对于 Type,选择 TCP。
对于端口范围,输入 9083。
注意
EMR HMS 的默认端口是 9083。如果 HMS 使用了其他的端口,请在入站规则和外部模式定义中指定该端口。
对于 Source,选择 Custom。
输入安全组名称和描述。
选择创建安全组。
将您在上一步中创建的 Amazon EC2 安全组添加到您的 Amazon Redshift 集群:
在 Amazon Redshift 中,选择您的集群。
选择属性。
查看网络和安全设置,然后选择编辑。
在 VPC 安全组中,选择新的安全组名称。
选择保存更改。
将 Amazon EC2 安全组添加到您的 Amazon EMR 集群:
在 Amazon EMR 中,选择您的集群。有关更多信息,请参阅《Amazon EMR 管理指南》中的使用安全配置设置集群安全性。
在 Hardware 下,选择主节点的链接。
选择 EC2 实例 ID列中的链接。
依次选择操作、安全和更改安全组。
在关联的安全组中,选择新安全组,然后选择添加安全组。
选择保存。