考慮事項と制限
注記
Firehose は、中国リージョン、AWS GovCloud (US) Regions、アジアパシフィック (マレーシア) を除くすべての AWS リージョン で、Apache Iceberg テーブルを送信先としてサポートしています。
Apache Iceberg テーブルに対する Firehose のサポートには、次の考慮事項と制限があります。
-
スループット – 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 テーブルにルーティングされるデータレコードは、シャードと呼ばれる 1 つまたは複数のソースパーティションにマッピングされます。可能であれば、異なるターゲット 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 は新しいフィールドをスキップします。
-
レコードごとに 1 つの JSON オブジェクト – 1 つの Firehose レコードに 1 つの JSON オブジェクトのみを送信できます。レコード内で複数の JSON オブジェクトを集約して送信すると、Firehose はエラーをスローし、データを S3 エラーバケットに配信します。KPL でレコードを集約し、Amazon Kinesis Data Streams をソースとして Firehose にデータを取り込むと、Firehose はレコードごとに 1 つの JSON オブジェクトを自動的に集約解除して使用します。
-
圧縮とストレージの最適化 – Firehose を使用して Iceberg テーブルに書き込むたびに、スナップショット、データファイル、および削除ファイルをコミットして生成します。データファイルの数が多いと、メタデータのオーバーヘッドが増加し、読み取りパフォーマンスに影響します。効率的なクエリパフォーマンスを実現するには、小さなデータファイルを定期的に取得し、それらをまとめて少数の大きなデータファイルに書き換えるソリューションを検討することをお勧めします。このプロセスは圧縮と呼ばれます。AWS Glue Data Catalog は Apache Iceberg テーブルの自動圧縮をサポートします。詳細については、「AWS Glue ユーザーガイド」の「Compaction management」を参照してください。詳細については、「Automatic compaction of Apache Iceberg Tables
」を参照してください。別の方法として、Athena Optimize コマンドを実行して、圧縮を手動で実行することも可能です。Optimize コマンドの詳細については、「Athena Optimize」を参照してください。 データファイルの圧縮に加えて、スナップショットの有効期限や未参照ファイルの削除など、Apache Iceberg テーブルでテーブルメンテナンスを実行する VACUUM ステートメントを使用して、ストレージの消費を最適化することもできます。あるいは、AWS Glue Data Catalog を使用できます。これは、データファイルや孤立したファイルを自動的に削除し、不要になったスナップショットを失効させることによって、Apache Iceberg テーブルのマネージドテーブル最適化もサポートします。詳細については、Apache Iceberg テーブルのストレージ最適化
に関するこのブログ記事を参照してください。 -
Apache Iceberg テーブルの送信先としての Amazon MSK Serverless ソースはサポートされていません。
-
更新オペレーションの場合、Firehose は削除ファイルを配置し、その後に挿入オペレーションを実行します。削除ファイルを配置すると、Amazon S3 PUT 料金が発生します。
-
Firehose では、複数の Firehose ストリームを使用して同じ Apache Iceberg テーブルにデータを書き込むことは推奨されません。これは、Apache Iceberg がオプティミスティック同時実行制御 (OCC)
に依存しているためです。複数の Firehose ストリームで 1 つの Iceberg テーブルへの同時書き込みを行おうとした場合、特定の時点でデータのコミットに成功するのは 1 つのストリームのみです。コミットに失敗した他のストリームはバックオフし、設定した再試行期間が終了するまでコミットオペレーションを再試行します。再試行期間が過ぎると、設定した Amazon S3 エラープレフィックスにデータと削除ファイルキー (Amazon S3 パス) が送信されます。 -
Firehose がサポートする現在の Iceberg Library バージョンは 1.5.2 です。
-
暗号化されたデータを Amazon S3 Tables に配信するには、Firehose 設定ではなく、Amazon S3 Tables で AWS Key Management Service パラメータを設定する必要があります。暗号化されたデータを Amazon S3 Tables に配信するために Firehose で AWS Key Management Service パラメータを設定しても、Firehose はこれらのパラメータを使用して暗号化を行うことはできません。詳細については、「Using server-side encryption with AWS KMS keys」を参照してください。
-
Firehose ストリームは、Iceberg の GlueCatalog API を介して作成されたデータベースとテーブルへの配信のみをサポートします。Glue SDK を使用して作成されたデータベースやテーブルへの配信はサポートされていません。ハイフン (
-) 文字は、Iceberg ライブラリのデータベース名とテーブル名ではサポートされていません。詳細については、Iceberg ライブラリでサポートされている Glue Database Regexと Glue Table Regex を参照してください。 -
Firehose によって書き込まれたすべてのファイルは、レコードに存在するパーティションを使用して計算されます。これは、削除されたファイルにも適用されます。パーティション化されたテーブルに対するパーティション化されていない削除ファイルの書き込みなどのグローバル削除はサポートされていません。