

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 注意事项和限制
<a name="apache-iceberg-considerations"></a>

**注意**  
除[Amazon Web Services 区域](https://docs.amazonaws.cn/glossary/latest/reference/glos-chap.html?icmpid=docs_homepage_addtlrcs#region)中国地区、亚太地区（台北）、亚太地区（马来西亚）、亚太地区（新西兰）和墨西哥（中部）外 Amazon GovCloud (US) Regions，Firehose 支持将 Apache Iceberg Tables 作为目的地。

Firehose 对 Apache Iceberg 表的支持具有以下注意事项和限制。
+ **吞吐量** — 如果您使用 **Dire** ct PUT 作为数据源向 Apache Iceberg 表传送数据，则在美国东部（弗吉尼亚北部）、美国西部（俄勒冈）和欧洲（爱尔兰）区域，每个数据流的最大吞吐量为 5 MiB/second ，其他所有区域的最大吞吐量为 1 MiB/second 。 Amazon Web Services 区域如果您将数据插入到 Iceberg 表但不执行更新和删除，并且想要提高流的吞吐量，则可以使用 [Firehose 限制表单](https://support.console.aws.amazon.com/support/home#/case/create%3FissueType=service-limit-increase%26limitType=kinesis-firehose-limits)请求提高吞吐量限制。

  如果您只想插入数据而不想执行更新和删除，也可以将 `AppendOnly` 标志设置为 `True`。将 `AppendOnly` 标志设置为 `True`，Firehose 会自动缩放以匹配您的吞吐量。目前，您只能通过 [CreateDeliveryStream](https://docs.amazonaws.cn/firehose/latest/APIReference/API_CreateDeliveryStream.html)API 操作设置此标志。

  如果由于较高的数据摄取量超过 Firehose 流的吞吐能力而导致 **Direct PUT** 流受到节流，则 Firehose 会自动提高流的吞吐量限制，直到节流得到控制。根据吞吐量的增加和节流，Firehose 可能需要更长的时间才能将数据流的吞吐量提高到所需的水平。因此，请继续重试失败的数据摄取记录。如果您预计数据量会突然大幅增加，或者您的新数据流需要的吞吐量比默认吞吐量限制更高，则请求提高吞吐量限制。
+ **吞吐量和分区扩展** — 该服务经过优化，可以支持大量 Iceberg 分区或非常高的摄取吞吐量。随着载入吞吐量的增加，可以主动写入的分区数量会减少。

  以下是采集吞吐量的限制和支持的最大活跃分区。    
[See the AWS documentation website for more details](http://docs.amazonaws.cn/firehose/latest/dev/apache-iceberg-considerations.html)
+ **每秒 S3 事务数 (TPS)** — 为了优化 S3 性能，如果您使用 Kinesis Data Streams 或 Amazon MSK 作为来源，我们建议您使用正确的分区键对源记录进行分区。这样，路由到同一 Iceberg 表的数据记录就会映射到一个或几个被称为分片的源分区。如果可能，将属于不同目标 Iceberg 表的数据记录分散到不同的 Iceberg 表中。partitions/shards, so that you can use all the aggregate throughput available across all the partitions/shards of the source topic/stream
+ **列**：对于列名称和值，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](https://docs.amazonaws.cn/streams/latest/dev/kpl-with-firehose.html) 聚合记录，并将数据摄取到 Firehose 中，将 Amazon Kinesis Data Streams 作为源，则 Firehose 会自动解聚，并为每条记录使用一个 JSON 对象。
+ **压缩和存储优化**：每次使用 Firehose 写入 Iceberg 表时，它都会提交和生成快照、数据文件和删除文件。拥有许多数据文件会增加元数据开销并影响读取性能。为了获得高效的查询性能，您可能需要考虑一种解决方案，即定期获取小的数据文件并重写为较少的较大数据文件。这个过程称为压实。 Amazon Glue Data Catalog 支持自动压缩 Apache 冰山表。有关更多信息，请参阅《Amazon Glue 用户指南》**中的 [Compaction management](https://docs.amazonaws.cn/glue/latest/dg/compaction-management.html)。有关更多信息，请参阅 [Automatic compaction of Apache Iceberg Tables](https://www.amazonaws.cn/blogs/aws/aws-glue-data-catalog-now-supports-automatic-compaction-of-apache-iceberg-tables/)。或者，您可以运行 Athena Optimize 命令来手动执行压缩。有关“优化”命令的更多信息，请参阅 [Athena Optimize](https://docs.amazonaws.cn/athena/latest/ug/optimize-statement.html)。

  除了压缩数据文件外，您还可以使用对 Apache Iceberg 表执行表维护的 [VACUUM](https://docs.amazonaws.cn/athena/latest/ug/vacuum-statement.html) 语句来减少存储消耗，例如快照过期和孤立文件移除。或者 Amazon Glue Data Catalog ，您可以使用它来自动删除不再需要的数据文件、孤立文件和过期快照，从而支持 Apache Iceberg 表的托管表优化。有关更多信息，请参阅这篇关于 [Storage optimization of Apache Iceberg Tables](https://www.amazonaws.cn/blogs/big-data/the-aws-glue-data-catalog-now-supports-storage-optimization-of-apache-iceberg-tables/) 的博客文章。
+ 我们不支持 Apache Iceberg 表的 Amazon MSK 无服务器源作为目的地。
+ 对于更新操作，Firehose 会先放置一个删除文件，然后再执行插入操作。放置删除文件会产生 Amazon S3 放置费用。
+ Firehose 建议不使用多个 Firehose 流将数据写入同一 Apache Iceberg 表中。这是因为 Apache Iceberg 依赖于[乐观并发控制 (OCC)](https://iceberg.apache.org/docs/1.6.0/reliability/#concurrent-write-operations)。如果多个 Firehose 流尝试同时写入单个 Iceberg 表，则在给定时间只有一个流成功提交数据。其他无法提交回退的流，然后重试提交操作，直到配置的重试持续时间到期。重试持续时间用完后，数据和删除文件密钥（Amazon S3 路径）将发送到配置的 Amazon S3 错误前缀。
+ Firehose 支持的当前 Iceberg 库版本为 1.5.2 版。
+ 要将加密数据传送到亚马逊 S3 表，您应该在 Amazon S3 表中配置 Amazon Key Management Service 参数，而不是在 Firehose 配置中配置参数。如果您在 Firehose 中配置用于将加密数据传送到亚马逊 S3 表的 Amazon Key Management Service 参数，则 Firehose 无法使用这些参数进行加密。有关更多信息，请参阅对[Amazon KMS 密钥使用服务器端加密](https://docs.amazonaws.cn/AmazonS3/latest/userguide/s3-tables-kms-encryption.html)。
+ Firehose 直播仅支持向通过 Iceberg 的 API 创建的数据库和表进行传输。 GlueCatalog 不支持传输到通过 Glue SDK 创建的数据库和表。请注意，Iceberg 库中的数据库和表名不支持连字符 (`-`)。有关更多详细信息，请参阅 Iceberg 库支持的 [Glue 数据库正则表达式](https://github.com/apache/iceberg/blob/main/aws/src/main/java/org/apache/iceberg/aws/glue/IcebergToGlueConverter.java#L62)和 [Glue 表正则表达式](https://github.com/apache/iceberg/blob/main/aws/src/main/java/org/apache/iceberg/aws/glue/IcebergToGlueConverter.java#L63])。
+ Firehose 写入的所有文件都是使用记录中存在的分区计算的。这也适用于删除的文件。不支持全局删除，例如为分区表写入未分区的删除文件。
+ 在向 Apache Iceberg 表传送数据时，Firehose 目前不支持布隆过滤器属性。在 Iceberg 表上配置布隆过滤器属性时，Firehose 将在数据传输操作期间忽略这些属性。