注意事项和限制
注意
除中国地区、Amazon GovCloud (US) Regions 和亚太地区(马来西亚)外,Firehose 在所有 Amazon Web Services 区域 都支持 Apache Iceberg 表作为目的地。
Firehose 对 Apache Iceberg 表的支持具有以下注意事项和限制。
-
吞吐量:如果您使用 Direct PUT 作为源向 Apache Iceberg 表传输数据,则美国东部(弗吉尼亚州北部)、美国西部(俄勒冈州)和欧洲地区(爱尔兰)区域每个流的最大吞吐量为 5 MiB/秒,所有其他 Amazon Web Services 区域 为 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 表时,它都会提交和生成快照、数据文件和删除文件。拥有许多数据文件会增加元数据开销并影响读取性能。为了获得高效的查询性能,您可能需要考虑一种解决方案,即定期获取小的数据文件并重写为较少的较大数据文件。此过程称为压缩。Amazon Glue Data Catalog 支持自动压缩 Apache Iceberg 表。有关更多信息,请参阅《Amazon Glue 用户指南》中的 Compaction management。有关更多信息,请参阅 Automatic compaction of Apache Iceberg Tables
。或者,您可以运行 Athena Optimize 命令来手动执行压缩。有关“优化”命令的更多信息,请参阅 Athena Optimize。 除了压缩数据文件外,您还可以使用对 Apache Iceberg 表执行表维护的 VACUUM 语句来减少存储消耗,例如快照过期和孤立文件移除。或者,您可以通过自动移除不再需要的数据文件、孤立文件和过期快照,以使用同样支持 Apache Iceberg 表的托管表优化的 Amazon 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 表类数据存储服务中配置 Amazon Key Management Service 参数,而不是在 Firehose 配置中配置参数。如果您在 Firehose 中配置 Amazon Key Management Service 参数以便将加密数据传输到 Amazon S3 表类数据存储服务,则 Firehose 无法使用这些参数进行加密。有关更多信息,请参阅借助 Amazon KMS 密钥使用服务器端加密。
-
Firehose 流仅支持传输到通过 Iceberg 的 GlueCatalog API 创建的数据库和表。不支持传输到通过 Glue SDK 创建的数据库和表。请注意,Iceberg 库中的数据库和表名不支持连字符 (
-)。有关更多详细信息,请参阅 Iceberg 库支持的 Glue 数据库正则表达式和 Glue 表正则表达式 。 -
Firehose 写入的所有文件都是使用记录中存在的分区计算的。这也适用于删除的文件。不支持全局删除,例如为分区表写入未分区的删除文件。