串流摄取 - Amazon Redshift

串流摄取

串流摄取直接以低延迟、高速度的方式将流数据从 Amazon Kinesis Data StreamsAmazon Managed Streaming for Apache Kafka 摄取到 Amazon Redshift 预调配或 Amazon Redshift Serverless 实体化视图中。它减少了访问数据所需的时间并降低了存储成本。您可以为 Amazon Redshift 集群或 Amazon Redshift Serverless 配置串流摄取并使用 SQL 语句创建实体化视图,如在 Amazon Redshift 中创建实体化视图中所述。然后,借助实体化视图刷新,每秒可以摄取数百兆字节的数据。从而快速访问快速刷新的外部数据。

数据流

Amazon Redshift 预调配集群或 Amazon Redshift Serverless 工作组是串流使用者。实体化视图是从串流中读取的数据的着陆区,读取的数据将在到达时进行处理。例如,可以通过熟悉的 SQL 来使用 JSON 值并映射到实体化视图的数据列。在刷新实体化视图时,Redshift 会使用已分配 Kinesis 数据分片或 Kafka 分区中的数据,直到该视图与 Kinesis 流的 SEQUENCE_NUMBER 或 Kafka 主题的上一个 Offset 达到平衡。后续的实体化视图刷新会从上次刷新的最新 SEQUENCE_NUMBER 读取数据,直到与串流数据或主题数据相等为止。

串流摄取使用案例

Amazon Redshift 串流摄取的使用案例涉及处理会持续生成(串流)且必须在生成后的短时间内(低延迟)处理的数据。这称为近实时分析。数据源多种多样,包括 IoT 设备、系统遥测数据,或热点网站或应用程序的点击流数据。

串流摄取注意事项

以下是设置串流摄取环境时有关性能和计费的重要注意事项和最佳实践。

  • 自动刷新使用情况和激活 – 实体化视图的自动刷新查询被视为任何其他用户工作负载。自动刷新会在数据串流到达时从串流加载数据。

    对于为串流摄取而创建的实体化视图,可以显式开启自动刷新。为此,请在实体化视图定义中指定 AUTO REFRESH。手动刷新是默认设置。要为现有实体化视图指定自动刷新以进行串流摄取,可以运行 ALTER MATERIALIZED VIEW 以开启此功能。有关更多信息,请参阅 CREATE MATERIALIZED VIEWALTER MATERIALIZED VIEW

  • 串流摄取和 Amazon Redshift Serverless – 适用于预置集群上的 Amazon Redshift 串流摄取的相同设置和配置说明也适用于 Amazon Redshift Serverless 上的串流摄取。重要的是将 Amazon Redshift Serverless 配置为必要的 RPU 级别,以便支持具有自动刷新功能的串流摄取和其他工作负载。有关更多信息,请参阅 Amazon Redshift Serverless 的账单

  • 与 Amazon MSK 集群位于不同可用区的 Amazon Redshift 节点 – 当您配置串流摄取时,如果为 Amazon MSK 启用了机架感知功能,则 Amazon Redshift 会尝试连接到同一可用区中的 Amazon MSK 集群。如果您的所有节点都与 Amazon Redshift 集群位于不同的可用区,则会产生跨可用区的数据传输费用。为避免这种情况,请在与 Redshift 预置集群或工作组相同的可用区中至少保留一个 Amazon MSK 代理集群节点。

  • 刷新起始位置 – 创建实体化视图后,其初始刷新从 Kinesis 串流的 TRIM_HORIZON 或从 Amazon MSK 主题的偏移 0 开始。

  • 数据格式 – 支持的数据格式仅限于可以从 VARBYTE 转换的那些格式。有关更多信息,请参阅 VARBYTE 类型VARBYTE 运算符

  • 流式传输到多个实体化视图 – 在 Amazon Redshift 中,我们建议在大多数情况下将每个串流的数据放置在单个实体化视图中。但也可以摄取串流并将数据放入多个实体化视图中。例如,在一个使用案例中,您摄取了一个包含运动数据的串流,但您将每项运动的数据整理到一个单独的实体化视图中。

    请注意,当您将数据摄入并刷新多个实体化视图时,可能会产生更高的传出成本,特别是从串流提供程序读取数据时。此外,读取多个实体化视图使用的资源更多,从而会影响其他工作负载。另请注意串流提供程序的带宽、吞吐量和性能限制。有关数据流定价的更多信息,请参阅 Kinesis Data Streams 定价Amazon Managed Streaming for Apache Kafka 定价

  • 将记录附加到表 - 您可以运行 ALTER TABLE APPEND,以从现有源实体化视图中将行附加到目标表。仅当将实体化视图配置为串流摄取时,此操作才会起作用。有关更多信息,请参阅 ALTER TABLE APPEND

  • 运行 TRUNCATE 或 DELETE - 您可以使用以下几种方法,从用于串流摄取的实体化视图中删除记录:

    • TRUNCATE – 此命令从配置为串流摄取的实体化视图中删除所有行。它不执行表扫描。有关更多信息,请参阅 TRUNCATE

    • DELETE – 此命令从配置为串流摄取的实体化视图中删除所有行。有关更多信息,请参阅 DELETE

