串流摄取(预览版)
| 以下是 Amazon Redshift 串流摄取公开预览版的文档,这种数据摄取方式使用来自 Kinesis Data Streams 的数据。预览版功能是在 Redshift 中构建和测试的,但测试可能并未涵盖所有使用案例。在正式发布功能以全面开放之前,本文档和功能可能随时更改。我们建议您仅在测试集群中使用此功能,而不要在生产中使用。有关预览条款和条件,请参阅 Amazon 服务条款 |
以前,将数据从 Amazon Kinesis Streams 等串流服务加载到 Amazon Redshift 涉及多个步骤。这包括将流连接到 Amazon Kinesis Data Firehose,以及等待 Kinesis Data Firehose 在 Amazon S3 中存储数据,以不同长度的缓冲区间隔使用各种大小的批处理。然后 Kinesis Data Firehose 会触发 COPY 命令,以将数据从 Amazon S3 加载到 Redshift 中的表中。
串流摄取不再包含在 Amazon S3 中初步暂存数据的步骤,而是直接以低延迟、高速度的方式将流数据从 Kinesis Data Streams
数据流
Amazon Redshift 是流的使用者。Amazon Redshift 具体化视图是从流中读取的数据的着陆区,读取的数据将在到达时进行处理。例如,可以通过熟悉的 SQL 来使用 JSON 值并映射到 Redshift 数据列。刷新具体化视图时,Redshift 计算节点会将每个数据分片分配给一个计算切片。每个切片都会使用所分配分片中的数据,直到视图与流相等为止。以同样的方式,后续的具体化视图会上次刷新的最后 SEQUENCE_NUMBER 刷新读取数据,直到与流数据相等为止。
串流摄取使用案例
Amazon Redshift 串流摄取的使用案例主要是处理会持续生成(流式传输)且需要在生成后的短时间内(低延迟)处理的数据。这被称为近实时分析。数据源可能多种多样,例如物联网 (IoT) 设备、系统遥测或热点网站的点击流数据。
串流摄取入门
Amazon Redshift 串流摄取的设置涉及创建映射到流数据源的外部 Schema 以及创建引用外部 Schema 的具体化视图。Amazon Redshift 串流摄取支持将 Kinesis Data Streams 作为源。因此,在配置串流摄取之前,您需要有 Kinesis Data Streams 源可用。如果还没有源,请按照 Kinesis 文档 Amazon Kinesis Data Streams 入门中的说明执行操作,或者按照通过 Amazon 管理控制台创建流中的说明在控制台上创建一个。
Amazon Redshift 串流摄取使用具体化视图,该视图将在 REFRESH 运行时直接从流中更新。具体化视图映射到流数据源。在具体化视图定义中,您可以对流数据执行筛选和聚合。串流摄取具体化视图(基本具体化视图)只能引用一个流,但是您可以创建额外的具体化视图,以与基本具体化视图和其他具体化视图或表连接使用。
假设您有 Kinesis Data Streams 流可用,第一步是使用 CREATE EXTERNAL SCHEMA 在 Amazon Redshift 中定义一个 Schema,并引用某个 Kinesis Data Streams 资源。之后,要访问流中的数据,请在具体化视图中定义 STREAM。您可以用半结构化的 SUPER 格式存储流记录,或者定义一个会将数据转换为 Redshift 数据类型的 Schema。当您查询具体化视图时,返回的记录是流的时间点视图。
使用允许 Amazon Redshift 集群代入该角色的信任策略创建 IAM 角色。有关如何为 IAM 角色配置信任策略的信息,请参阅授权 Amazon Redshift 代表您访问其他 Amazon 服务。创建后的角色应具有以下 IAM policy,提供与 Amazon Kinesis 数据流进行通信的权限。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "ReadStream", "Effect": "Allow", "Action": [ "kinesis:DescribeStreamSummary", "kinesis:GetShardIterator", "kinesis:GetRecords", "kinesis:DescribeStream" ], "Resource": "arn:aws:kinesis:*:0123456789:stream/*" }, { "Sid": "ListStream", "Effect": "Allow", "Action": [ "kinesis:ListStreams", "kinesis:ListShards" ], "Resource": "*" } ] }在 Amazon Redshift 中,创建一个外部 Schema。
CREATE EXTERNAL SCHEMA schema_one FROM KINESIS IAM_ROLE { default | 'iam-role-arn' };创建一个具体化视图以使用流数据。以下示例定义了一个包含 JSON 源数据的具体化视图。请注意,以下视图会验证数据是否是有效的 JSON 源和 utf8。Kinesis 流名称区分大小写,可以包含大写字母和小写字母。要使用区分大小写的标识符,请在会话或集群级别将
enable_case_sensitive_identifier设置为true。有关更多信息,请参阅名称和标识符和 enable_case_sensitive_identifier。CREATE MATERIALIZED VIEW my_view AS SELECT ApproximateArrivalTimestamp, JSON_PARSE(from_varbyte(Data, 'utf-8')) as Data FROM schema_one.my_stream_name WHERE is_utf8(Data) AND is_valid_json(from_varbyte(Data, 'utf-8'));刷新视图,这会触发 Amazon Redshift 从流中读取数据并将数据加载到具体化视图中。
REFRESH MATERIALIZED VIEW my_view;在具体化视图中查询数据。
select * from my_view;
限制
目前刷新是手动的,但可以使用查询计划程序实现自动化刷新。参阅在 Amazon Redshift 控制台上计划查询。
在流上创建的具体化视图目前不支持 JOIN。创建串流具体化视图后,您可以创建另一个具体化视图,以用于将串流具体化视图连接到其他具体化视图、表或视图。
具体化视图刷新必须在一小时内完成流中数据的使用。如果刷新超过一个小时,将因凭证过期导致刷新失败。
Redshift 串流摄取不支持解析 Kinesis 创建者库聚合的记录(KPL 关键概念 - 聚合)。聚合的记录摄取后将存储为二进制协议缓冲区数据。(有关更多信息,请参阅协议缓冲
。) 根据向 Kinesis 推送数据的方式不同,您可能需要禁用此功能。例如,假设您使用的是 Kinesis Data Analytics,则可以通过在创建 Kinesis sink 表时添加 'sink.producer.aggregation-enabled' = 'false'将其禁用。有关更多信息,请参阅 Amazon Kinesis Data Streams SQL 连接器。 创建具体化视图后的初始刷新将从流的
TRIM_HORIZON开始。具体化视图必须以递增方式维护。完全重新计算是不可能的,因为在默认情况下,Kinesis 不会保留超过 24 小时的流历史记录。您可以在 Kinesis 中设置更长的数据保留期,但这可能会导致更多的技术维护和成本。有关更多信息,请参阅 REFRESH MATERIALIZED VIEW。
集群暂停时,具体化视图上的刷新在集群恢复之前不可用。暂停期间过期的流中记录也不可用。
支持的数据格式仅限于可以从
VARBYTE转换的格式。有关更多信息,请参阅VARBYTE 类型。VARBYTE目前不支持任何解压缩方法,因此无法在 Amazon Redshift 内查询包含压缩数据的 Kinesis 记录。相反,您应在将数据推送到流之前进行解压。