

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 考量和限制
<a name="apache-iceberg-considerations"></a>

**注意**  
Firehose 支援 Apache Iceberg Tables 作為除中國區域、亞太區域 （台北） AWS GovCloud (US) Regions、亞太區域 （馬來西亞）、亞太區域 （紐西蘭） 和墨西哥 （中部） [AWS 區域](https://docs.aws.amazon.com/glossary/latest/reference/glos-chap.html?icmpid=docs_homepage_addtlrcs#region)以外所有 的目的地。

Firehose 支援 Apache Iceberg 資料表有下列考量和限制。
+ **輸送量 **– 如果您使用 **Direct PUT** 作為將資料交付至 Apache Iceberg 資料表的來源，則每個串流的最大輸送量在美國東部 （維吉尼亞北部）、美國西部 （奧勒岡） 和歐洲 （愛爾蘭） 區域為 5 MiB/秒，所有其他區域為 1 MiB/秒 AWS 區域。如果您想要在沒有更新和刪除的情況下將資料插入 Iceberg 資料表，並且想要提高串流的輸送量，則可以使用 [Firehose 限制表單](https://support.console.aws.amazon.com/support/home#/case/create%3FissueType=service-limit-increase%26limitType=kinesis-firehose-limits)請求提高輸送量限制。

  `True` 如果您只想插入資料而不執行更新和刪除，也可以將 `AppendOnly`旗標設定為 。透過將 `AppendOnly`旗標設定為 `True`，Firehose 會自動擴展以符合您的輸送量。目前，您只能使用 [CreateDeliveryStream](https://docs.aws.amazon.com/firehose/latest/APIReference/API_CreateDeliveryStream.html) API 操作來設定此旗標。

  如果**直接 PUT** 串流因為較高的資料擷取磁碟區超過 Firehose 串流的輸送量容量而遇到限流，則 Firehose 會自動增加串流的輸送量限制，直到包含限流為止。根據增加的輸送量和限流，Firehose 可能需要更長的時間，才能將串流的輸送量增加到所需的層級。因此，請繼續重試失敗的資料擷取記錄。如果您預期資料量在突然的大爆量中增加，或如果您的新串流需要高於預設輸送量限制的輸送量，請請求增加輸送量限制。
+ **輸送量和分割區擴展** – 服務經過最佳化，可支援大量 Iceberg 分割區或極高的擷取輸送量。隨著擷取輸送量增加，可主動寫入的分割區數量會減少。

  以下是擷取輸送量和支援的最大作用中分割區的限制。    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/firehose/latest/dev/apache-iceberg-considerations.html)
+ **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](https://docs.aws.amazon.com/streams/latest/dev/kpl-with-firehose.html) 彙總記錄，並使用 Amazon Kinesis Data Streams 將資料擷取至 Firehose 做為來源，則 Firehose 會自動取消彙總每個記錄並使用一個 JSON 物件。
+ **壓縮和儲存最佳化** – 每次使用 Firehose 寫入 Iceberg Tables 時，它會遞交和產生快照、資料檔案和刪除檔案。擁有許多資料檔案會增加中繼資料額外負荷，並影響讀取效能。為了獲得有效率的查詢效能，您可能想要考慮一個解決方案，該解決方案會定期採用小型資料檔案，並將其重寫為較小的資料檔案。此程序稱為 compaction。 AWS Glue Data Catalog 支援自動壓縮 Apache Iceberg Tables。如需詳細資訊，請參閱《*AWS Glue 使用者指南*》中的[壓縮管理](https://docs.aws.amazon.com/glue/latest/dg/compaction-management.html)。如需詳細資訊，請參閱[自動壓縮 Apache Iceberg 資料表](https://aws.amazon.com/blogs/aws/aws-glue-data-catalog-now-supports-automatic-compaction-of-apache-iceberg-tables/)。或者，您可以執行 Athena Optimize 命令來手動執行壓縮。如需 Optimize 命令的詳細資訊，請參閱 [Athena Optimize](https://docs.aws.amazon.com/athena/latest/ug/optimize-statement.html)。

  除了壓縮資料檔案之外，您還可以使用對 Apache Iceberg 資料表執行資料表維護的 [VACUUM](https://docs.aws.amazon.com/athena/latest/ug/vacuum-statement.html) 陳述式來最佳化儲存體使用量，例如快照過期和孤立檔案移除。或者，您也可以使用 AWS Glue Data Catalog 來支援 Apache Iceberg 資料表的受管資料表最佳化，方法是自動移除資料檔案、孤立檔案，並使不再需要的快照過期。如需詳細資訊，請參閱有關 [Apache Iceberg Tables 儲存最佳化的](https://aws.amazon.com/blogs/big-data/the-aws-glue-data-catalog-now-supports-storage-optimization-of-apache-iceberg-tables/)部落格文章。
+ 我們不支援 Apache Iceberg Tables 的 Amazon MSK Serverless 來源做為目的地。
+ 對於更新操作，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 Library 版本是 1.5.2 版。
+ 若要將加密資料交付至 Amazon S3 Tables，您應該在 Amazon S3 Tables 中設定 AWS Key Management Service 參數，而不是在 Firehose 組態中設定參數。如果您在 Firehose 中設定 AWS Key Management Service 參數以將加密的資料交付至 Amazon S3 Tables，則 Firehose 無法使用這些參數進行加密。如需詳細資訊，請參閱[搭配 AWS KMS 金鑰使用伺服器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-kms-encryption.html)。
+ Firehose 串流僅支援交付至透過 Iceberg 的 GlueCatalog API 建立的資料庫和資料表。不支援交付至透過 Glue SDK 建立的資料庫和資料表。請注意，連字號 (`-`) 不是資料庫和 Iceberg 程式庫中的資料表名稱支援的字元。如需詳細資訊，請參閱 Iceberg 程式庫支援的 [Glue Database Regex](https://github.com/apache/iceberg/blob/main/aws/src/main/java/org/apache/iceberg/aws/glue/IcebergToGlueConverter.java#L62) 和 [Glue Table Regex](https://github.com/apache/iceberg/blob/main/aws/src/main/java/org/apache/iceberg/aws/glue/IcebergToGlueConverter.java#L63])。
+ Firehose 寫入的所有檔案都是使用記錄中存在的分割區來計算。這也適用於已刪除的檔案。不支援全域刪除，例如寫入分割資料表的未分割刪除檔案。
+ Firehose 目前不支援將資料交付至 Apache Iceberg 資料表時的 Bloom 篩選條件屬性。在 Iceberg 資料表上設定 Bloom 篩選條件屬性時，Firehose 會在資料交付操作期間忽略這些屬性。