https://iceberg.apache.org/docs/nightly/aws/
Icebergは、iceberg-awsモジュールを通じてさまざまなAWSサービスとの統合を提供します。 このセクションでは、AWSでIcebergを使用する方法について説明します。
iceberg-aws
モジュールは、Spark および Flink エンジンランタイム(バージョン 0.11.0 以降)にバンドルされています。
ただし、AWS クライアントはバンドルされていないため、アプリケーションと同じクライアントバージョンを使用できます。
Iceberg は AWS v2 SDK に依存しているため、AWS v2 SDK をご用意いただく必要があります。
AWS SDK バンドルを使用するか、依存関係を最小限に抑えたい場合は個別の AWS クライアントパッケージ(Glue、S3、DynamoDB、KMS、STS)を使用するかを選択できます。
すべてのデフォルトのAWSクライアントは、HTTP接続管理にApache HTTPクライアントを使用します。 この依存関係はAWS SDKバンドルには含まれていないため、別途追加する必要があります。 URL接続HTTPクライアントなどの別のHTTPクライアントライブラリを選択する場合は、クライアントのカスタマイズセクションをご覧ください。
AWSモジュールのすべての機能は、カスタムカタログプロパティを通じてロードできます。 カスタムカタログのロード方法については、各エンジンのドキュメントをご覧ください。以下にいくつか例を示します。
たとえば、Spark 3.4 (scala 2.12 を使用) と AWS クライアント (iceberg-aws-bundle
にパッケージ化されています) で AWS 機能を使用するには、次のコマンドで Spark SQL シェルを起動します。
# start Spark SQL client shell
spark-sql --packages org.apache.iceberg:iceberg-spark-runtime-3.4_2.12:1.8.1,org.apache.iceberg:iceberg-aws-bundle:1.8.1 \
--conf spark.sql.defaultCatalog=my_catalog \
--conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.my_catalog.warehouse=s3://my-bucket/my/key/prefix \
--conf spark.sql.catalog.my_catalog.type=glue \
--conf spark.sql.catalog.my_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO
ご覧のとおり、シェル コマンドでは、--packages
を使用して、関連するすべての AWS 依存関係を含む追加の iceberg-aws-bundle
を指定します。
Flink で AWS モジュールを使用するには、必要な依存関係をダウンロードし、Flink SQL クライアントの起動時に指定します。
# download Iceberg dependency
ICEBERG_VERSION=1.8.1
MAVEN_URL=https://repo1.maven.org/maven2
ICEBERG_MAVEN_URL=$MAVEN_URL/org/apache/iceberg
wget $ICEBERG_MAVEN_URL/iceberg-flink-runtime/$ICEBERG_VERSION/iceberg-flink-runtime-$ICEBERG_VERSION.jar
wget $ICEBERG_MAVEN_URL/iceberg-aws-bundle/$ICEBERG_VERSION/iceberg-aws-bundle-$ICEBERG_VERSION.jar
# start Flink SQL client shell
/path/to/bin/sql-client.sh embedded \
-j iceberg-flink-runtime-$ICEBERG_VERSION.jar \
-j iceberg-aws-bundle-$ICEBERG_VERSION.jar \
shell
これらの依存関係を使用して、次のような Flink カタログを作成できます。
CREATE CATALOG my_catalog WITH (
'type'='iceberg',
'warehouse'='s3://my-bucket/my/key/prefix',
'type'='glue',
'io-impl'='org.apache.iceberg.aws.s3.S3FileIO'
);
sql-client-defaults.yaml
でカタログ構成を指定してプリロードすることもできます。
catalogs:
- name: my_catalog
type: iceberg
warehouse: s3://my-bucket/my/key/prefix
catalog-impl: org.apache.iceberg.aws.glue.GlueCatalog
io-impl: org.apache.iceberg.aws.s3.S3FileIO
Hive で AWS モジュールを使用するには、Flink の例と同様に必要な依存関係をダウンロードし、それを Hive クラスパスに追加するか、実行時に CLI で jar を追加します。
add jar /my/path/to/iceberg-hive-runtime.jar;
add jar /my/path/to/aws/bundle.jar;
これらの依存関係を使用すると、次の方法で Glue カタログを登録し、CLI で実行時に Hive に外部テーブルを作成できます。
SET iceberg.engine.hive.enabled=true;
SET hive.vectorized.execution.enabled=false;
SET iceberg.catalog.glue.type=glue;
SET iceberg.catalog.glue.warehouse=s3://my-bucket/my/key/prefix;
-- suppose you have an Iceberg table database_a.table_a created by GlueCatalog
CREATE EXTERNAL TABLE database_a.table_a
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'
TBLPROPERTIES ('iceberg.catalog'='glue');
上記の構成を hive-site.xml
に設定して、カタログをプリロードすることもできます。
AWS を使用して Iceberg カタログを構築する際にユーザーが選択できるさまざまなオプションがあります。
Iceberg は、AWS Glue を Catalog
実装として使用できるようにします。
使用すると、Iceberg 名前空間は Glue データベースとして、Iceberg テーブルは Glue テーブルとして、そしてすべての Iceberg テーブルバージョンは Glue テーブルバージョンとして保存されます。
上記の AWS 統合の有効化セクションに示されているように、catalog-impl を org.apache.iceberg.aws.glue.GlueCatalog
として指定するか、type
を glue
に設定することで、Glue カタログの使用を開始できます。
カタログの読み込みに関する詳細は、Spark や Flink などの各エンジンのページをご覧ください。
各AWSアカウントと各AWSリージョンには、固有のGlueメタストアがあります。
デフォルトでは、GlueCatalogはユーザーのデフォルトのAWSクライアント認証情報とリージョン設定に基づいて、使用するGlueメタストアを選択します。
異なるAWSアカウントのGlueカタログを参照するには、glue.id
カタログプロパティを使用してGlueカタログIDを指定できます。
GlueカタログIDは、数値のAWSアカウントIDです。
Glueカタログが別のリージョンにある場合は、AWSクライアントが正しいリージョンを参照するように設定する必要があります。
詳細については、「AWSクライアントのカスタマイズ」をご覧ください。
AWS Glue には古いテーブルバージョンをアーカイブする機能があり、ユーザーは必要に応じてテーブルを任意の履歴バージョンにロールバックできます。
デフォルトでは、Iceberg Glue カタログは古いテーブルバージョンのアーカイブをスキップします。
古いテーブルバージョンをアーカイブしたい場合は、glue.skip-archive
を false
に設定してください。
ただし、Iceberg テーブルへのストリーミング取り込みの場合、glue.skip-archive
を false
に設定すると、大量の Glue テーブルバージョンがすぐに作成されることに注意してください。
詳細については、Glue クォータと UpdateTable API をご覧ください。
テーブル名と名前空間の名前検証をスキップできるようにします。 Hiveとの互換性を確保するため、Glueのベストプラクティスに従うことをお勧めします。 この機能は、非標準文字を使用した既存の規約を使用しているユーザー向けにのみ追加されています。 データベース名とテーブル名の検証をスキップした場合、下流のシステムでその名前がすべてサポートされる保証はありません。
デフォルトでは、Iceberg はテーブルへの同時更新に Glue の Optimistic Locking を使用します。 楽観的ロックでは、各テーブルにバージョン ID が付与されます。 ユーザーがテーブルメタデータを取得すると、Iceberg はそのテーブルのバージョン ID を記録します。 サーバー側のバージョン ID が変更されない限り、ユーザーはテーブルを更新できます。 自分より先に他のユーザーがテーブルを変更した場合、バージョンの不一致が発生し、更新が失敗します。 Iceberg はメタデータを更新し、競合の有無を確認します。 コミットの競合がない場合、操作は再試行されます。 楽観的ロックは、Glue における Iceberg テーブルのアトミックトランザクションを保証します。 また、他のユーザーが誤って変更内容を上書きするのを防ぎます。
情報
Glue の楽観的ロックを利用するには、AWS SDK バージョン 2.17.131 以上をご使用ください。AWS SDK バージョンが 2.17.131 未満の場合は、インメモリロックのみが使用されます。アトミックトランザクションを確実に実行するには、DynamoDb ロックマネージャーを設定する必要があります。
他のすべてのカタログ実装と同様に、warehouse はストレージ内のデータウェアハウスのルートパスを決定するための必須のカタログプロパティです。 Glue では、S3FileIO を使用するため、デフォルトでは S3 内のウェアハウスのみが許可されます。 データを別のローカルストアまたはクラウドストアに保存するには、Glue カタログで io-impl カタログプロパティを設定することで、HadoopFileIO または任意のカスタム FileIO を使用するように切り替えることができます。 この機能の詳細については、カスタム FileIO セクションをご覧ください。
デフォルトでは、名前空間my_ns
のテーブルmy_table
のルートロケーションは、my-warehouse-location/my-ns.db/my-table
です。
このデフォルトのルートロケーションは、名前空間レベルとテーブルレベルの両方で変更できます。
名前空間内のすべてのテーブルに異なるパスプレフィックスを使用するには、AWS コンソールまたは任意の AWS Glue クライアント SDK を使用して、対応する Glue データベースの locationUri
属性を更新します。
例えば、my_ns
の locationUri
を s3://my-ns-bucket
に更新すると、新しく作成されるすべてのテーブルは新しいプレフィックスの下にあるデフォルトのルートロケーションを持つようになります。
例えば、新しいテーブル my_table_2
のルートロケーションは s3://my-ns-bucket/my_table_2
になります。
特定のテーブルに全く異なるルートパスを使用するには、location
テーブルプロパティを希望するルートパスの値に設定します。例えば、Spark SQLでは次のようにします。
CREATE TABLE my_catalog.my_ns.my_table (
id bigint,
data string,
category string)
USING iceberg
OPTIONS ('location'='s3://my-special-table-bucket')
PARTITIONED BY (category);
LOCATION
キーワードをサポートする Spark などのエンジンの場合、上記の SQL ステートメントは次のものと同等になります。
CREATE TABLE my_catalog.my_ns.my_table (
id bigint,
data string,
category string)
USING iceberg
LOCATION 's3://my-special-table-bucket'
PARTITIONED BY (category);
Iceberg は、DynamoDB テーブルを使用してデータベースとテーブル情報を記録および管理することをサポートしています。
DynamoDB カタログは次の構成をサポートしています。
プロパティ | デフォルト | 説明 |
---|---|---|
dynamodb.table-name | iceberg | DynamoDbCatalog で使用される DynamoDB テーブルの名前 |
DynamoDB テーブルは次の列で設計されています。
カラム | キー | 型 | 説明 |
---|---|---|---|
identifier | partition key | string | db1.table1 のようなテーブル識別子、または名前空間の場合は文字列 NAMESPACE |
namespace | sort key | string | 名前空間名。グローバルセカンダリインデックス(GSI)は、名前空間をパーティションキー、識別子をソートキーとして作成され、他の投影された列は作成されません。 |
v | string | 行バージョン、楽観的ロックに使用される | |
updated_at | number | 最終更新のタイムスタンプ(ミリ秒) | |
created_at | number | テーブル作成のタイムスタンプ(ミリ秒) | |
p.<property_key> | string | Iceberg 定義のテーブル プロパティ (table_type 、metadata_location 、previous_metadata_location など) または名前空間プロパティ |
この設計には次の利点があります。
- パーティションキーがテーブルレベルにあるため、同じ名前空間内のテーブルへの書き込みトラフィックが大量に発生しても、潜在的なホットパーティションの問題を回避できます。
- 名前空間操作は、テーブルコミット操作に影響を与えないように、単一のパーティションにクラスター化されます。
- ソートキーからパーティションキーへの逆GSIはテーブル一覧操作に使用され、その他の操作はすべて単一行操作または単一パーティションクエリです。カタログ内のどの操作でも、テーブル全体のスキャンは必要ありません。
- 2つのプロセスが同じミリ秒でコミットするのを避けるために、updated_atの代わりに文字列UUIDバージョンフィールドvが使用されます。
catalog.renameTable
では冪等性を保証するために複数行のトランザクションが使用されます。- プロパティは最上位の列としてフラット化されるため、ユーザーは任意のプロパティフィールドにカスタムGSIを追加してカタログをカスタマイズできます。例えば、所有者情報をテーブルプロパティ
owner
として保存し、p.owner
列にGSIを追加することで、所有者でテーブルを検索できます。
Icebergは、リレーショナルデータベースのテーブルを使用してIcebergテーブルを管理するJDBCカタログもサポートしています。 AWS RDSなどのリレーショナルデータベースサービスでJDBCカタログを使用するように設定できます。 JDBCカタログの使用に関するガイドと例については、JDBC統合ページをご覧ください。 IAM認証を使用したJDBCカタログの設定の詳細については、こちらのAWSドキュメントをご覧ください。
利用可能なすべてのオプションを考慮して、アプリケーションに適したカタログを選択する際には、次のガイドラインに従ってください。
- 組織に既存の Glue メタストアがある場合、または Glue、Athena、EMR、Redshift、LakeFormation を含む AWS 分析エコシステムを使用する予定の場合は、Glue カタログを使用すると最も簡単に統合できます。
- アプリケーションでテーブルへの頻繁な更新や高い読み取りおよび書き込みスループット (ストリーミング書き込みなど) が必要な場合、Glue と DynamoDB カタログは楽観的ロックを通じて最高のパフォーマンスを提供します。
- カタログ内のテーブルにアクセス制御を適用する場合、Glue テーブルは IAM リソースとして管理できますが、DynamoDB カタログ テーブルはアイテム レベルのアクセス許可を通じてのみ管理できるため、はるかに複雑です。
- カタログ全体をスキャンせずにテーブルプロパティ情報に基づいてテーブルをクエリしたい場合は、DynamoDB カタログを使用すると、任意のプロパティフィールドのセカンダリインデックスを構築し、効率的なクエリパフォーマンスを提供できます。
- Glue に接続しながら DynamoDB カタログの利点も活用したい場合は、Lambda トリガーを使用して DynamoDB ストリームを有効にし、DynamoDB カタログ内のテーブル情報を使用して Glue メタストアを非同期的に更新できます。
- 組織がすでに RDS で既存のリレーショナル データベースを管理している場合、またはサーバーレス Aurora を使用してテーブルを管理している場合は、JDBC カタログを使用すると最も簡単に統合できます。
Amazon DynamoDB は HadoopCatalog または HadoopTables で使用できます。 これにより、カタログはコミットごとにまずヘルパー DynamoDB テーブルを使用してロックを取得し、その後 Iceberg テーブルを安全に変更しようとします。 これは、S3 などのファイル書き込みの排他性を提供しないストレージにおいて、ファイルシステムベースのカタログがアトミックトランザクションを確保するために不可欠です。
この機能には、次のロック関連のカタログ プロパティが必要です。
lock-impl
をorg.apache.iceberg.aws.dynamodb.DynamoDbLockManager
として設定します。- 使用したいDynamoDBテーブル名を
lock.table
に設定してください。指定した名前のロックテーブルがDynamoDBに存在しない場合は、課金モードがリクエスト課金に設定された新しいテーブルが作成されます。
ロック関連のカタログプロパティは、ハートビート間隔などのロック動作の調整にも使用できます。詳細については、ロックカタログプロパティを参照してください。
Iceberg では、S3FileIO を介して S3 にデータを書き込むことができます。 GlueCatalog はデフォルトでこの FileIO を使用し、他のカタログは io-impl カタログプロパティを使用してこの FileIO を読み込むことができます。
S3FileIO
は、データのアップロードにカスタマイズされたプログレッシブマルチパートアップロードアルゴリズムを実装しています。
データファイルは、各パートの準備が整い次第、パートごとに並列でアップロードされ、各パートはアップロードプロセスが完了するとすぐに削除されます。
これにより、アップロード速度が最大化され、アップロード中のローカルディスク使用量が最小限に抑えられます。
この機能に関連してユーザーが調整できる設定は次のとおりです。
プロパティ | デフォルト | 説明 |
---|---|---|
s3.multipart.num-threads | システムで利用可能なプロセッサの数 | S3 にパーツをアップロードするために使用するスレッドの数 (すべての出力ストリームで共有) |
s3.multipart.part-size-bytes | 32MB | マルチパートアップロードリクエストの単一パートのサイズ |
s3.multipart.threshold | 1.5 | 単一の put object リクエストを使用したアップロードからマルチパートアップロードを使用したアップロードに切り替える、マルチパートサイズの係数で表されたしきい値 |
s3.staging-dir | java.io.tmpdir プロパティ値 |
一時ファイルを保持するディレクトリ |
S3FileIO
は、S3 サーバー側暗号化モードの 3 つすべてをサポートしています。
- SSE-S3: Amazon S3 管理キーによるサーバー側暗号化 (SSE-S3) を使用すると、各オブジェクトは一意のキーで暗号化されます。追加の安全対策として、定期的にローテーションされるマスターキーでキー自体も暗号化されます。Amazon S3 のサーバー側暗号化では、利用可能な最も強力なブロック暗号の 1 つである 256 ビット Advanced Encryption Standard (AES-256) を使用してデータが暗号化されます。
- SSE-KMS: AWS Key Management Service に保存されたカスタマーマスターキー (CMK) を使用したサーバー側暗号化 (SSE-KMS) は SSE-S3 に似ていますが、追加のメリットと料金がいくつか追加されています。CMK の使用には個別の権限があり、Amazon S3 内のオブジェクトへの不正アクセスに対する保護が強化されます。SSE-KMS は、CMK がいつ、誰によって使用されたかを示す監査証跡も提供します。さらに、カスタマー管理の CMK を作成および管理したり、お客様、サービス、リージョンに固有の AWS 管理の CMK を使用したりできます。
- DSSE-KMS: AWS Key Management Service キーを使用したデュアルレイヤーサーバー側暗号化 (DSSE-KMS) は SSE-KMS に似ていますが、オブジェクトを Amazon S3 にアップロードする際に 2 層の暗号化を適用します。DSSE-KMS は、データに多層暗号化を適用し、暗号化キーを完全に制御することを要求するコンプライアンス標準を満たすために使用できます。
- SSE-C: 顧客指定のキーによるサーバー側暗号化 (SSE-C) では、暗号化キーを管理し、Amazon S3 がディスクへの書き込み時に暗号化を管理し、オブジェクトにアクセスするときに復号化します。
サーバー側の暗号化を有効にするには、次の構成プロパティを使用します。
プロパティ | デフォルト | 説明 |
---|---|---|
s3.sse.type | none |
none , s3 , kms , dsse-kms , custom |
s3.sse.key | kms および dsse-kms タイプの場合は aws/s3、それ以外の場合は null | kms および dsse-kms タイプの場合は KMS キー ID または ARN、カスタム タイプの場合はカスタム base-64 AES256 対称キー |
s3.sse.md5 | null | SSE タイプがカスタムの場合、整合性を確保するために、この値は対称キーの base-64 MD5 ダイジェストとして設定する必要があります。 |
S3FileIO
は、詳細なアクセス制御のためにS3アクセス制御リスト(ACL)をサポートしています。
ユーザーはs3.acl
プロパティを設定することでACLレベルを選択できます。
詳細については、S3 ACLドキュメントをご覧ください。
S3をはじめとする多くのクラウドストレージサービスは、オブジェクトプレフィックスに基づいてリクエストを制限します。 従来のHiveストレージレイアウトでS3に保存されたデータは、オブジェクトが同じファイルパスプレフィックスに保存されるため、S3のリクエスト制限の影響を受ける可能性があります。
IcebergはデフォルトでHiveストレージレイアウトを使用しますが、ObjectStoreLocationProvider
を使用するように切り替えることができます。
ObjectStoreLocationProvider
を使用すると、保存されたファイルごとに決定論的なハッシュが生成され、write.data.path
の直後にハッシュが追加されます。
これにより、S3に書き込まれたファイルはS3バケット内の複数のプレフィックスに均等に分散され、S3関連のIO操作のスロットリングが最小限に抑えられ、スループットが最大化されます。ObjectStoreLocationProvider
を使用する場合、Icebergテーブル間でwrite.data.path
を共有するとパフォーマンスが向上します。
S3 による API QPS のスケーリング方法の詳細については、2018 re:Invent のセッション「Amazon S3 と Amazon S3 Glacier のベストプラクティス」をご覧ください。53:39 では S3 のスケーリングとパーティション分割の仕組みについて、54:50 では新しいパーティションが作成されるまでの 30~60 分の待機時間について説明しています。
ObjectStorageLocationProvider
を使用するには、テーブルのプロパティにwrite.object-storage.enabled=true
を追加します。
以下は、ObjectStorageLocationProvider
を使用してテーブルを作成するSpark SQLコマンドの例です。
CREATE TABLE my_catalog.my_ns.my_table (
id bigint,
data string,
category string)
USING iceberg
OPTIONS (
'write.object-storage.enabled'=true,
'write.data.path'='s3://my-table-data-bucket/my_table')
PARTITIONED BY (category);
この新しいテーブルに1行挿入することができます
INSERT INTO my_catalog.my_ns.my_table VALUES (1, "Pizza", "orders");
これにより、write.object-storage.path
の直後に20ビットのbase64ハッシュ(01010110100110110010
)がS3に書き込まれ、テーブルへの読み取りがS3バケットプレフィックス全体に均等に分散され、パフォーマンスが向上します。
S3汎用バケットにおける自動スケーリング動作を改善するため、以前はbase64ハッシュがbase2に更新されました。
今回のアップデートの一環として、エントロピーを複数のディレクトリに分割しました。 これは、Icebergの孤立ファイル削除プロセスの効率を向上させるためです。 ディレクトリは、複数のワーカー間で作業を分割し、トラバーサルを高速化する手段として使用されるためです。 以下の例からわかるように、ハッシュを分割して深さ3の4ビットディレクトリを作成し、ハッシュの最後の部分を末尾に追加しています。
s3://my-table-data-bucket/my_ns.db/my_table/0101/0110/1001/10110010/category=orders/00000-0-5affc076-96a4-48f2-9cd2-d5efbc9f0c94-00001.parquet
ObjectStoreLocationProvider
のパス解決ロジックは、write.data.path
、次に <tableLocation>/data
です。
ただし、0.12.0 までの古いバージョンでは、ロジックは以下のとおりです。- 0.12.0 より前は、write.object-storage.path
を設定する必要があります。- 0.12.0 では、write.object-storage.path
、次に write.folder-storage.path
、最後に <tableLocation>/data
です。- 2.0.0 では、write.object-storage.path
と write.folder-storage.path
は削除されます。
詳細については、LocationProvider 構成セクションを参照してください。
また、新しいテーブルプロパティ write.object-storage.partitioned-paths
を追加しました。これを false(デフォルトは true)に設定すると、ファイルパスからパーティション値が省略されます。
Iceberg はファイルパスにこれらの値を必要としないため、この値を false に設定することでキーサイズをさらに削減できます。
この場合、エントロピーの最後の 8 ビットがファイル名に直接追加されます。この設定で挿入されるキーは以下のようになります。
category=orders
が削除されていることに注意してください。
s3://my-table-data-bucket/my_ns.db/my_table/1101/0100/1011/00111010-00000-0-5affc076-96a4-48f2-9cd2-d5efbc9f0c94-00001.parquet
S3 スロットリングが発生したワークロードは、S3 が自動的にスケールしている間、指数バックオフを用いて継続的に再試行することで処理を続行する必要があります。 この目的のために、S3 の再試行回数を調整するための設定を以下に用意しています。 スロットリングが発生し、再試行回数の上限に達して失敗するワークロードの場合は、S3 が自動スケールできるように再試行回数を 32 に設定することをお勧めします。 ただし、S3 がまだスケールしていないテーブルに対して非常に高いスループットを実行するワークロードの場合は、再試行回数をさらに増やす必要がある場合があります。
プロパティ | デフォルト | 説明 |
---|---|---|
s3.retry.num-retries | 5 | S3 操作を再試行する回数。高スループットのワークロードの場合は 32 が推奨されます。 |
s3.retry.min-wait-ms | 2秒 | S3 操作を再試行するための最小待機時間 |
s3.retry.max-wait-ms | 20秒 | S3 読み取り操作を再試行するまでの最大待機時間 |
2020年11月、S3はすべての読み取り操作に対して強力な一貫性を実現すると発表しました。 Icebergはこの機能を最大限に活用できるようにアップデートされました。 IO操作中にパフォーマンスに悪影響を与える可能性のある、冗長な一貫性の待機とチェックは行われません。
S3FileIO
が導入される前は、多くのIcebergユーザーがHadoopFileIOを使用してS3Aファイルシステム経由でS3にデータを書き込んでいました。
前のセクションで紹介したように、S3FileIO
は最新のAWSクライアントとS3の機能を採用しており、セキュリティとパフォーマンスが最適化されているため、S3のユースケースにはS3AファイルシステムよりもS3FileIO
が推奨されます。
S3FileIOはs3://
URIスキームでデータを書き込みますが、S3Aファイルシステムで記述されたスキームとも互換性があります。
つまり、s3a://
または s3n://
のファイルパスを含むテーブルマニフェストであっても、S3FileIOはそれらを読み取ることができます。
この機能により、S3AからS3FileIO
への切り替えが簡単になります。
何らかの理由で S3A を使用する必要がある場合は、次の手順に従ってください。
- S3Aを使用してデータを保存するには、ウェアハウスカタログプロパティをS3Aパスに指定します(例:
s3a://my-bucket/my-warehouse
) - HiveCatalog の場合、S3A を使用してメタデータも保存するには、Hadoop 構成プロパティ
hive.metastore.warehouse.dir
を S3A パスとして指定します。 - コンピューティング エンジンのランタイム依存関係として hadoop-aws を追加します。
- hadoop-aws ドキュメントに基づいて AWS 設定を構成します (バージョンを確認してください。S3A 構成は使用するバージョンによって大きく異なります)。
アップロードされたオブジェクトの整合性を確保するため、カタログプロパティ s3.checksum-enabled
を true に設定することで、S3 への書き込み時のチェックサム検証を有効にすることができます。
これはデフォルトでは無効になっています。
S3オブジェクトの書き込み時および削除時にカスタムタグを追加できます。 例えば、Spark 3.5でS3タグを書き込むには、Spark SQLシェルを次のように起動します。
spark-sql --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.my_catalog.warehouse=s3://my-bucket/my/key/prefix \
--conf spark.sql.catalog.my_catalog.type=glue \
--conf spark.sql.catalog.my_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO \
--conf spark.sql.catalog.my_catalog.s3.write.tags.my_key1=my_val1 \
--conf spark.sql.catalog.my_catalog.s3.write.tags.my_key2=my_val2
上記の例では、S3 内のオブジェクトは my_key1=my_val1
および my_key2=my_val2
というタグ付きで保存されます。
指定された書き込みタグはオブジェクトの作成時にのみ保存されることに注意してください。
カタログプロパティ s3.delete-enabled
が false
に設定されている場合、オブジェクトは S3 から物理的に削除されません。
これは S3 の削除タグと組み合わせて使用されることが想定されており、オブジェクトは S3 ライフサイクルポリシーに基づいてタグ付けされ、削除されます。このプロパティはデフォルトで true
に設定されています。
s3.delete.tags
設定を使用すると、オブジェクトは削除前に設定されたキーと値のペアでタグ付けされます。
ユーザーはバケットレベルでタグベースのオブジェクトライフサイクルポリシーを設定し、オブジェクトを別の階層に移行できます。
例えば、Spark 3.5 で S3 削除タグを追加するには、Spark SQL シェルを次のように起動します。
sh spark-sql --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.my_catalog.warehouse=s3://iceberg-warehouse/s3-tagging \
--conf spark.sql.catalog.my_catalog.type=glue \
--conf spark.sql.catalog.my_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO \
--conf spark.sql.catalog.my_catalog.s3.delete.tags.my_key3=my_val3 \
--conf spark.sql.catalog.my_catalog.s3.delete-enabled=false
上記の例では、S3内のオブジェクトは削除前にmy_key3=my_val3
というタグ付きで保存されます。
ユーザーは、カタログプロパティs3.delete.num-threads
を使用して、S3オブジェクトに削除タグを追加するために使用するスレッド数を指定することもできます。
カタログプロパティ s3.write.table-tag-enabled
と s3.write.namespace-tag-enabled
が true
に設定されている場合、S3 内のオブジェクトはタグ iceberg.table=<table-name>
と iceberg.namespace=<namespace-name>
とともに保存されます。
ユーザーはこれらのタグに基づいて、名前空間またはテーブルごとにアクセスポリシーとデータ保持ポリシーを定義できます。
例えば、Spark 3.5 でテーブル名と名前空間名を S3 タグとして書き込むには、Spark SQL シェルを次のように起動します。
sh spark-sql --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.my_catalog.warehouse=s3://iceberg-warehouse/s3-tagging \
--conf spark.sql.catalog.my_catalog.type=glue \
--conf spark.sql.catalog.my_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO \
--conf spark.sql.catalog.my_catalog.s3.write.table-tag-enabled=true \
--conf spark.sql.catalog.my_catalog.s3.write.namespace-tag-enabled=true
タグ制限の詳細については、ユーザー定義のタグ制限を参照してください。
アクセスポイントは、バケットとアクセスポイントのマッピングを指定することで、S3 操作を実行するために使用できます。 これは、マルチリージョンアクセス、クロスリージョンアクセス、災害復旧などに役立ちます。
クロスリージョン アクセス ポイントを使用する場合は、S3FileIO がクロスリージョン呼び出しを行えるように、さらに use-arn-region-enabled
カタログ プロパティを true に設定する必要があります。
これは、同じ / マルチリージョン アクセス ポイントでは必要ありません。
たとえば、Spark 3.5 で S3 アクセス ポイントを使用するには、次のコマンドで Spark SQL シェルを起動します。
spark-sql --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.my_catalog.warehouse=s3://my-bucket2/my/key/prefix \
--conf spark.sql.catalog.my_catalog.type=glue \
--conf spark.sql.catalog.my_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO \
--conf spark.sql.catalog.my_catalog.s3.use-arn-region-enabled=false \
--conf spark.sql.catalog.my_catalog.s3.access-points.my-bucket1=arn:aws:s3::<ACCOUNT_ID>:accesspoint/<MRAP_ALIAS> \
--conf spark.sql.catalog.my_catalog.s3.access-points.my-bucket2=arn:aws:s3::<ACCOUNT_ID>:accesspoint/<MRAP_ALIAS>
または上記の例では、my-bucket1
および my-bucket2
バケットの S3 内のオブジェクトは、すべての S3 操作に arn:aws:s3::<ACCOUNT_ID>:accesspoint/<MRAP_ALIAS>
アクセス ポイントを使用します。
アクセスポイントの使用の詳細については、互換性のある Amazon S3 操作でのアクセスポイントの使用、サンプルノートブック を参照してください。
S3 アクセスグラントを使用すると、IAM プリンシパルを使用して S3 データへのアクセスを許可できます。Iceberg で S3 アクセスグラントを有効にするには、S3 アクセスグラントプラグインの jar をクラスパスに追加した後、s3.access-grants.enabled カタログプロパティを true に設定します。 このプラグインの Maven リストへのリンクは、こちらにあります。
さらに、S3 アクセスグラントが S3 呼び出しを承認できない場合に、IAM ロール(およびその権限セットを直接)を使用して S3 データにアクセスできるようにする fallback-to-IAM 設定もサポートしています。 これは、s3.access-grants.fallback-to-iam ブール型カタログプロパティを使用して実行できます。デフォルトでは、このプロパティは false に設定されています。
たとえば、Spark 3.5 に S3 アクセスグラント統合を追加するには、次のコマンドで Spark SQL シェルを起動します。
spark-sql --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.my_catalog.warehouse=s3://my-bucket2/my/key/prefix \
--conf spark.sql.catalog.my_catalog.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog \
--conf spark.sql.catalog.my_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO \
--conf spark.sql.catalog.my_catalog.s3.access-grants.enabled=true \
--conf spark.sql.catalog.my_catalog.s3.access-grants.fallback-to-iam=true
S3 Access Grants の使用の詳細については、S3 Access Grants によるアクセスの管理を参照してください。
S3クロスリージョンバケットアクセスは、カタログプロパティs3.cross-region-access-enabled
をtrue
に設定することで有効化できます。
最初のS3 API呼び出しによるレイテンシの増加を避けるため、デフォルトでは無効になっています。
たとえば、Spark 3.5 で S3 クロスリージョン バケット アクセスを有効にするには、次のコマンドで Spark SQL シェルを起動します。
spark-sql --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.my_catalog.warehouse=s3://my-bucket2/my/key/prefix \
--conf spark.sql.catalog.my_catalog.type=glue \
--conf spark.sql.catalog.my_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO \
--conf spark.sql.catalog.my_catalog.s3.cross-region-access-enabled=true
詳細については、Amazon S3 のクロスリージョンアクセスを参照してください。
S3 アクセラレーションを使用すると、Amazon S3 との間の転送速度を最大 50~500% 向上させることができます。 これは、大容量オブジェクトの長距離転送に有効です。
S3 アクセラレーションを使用するには、カタログプロパティ s3.acceleration-enabled
を true
に設定し、S3FileIO が高速化された S3 呼び出しを実行できるようにする必要があります。
たとえば、Spark 3.5 で S3 アクセラレーションを使用するには、次のコマンドで Spark SQL シェルを起動します。
spark-sql --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.my_catalog.warehouse=s3://my-bucket2/my/key/prefix \
--conf spark.sql.catalog.my_catalog.type=glue \
--conf spark.sql.catalog.my_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO \
--conf spark.sql.catalog.my_catalog.s3.acceleration-enabled=true
S3 アクセラレーションの使用に関する詳細については、Amazon S3 Transfer Acceleration を使用した高速で安全なファイル転送の構成を参照してください。
Amazon S3 向け Analytics Accelerator Library は、アプリケーションから Amazon S3 データへのアクセスを高速化します。 このオープンソースソリューションは、データ分析ワークロードの処理時間とコンピューティングコストを削減します。
S3 Analytics Accelerator Library を Iceberg で動作させるには、s3.analytics-accelerator.enabled
カタログプロパティを true に設定します。
デフォルトでは、このプロパティは false に設定されています。
例えば、S3 Analytics Accelerator を Spark で使用するには、次のコマンドで Spark SQL シェルを起動します。
spark-sql --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.my_catalog.warehouse=s3://my-bucket2/my/key/prefix \
--conf spark.sql.catalog.my_catalog.type=glue \
--conf spark.sql.catalog.my_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO \
--conf spark.sql.catalog.my_catalog.s3.analytics-accelerator.enabled=true
Analytics Accelerator Libraryは、S3 CRTクライアントまたはS3AsyncClientのいずれかで動作します。 ライブラリでは、接続プール管理が強化され、ダウンロード時のスループットが向上するため、S3 CRTクライアントの使用を推奨しています。
プロパティ | デフォルト | 説明 |
---|---|---|
s3.crt.enabled | true | S3 非同期クライアントを CRT を使用して作成するかどうかを制御します |
s3.crt.max-concurrency | 500 | S3 CRT クライアントの最大同時実行数 |
追加のライブラリ固有の構成は、次のセクションに分類されます。
プロパティ | デフォルト | 説明 |
---|---|---|
s3.analytics-accelerator.logicalio.prefetch.footer.enabled | true | フッターのプリフェッチを有効にするかどうかを制御します |
s3.analytics-accelerator.logicalio.prefetch.page.index.enabled | true | ページインデックスのプリフェッチを有効にするかどうかを制御します |
s3.analytics-accelerator.logicalio.prefetch.file.metadata.size | 32KB | 通常のファイルのプリフェッチするメタデータのサイズ |
s3.analytics-accelerator.logicalio.prefetch.large.file.metadata.size | 1MB | 大きなファイルのプリフェッチするメタデータのサイズ |
s3.analytics-accelerator.logicalio.prefetch.file.page.index.size | 1MB | 通常ファイルのプリフェッチするページインデックスのサイズ |
s3.analytics-accelerator.logicalio.prefetch.large.file.page.index.size | 8MB | 大きなファイルのプリフェッチするページインデックスのサイズ |
s3.analytics-accelerator.logicalio.large.file.size | 1GB | ファイルを大きいとみなすしきい値 |
s3.analytics-accelerator.logicalio.small.objects.prefetching.enabled | true | 小さなオブジェクトのプリフェッチを制御する |
s3.analytics-accelerator.logicalio.small.object.size.threshold | 3MB | 小さなオブジェクトのプリフェッチのサイズしきい値 |
s3.analytics-accelerator.logicalio.parquet.metadata.store.size | 45 | parquetメタデータストアのサイズ |
s3.analytics-accelerator.logicalio.max.column.access.store.size | 15 | 列アクセスストアの最大サイズ |
s3.analytics-accelerator.logicalio.parquet.format.selector.regex | ^.*.(parquet|par)$ |
parquet ファイルを識別するための正規表現パターン |
s3.analytics-accelerator.logicalio.prefetching.mode | ROW_GROUP | リフェッチ モード (有効な値: OFF、ALL、ROW_GROUP、COLUMN_BOUND) |
プロパティ | デフォルト | 説明 |
---|---|---|
s3.analytics-accelerator.physicalio.metadatastore.capacity | 50 | メタデータストアの容量 |
s3.analytics-accelerator.physicalio.blocksizebytes | 8MB | データ転送時のブロックサイズ |
s3.analytics-accelerator.physicalio.readaheadbytes | 64KB | 先読みするバイト数 |
s3.analytics-accelerator.physicalio.maxrangesizebytes | 8MB | 範囲リクエストの最大サイズ |
s3.analytics-accelerator.physicalio.partsizebytes | 8MB | 転送用の個々のパートサイズ |
s3.analytics-accelerator.physicalio.sequentialprefetch.base | 2.0 | 順次プリフェッチの基本係数 |
s3.analytics-accelerator.physicalio.sequentialprefetch.speed | 1.0 | 順次プリフェッチの増加速度係数 |
Property | Default | 説明 |
---|---|---|
s3.analytics-accelerator.telemetry.level | STANDARD | テレメトリの詳細レベル(有効な値:CRITICAL、STANDARD、VERBOSE) |
s3.analytics-accelerator.telemetry.std.out.enabled | false | 標準出力へのテレメトリ出力を有効にするか |
s3.analytics-accelerator.telemetry.logging.enabled | true | ログ出力によるテレメトリを有効にするか |
s3.analytics-accelerator.telemetry.aggregations.enabled | false | テレメトリの集計を有効にするか |
s3.analytics-accelerator.telemetry.aggregations.flush.interval.seconds | -1 | 集計されたテレメトリをフラッシュする間隔(秒) |
s3.analytics-accelerator.telemetry.logging.level | INFO | テレメトリのログレベル |
s3.analytics-accelerator.telemetry.logging.name | com.amazon.connector.s3.telemetry | テレメトリ用ロガーの名前 |
s3.analytics-accelerator.telemetry.format | default | テレメトリ出力形式(有効な値:json、default) |
Property | Default | 説明 |
---|---|---|
s3.analytics-accelerator.useragentprefix | null | S3 リクエストの User-Agent 文字列に追加するカスタムプレフィックス |
S3 デュアルスタックを使用すると、クライアントはデュアルスタックエンドポイントを介して S3 バケットにアクセスできます。 クライアントがデュアルスタックエンドポイントをリクエストすると、バケット URL は可能な場合は IPv6 アドレスに解決され、そうでない場合は IPv4 にフォールバックします。
S3 デュアルスタックを使用するには、s3.dualstack-enabled
カタログプロパティを true
に設定して、S3FileIO
がデュアルスタック S3 呼び出しを行うようにする必要があります。
例えば、Spark 3.5 で S3 デュアルスタックを使用するには、次のコマンドで Spark SQL シェルを起動します。
spark-sql --conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.my_catalog.warehouse=s3://my-bucket2/my/key/prefix \
--conf spark.sql.catalog.my_catalog.type=glue \
--conf spark.sql.catalog.my_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO \
--conf spark.sql.catalog.my_catalog.s3.dualstack-enabled=true
S3 デュアルスタックの使用の詳細については、AWS CLI および AWS SDK からのデュアルスタックエンドポイントの使用を参照してください。
多くの組織では、独自の認証情報プロバイダー、アクセス プロキシ、再試行戦略などを使用して AWS クライアントの構成方法をカスタマイズしています。
Iceberg では、client.factory
カタログ プロパティを設定することで、ユーザーが org.apache.iceberg.aws.AwsClientFactory
の独自の実装をプラグインできます。
組織では、GlueメタストアとS3バケット用に一元化されたAWSアカウントを持ち、各チームがそれぞれのリソースにアクセスするために異なるAWSアカウントとリージョンを使用するというユースケースが一般的です。
この場合、これらの一元化されたリソースにアクセスするには、クロスアカウントIAMロールが必要です。
Icebergは、この一般的なユースケースをサポートするために、AWSクライアントファクトリーAssumeRoleAwsClientFactory
を提供しています。
これは、独自のAWSクライアントファクトリーを実装したいユーザーにとってのサンプルとしても役立ちます。
このクライアント ファクトリには、次の構成可能なカタログ プロパティがあります。
Property | Default | 説明 |
---|---|---|
client.assume-role.arn | null(ユーザー入力が必要) | 引き受けるロールの ARN(例:arn:aws:iam::123456789:role/myRoleToAssume) |
client.assume-role.region | null(ユーザー入力が必要) | デフォルトのリージョンチェインの代わりに、STS クライアント以外のすべての AWS クライアントが使用するリージョン |
client.assume-role.external-id | null | 任意の外部 ID |
client.assume-role.timeout-sec | 1 hour | 各ロール引き受けセッションのタイムアウト。タイムアウト後、新しいロールセッションクレデンシャルが STS クライアント経由で取得される |
このクライアントファクトリーを使用することで、STSクライアントはデフォルトの認証情報とリージョンで初期化され、指定されたロールを引き受けます。その後、Glue、S3、DynamoDBクライアントは、リソースにアクセスするために、assume-role認証情報とリージョンで初期化されます。このクライアントファクトリーを使用してSparkシェルを起動する例を以下に示します。
spark-sql --packages org.apache.iceberg:iceberg-spark-runtime-3.4_2.12:1.8.1,org.apache.iceberg:iceberg-aws-bundle:1.8.1 \
--conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.my_catalog.warehouse=s3://my-bucket/my/key/prefix \
--conf spark.sql.catalog.my_catalog.type=glue \
--conf spark.sql.catalog.my_catalog.client.factory=org.apache.iceberg.aws.AssumeRoleAwsClientFactory \
--conf spark.sql.catalog.my_catalog.client.assume-role.arn=arn:aws:iam::123456789:role/myRoleToAssume \
--conf spark.sql.catalog.my_catalog.client.assume-role.region=ap-northeast-1
AWS クライアントは、URL 接続 HTTP クライアントと Apache HTTP クライアントの 2 種類の HTTP クライアントをサポートしています。 デフォルトでは、AWS クライアントは Apache HTTP クライアントを使用してサービスと通信します。 この HTTP クライアントは、expect-continue ハンドシェイクや TCP KeepAlive などの様々な機能とカスタマイズ設定をサポートしていますが、追加の依存関係と起動レイテンシが発生します。 一方、URL 接続 HTTP クライアントは、依存関係と起動レイテンシを最小限に抑えるように最適化されていますが、他の実装よりもサポートされる機能は少なくなります。
設定の詳細については、「URL 接続 HTTP クライアント設定」および「Apache HTTP クライアント設定」のセクションを参照してください。
HTTPクライアントの設定はカタログプロパティから設定できます。利用可能な設定の概要は以下のとおりです。
Property | Default | 説明 |
---|---|---|
http-client.type | apache | HTTP クライアントの種類。 urlconnection: URL Connection HTTP クライアント apache: Apache HTTP クライアント |
http-client.proxy-endpoint | null | HTTP クライアントで使用するオプションのプロキシエンドポイント |
URL 接続 HTTP クライアントには、次の構成可能なプロパティがあります。
Property | Default | 説明 |
---|---|---|
http-client.urlconnection.socket-timeout-ms | null | オプションのソケットタイムアウト(ミリ秒単位) |
http-client.urlconnection.connection-timeout-ms | null | オプションのコネクションタイムアウト(ミリ秒単位) |
ユーザーはカタログプロパティを使用してデフォルトを上書きできます。例えば、Sparkシェルの起動時にURL接続HTTPクライアントのソケットタイムアウトを設定するには、以下を追加します。
--conf spark.sql.catalog.my_catalog.http-client.urlconnection.socket-timeout-ms=80
Apache HTTP クライアントには、次の構成可能なプロパティがあります。
Property | Default | 説明 |
---|---|---|
http-client.apache.socket-timeout-ms | null | オプションのソケットタイムアウト(ミリ秒単位) |
http-client.apache.connection-timeout-ms | null | オプションのコネクションタイムアウト(ミリ秒単位) |
http-client.apache.connection-acquisition-timeout-ms | null | オプションのコネクション取得タイムアウト(ミリ秒単位) |
http-client.apache.connection-max-idle-time-ms | null | オプションの接続の最大アイドル時間(ミリ秒単位) |
http-client.apache.connection-time-to-live-ms | null | オプションの接続の有効期間(ミリ秒単位) |
http-client.apache.expect-continue-enabled | null(デフォルトでは無効) | expect continue を有効にするかを制御する true/false のオプション設定 |
http-client.apache.max-connections | null | 最大接続数のオプション設定(整数) |
http-client.apache.tcp-keep-alive-enabled | null(デフォルトでは無効) | TCP keep alive を有効にするかを制御する true/false のオプション設定 |
http-client.apache.use-idle-connection-reaper-enabled | null(デフォルトでは有効) | アイドル接続リーパーを使用するかを制御する true/false のオプション設定 |
ユーザーはカタログプロパティを使用してデフォルトを上書きできます。例えば、Sparkシェルの起動時にApache HTTPクライアントの最大接続数を設定するには、以下を追加します。
--conf spark.sql.catalog.my_catalog.http-client.apache.max-connections=5
Amazon Athena は、Iceberg テーブルに対する読み取り、書き込み、更新、最適化タスクを実行できるサーバーレスクエリエンジンを提供します。詳細については、こちらをご覧ください。
Amazon EMR は、Spark (Spark 3 の場合は EMR 6、Spark 2 の場合は EMR 5)、Hive、Flink、Trino を搭載したクラスターをプロビジョニングし、Iceberg を実行できます。
EMR バージョン 6.5.0 以降では、ブートストラップアクションを必要とせずに、必要な Apache Iceberg の依存関係がインストールされるように EMR クラスターを設定できます。Iceberg がインストールされたクラスターの作成方法については、公式ドキュメントを参照してください。
6.5.0 より前のバージョンでは、次のようなブートストラップアクションを使用して、必要なすべての依存関係を事前にインストールできます。
#!/bin/bash
ICEBERG_VERSION=1.8.1
MAVEN_URL=https://repo1.maven.org/maven2
ICEBERG_MAVEN_URL=$MAVEN_URL/org/apache/iceberg
# NOTE: this is just an example shared class path between Spark and Flink,
# please choose a proper class path for production.
LIB_PATH=/usr/share/aws/aws-java-sdk/
ICEBERG_PACKAGES=(
"iceberg-spark-runtime-3.5_2.12"
"iceberg-flink-runtime"
"iceberg-aws-bundle"
)
install_dependencies () {
install_path=$1
download_url=$2
version=$3
shift
pkgs=("$@")
for pkg in "${pkgs[@]}"; do
sudo wget -P $install_path $download_url/$pkg/$version/$pkg-$version.jar
done
}
install_dependencies $LIB_PATH $ICEBERG_MAVEN_URL $ICEBERG_VERSION "${ICEBERG_PACKAGES[@]}"
AWS Glue は、Iceberg テーブルに対する読み取り、書き込み、更新タスクを実行できるサーバーレスデータ統合サービスを提供します。 詳細はこちらをご覧ください。
AWS Elastic Kubernetes Service (EKS) を使用すると、Spark、Flink、Hive、Presto、Trino などのクラスターを起動して Iceberg と連携させることができます。Docker と Kubernetes で Iceberg を実行する方法に関するチュートリアルは、Iceberg のブログページをご覧ください。
Amazon Kinesis Data Analytics は、フルマネージドの Apache Flink アプリケーションを実行するためのプラットフォームを提供します。Iceberg をアプリケーション Jar に組み込み、プラットフォーム内で実行できます。
AWS Redshift Spectrum または Redshift Serverless は、AWS Glue データカタログにカタログ化された Apache Iceberg テーブルのクエリをサポートしています。
Firehose を使用すると、ストリーミングデータを Amazon S3 の Apache Iceberg テーブルに直接配信できます。 この機能を使用すると、単一のストリームから複数の Apache Iceberg テーブルにレコードをルーティングし、Apache Iceberg テーブル内のレコードに対して挿入、更新、削除操作を自動的に適用できます。 この機能を使用するには、AWS Glue データカタログを使用する必要があります。