注意事项和限制 - Amazon Data Firehose

注意事项和限制

注意

除中国地区、AWS GovCloud (US) Regions 和亚太地区(马来西亚)外,Firehose 在所有 AWS 区域 都支持 Apache Iceberg 表作为目的地。

Firehose 对 Apache Iceberg 表的支持具有以下注意事项和限制。

  • 吞吐量:如果您使用 Direct PUT 作为源向 Apache Iceberg 表传输数据,则美国东部(弗吉尼亚州北部)、美国西部(俄勒冈州)和欧洲地区(爱尔兰)区域每个流的最大吞吐量为 5 MiB/秒,所有其他 AWS 区域 为 1 MiB/秒。如果您将数据插入到 Iceberg 表但不执行更新和删除,并且想要提高流的吞吐量,则可以使用 Firehose 限制表单请求提高吞吐量限制。

    如果您只想插入数据而不想执行更新和删除,也可以将 AppendOnly 标志设置为 True。将 AppendOnly 标志设置为 True,Firehose 会自动缩放以匹配您的吞吐量。目前,您只能通过 CreateDeliveryStream API 操作设置此标志。

    如果由于较高的数据摄取量超过 Firehose 流的吞吐能力而导致 Direct PUT 流受到节流,则 Firehose 会自动提高流的吞吐量限制,直到节流得到控制。根据吞吐量的增加和节流,Firehose 可能需要更长的时间才能将数据流的吞吐量提高到所需的水平。因此,请继续重试失败的数据摄取记录。如果您预计数据量会突然大幅增加,或者您的新数据流需要的吞吐量比默认吞吐量限制更高,则请求提高吞吐量限制。

  • 每秒 S3 事务数 (TPS) — 为了优化 S3 性能,如果您使用 Kinesis Data Streams 或 Amazon MSK 作为来源,我们建议您使用正确的分区键对源记录进行分区。这样,路由到同一 Iceberg 表的数据记录就会映射到一个或几个被称为分片的源分区。如果可能,将属于不同目标 Iceberg 表的数据记录分散到不同的分区/分片中,这样您就可以使用源主题/流的所有分区/分片中可用的所有聚合吞吐量。

  • :对于列名称和值,Firehose 仅采用多级嵌套 JSON 中的第一级节点。例如,Firehose 选择第一级中可用的节点,包括位置字段。源数据的列名和数据类型应与目标表的列名和数据类型完全匹配,Firehose 才能成功传输。在这种情况下,Firehose 希望您的 Iceberg 表中有结构或地图数据类型列来匹配位置字段。Firehose 支持 16 个级别的嵌套。以下是嵌套 JSON 的示例。

    { "version":"2016-04-01", "deviceId":"<solution_unique_device_id>", "sensorId":"<device_sensor_id>", "timestamp":"2024-01-11T20:42:45.000Z", "value":"<actual_value>", "position":{ "x":143.595901, "y":476.399628, "z":0.24234876 } }

    如果列名或数据类型不匹配,则 Firehose 会抛出错误并将数据传输到 S3 错误存储桶。如果 Apache Iceberg 表中的所有列名和数据类型都匹配,但源记录中存在其他字段,则 Firehose 会跳过新字段。

  • 每条记录一个 JSON 对象:您只能在一条 Firehose 记录中发送一个 JSON 对象。如果您在记录中聚合并发送多个 JSON 对象,则 Firehose 会抛出错误并将数据传输到 S3 错误存储桶。如果您使用 KPL 聚合记录,并将数据摄取到 Firehose 中,将 Amazon Kinesis Data Streams 作为源,则 Firehose 会自动解聚,并为每条记录使用一个 JSON 对象。

  • 压缩和存储优化:每次使用 Firehose 写入 Iceberg 表时,它都会提交和生成快照、数据文件和删除文件。拥有许多数据文件会增加元数据开销并影响读取性能。为了获得高效的查询性能,您可能需要考虑一种解决方案,即定期获取小的数据文件并重写为较少的较大数据文件。此过程称为压缩。AWS Glue Data Catalog 支持自动压缩 Apache Iceberg 表。有关更多信息,请参阅《AWS Glue 用户指南》中的 Compaction management。有关更多信息,请参阅 Automatic compaction of Apache Iceberg Tables。或者,您可以运行 Athena Optimize 命令来手动执行压缩。有关“优化”命令的更多信息,请参阅 Athena Optimize

    除了压缩数据文件外,您还可以使用对 Apache Iceberg 表执行表维护的 VACUUM 语句来减少存储消耗,例如快照过期和孤立文件移除。或者,您可以通过自动移除不再需要的数据文件、孤立文件和过期快照,以使用同样支持 Apache Iceberg 表的托管表优化的 AWS Glue Data Catalog。有关更多信息,请参阅这篇关于 Storage optimization of Apache Iceberg Tables 的博客文章。

  • 我们不支持 Apache Iceberg 表的 Amazon MSK 无服务器源作为目的地。

  • 对于更新操作,Firehose 会先放置一个删除文件,然后再执行插入操作。放置删除文件会产生 Amazon S3 放置费用。

  • Firehose 建议不使用多个 Firehose 流将数据写入同一 Apache Iceberg 表中。这是因为 Apache Iceberg 依赖于乐观并发控制 (OCC)。如果多个 Firehose 流尝试同时写入单个 Iceberg 表,则在给定时间只有一个流成功提交数据。其他无法提交回退的流,然后重试提交操作,直到配置的重试持续时间到期。重试持续时间用完后,数据和删除文件密钥(Amazon S3 路径)将发送到配置的 Amazon S3 错误前缀。

  • Firehose 支持的当前 Iceberg 库版本为 1.5.2 版。

  • 要将加密数据传输到 Amazon S3 表类数据存储服务,您应该在 Amazon S3 表类数据存储服务中配置 AWS Key Management Service 参数,而不是在 Firehose 配置中配置参数。如果您在 Firehose 中配置 AWS Key Management Service 参数以便将加密数据传输到 Amazon S3 表类数据存储服务,则 Firehose 无法使用这些参数进行加密。有关更多信息,请参阅借助 AWS KMS 密钥使用服务器端加密

  • Firehose 流仅支持传输到通过 Iceberg 的 GlueCatalog API 创建的数据库和表。不支持传输到通过 Glue SDK 创建的数据库和表。请注意,Iceberg 库中的数据库和表名不支持连字符 (-)。有关更多详细信息,请参阅 Iceberg 库支持的 Glue 数据库正则表达式Glue 表正则表达式

  • Firehose 写入的所有文件都是使用记录中存在的分区计算的。这也适用于删除的文件。不支持全局删除,例如为分区表写入未分区的删除文件。