使用串流摄取与在 Amazon S3 中暂存数据进行比较

有多种选项可以将数据流式传输到 Amazon Redshift 或 Amazon Redshift Serverless。两个众所周知的选项是串流摄取(如本主题所述),或者使用 Firehose 设置到 Amazon S3 的传输流。以下列表描述了每种方法:

  1. 从 Kinesis Data Streams 或 Amazon Managed Streaming for Apache Kafka 到 Amazon Redshift 或 Amazon Redshift Serverless 的串流摄取涉及配置实体化视图来接收数据。

  2. 使用 Kinesis Data Streams 将数据传输到 Amazon Redshift 并通过 Firehose 进行流式传输的过程涉及将源流连接到 Amazon Data Firehose,然后等待 Firehose 在 Amazon S3 中暂存数据。此过程使用不同大小的批次,缓冲间隔长度各不相同。在流式传输到 Amazon S3 后,Firehose 会启动一个 COPY 命令来加载数据。

通过串流摄取,您可以绕过第二个过程所需的几个步骤:

  • 您不必将数据发送到 Amazon Data Firehose 传输流,因为通过串流摄取,数据可以直接从 Kinesis Data Streams 发送到 Redshift 数据库中的实体化视图。

  • 您不必将流式传输的数据存入 Amazon S3,因为串流摄取数据会直接传送到 Redshift 实体化视图。

  • 您不必编写和运行 COPY 命令,因为实体化视图中的数据是直接从流中刷新的。将数据从 Amazon S3 加载到 Redshift 并不是该过程的一部分。

请注意,串流摄取仅限于来自 Amazon Kinesis Data Streams 的流和来自 Amazon MSK 的主题。要从 Kinesis Data Streams 流式传输到 Amazon Redshift 以外的目标,可能需要一个 Firehose 传输流。有关更多信息,请参阅 Sending Data to an Amazon Data Firehose Delivery Stream

限制

特征或操作 描述
Kafka 主题长度限制

不能使用名称超过 128 个字符(不包括引号)的 Kafka 主题。有关更多信息,请参阅名称和标识符

实体化视图的增量刷新和联接

实体化视图必须以递增方式维护。Kinesis 或 Amazon MSK 无法完全重新计算,因为在默认情况下,它们不会保留过去 24 小时或 7 天的串流或主题历史记录。您可以在 Kinesis 或 Amazon MSK 中设置更长的数据留存期。但是,这会导致需要更多的维护和成本。此外,在 Kinesis 流或 Amazon MSK 主题上创建的实体化视图目前不支持联接。创建串流或主题的实体化视图后,您可以创建另一个实体化视图,以用于将串流实体化视图联接到其他实体化视图、表或视图。

有关更多信息,请参阅 REFRESH MATERIALIZED VIEW

记录解析

Amazon Redshift 串流摄取不支持解析 Kinesis Producer Library 聚合的记录(KPL 关键概念 - 聚合)。聚合的记录摄取后将存储为二进制协议缓冲区数据。(有关更多信息,请参阅协议缓冲。) 根据向 Kinesis 推送数据的方式不同,您可能需要关闭此功能。

解压缩

VARBYTE 目前不支持任何解压缩方法。因此,无法在 Redshift 中查询包含压缩数据的记录。在将数据推送到 Kinesis 流或 Amazon MSK 主题之前解压缩。

最大记录大小

Amazon Redshift 可以从 Kinesis 或 Amazon MSK 摄取的任何记录字段的最大大小略小于 1MB。以下几点详细说明了该行为:

  • 最大 VARBYTE 长度VARBYTE 类型支持最大长度为 1,024,000 字节的数据。由于 Kinesis 将有效负载限制在 1MB 以内,因此在经过 Base64 编码后,Amazon Redshift 可以摄取所有 Kinesis 数据。

  • 消息限制 – 默认 Amazon MSK 配置将消息限制在 1MB 以内。此外,如果消息包括标头,则数据量限制为 1,048,470 字节。使用默认设置,摄取没有问题。但是,您可以将 Kafka 的最大消息大小更改为更大的值,从而更改 Amazon MSK 的最大消息大小。在这种情况下,Kafka 记录的键/值字段或标头可能会超过大小限制。这些记录会引起错误,并且不会摄取。

错误记录

在每种情况下,如果由于数据的大小超过最大大小而无法将记录摄取到 Redshift,则会跳过该记录。在这种情况下,实体化视图刷新仍然会成功,并且每条错误记录的一段会写入到 SYS_STREAM_SCAN_ERRORS 系统表中。系统不会跳过由业务逻辑导致的错误,例如计算错误或类型转换产生的错误。在向实体化视图定义添加逻辑之前,请仔细测试逻辑,以避免出现这些错误。