Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Amazon S3 TablesとTable Bucketsで分析基盤をシンプルに

By DoiTFeb 5, 20254 min read

このページはEnglishDeutschEspañolFrançaisItalianoPortuguêsでもご覧いただけます。

AWS re:Invent 2024で、分析workloads向けに最適化されたフルマネージドのApache Icebergテーブルを提供するAmazon S3 Tablesが発表されました。Iceberg形式のマネージドストレージをs3tables APIで管理でき、データ操作はApache SparkやAWSの分析サービス(Amazon EMR、Amazon Athena、Amazon Redshift、Amazon EMR、Amazon QuickSight、Amazon Data Firehose)と連携できます。

はじめに、コンソールまたはAWS CLIでテーブルバケットを作成します。作成時に、上記のAWS分析サービスとの統合を有効化するオプションを選べます。

S3 Table bucketコンソール

テーブルバケットを作成したら、続いてネームスペース(複数のテーブルをまとめる論理的なデータベースのようなもの)を作成し、その中にテーブルを配置します。

aws s3tables create-namespace \
--table-bucket-arn arn:aws:s3tables:us-east-1:111122223333:bucket/my-s3-table-bucket \
--namespace my_first_namespace
aws s3tables create-table \
--table-bucket-arn arn:aws:s3tables:us-east-1:111122223333:bucket/my-s3-table-bucket \
--namespace my_first_namespace \
--name my_first_table --format ICEBERG

テーブルバケットコンソールで作成されたテーブル

テーブル形式はApache Icebergフレームワークに準拠し、基盤となるストレージにはテーブルデータとメタデータの両方が格納されます。S3 Tablesではテーブルメンテナンスを意識する必要はなく、Amazon S3がメンテナンス機能を提供し、S3 Tablesやテーブルバケットのパフォーマンスを最適化します。メンテナンス項目はファイルコンパクション、スナップショット管理、未参照ファイルの削除の3種類で、いずれもデフォルトで有効です。メンテナンス設定ファイルから編集や無効化が可能なほか、メンテナンスジョブのパラメータを設定して運用に合わせて調整することもできます。ジョブのステータスはs3tables APIで確認可能です。

aws s3tables get-table-maintenance-job-status \
--table-bucket-arn="arn:aws:s3tables:us-east-1:111122223333:bucket/my-s3-table-bucket" \
--namespace="mynamespace" \
--name="testtable"

S3 Tablesを分析サービスと統合する前に、前提条件のステップを完了させておきましょう。

S3 Tables用の新しいカタログを作成します。

aws glue create-catalog --region us-east-1 --name s3tablescatalog --catalog-input '{ "CreateDatabaseDefaultPermissions":[], "CreateTableDefaultPermissions":[], "FederatedCatalog":{ "Identifier":"arn:aws:s3tables:us-east-1:111122223333:bucket/*", "ConnectionName":"aws:s3tables"} }'

このカタログはAWS LakeFormationに登録されます。先ほど作成したネームスペースとテーブルもLakeFormationコンソールから確認できます(ドロップダウンで作成済みのS3テーブルカタログを選択してください)。

ここからが本題です。S3 TablesをAWSサービスと連携していきましょう。まずはAmazon EMRで、Apache Sparkを有効にしたIceberg対応のEMRクラスターをプロビジョニングします。続いてSSHでクラスターのプライマリノードにログインします。

spark-shellを起動します。

spark-shell \
--packages software.amazon.s3tables:s3-tables-catalog-for-iceberg-runtime:0.1.3 \
--conf spark.sql.catalog.s3tablesbucket=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.s3tablesbucket.catalog-impl=software.amazon.s3tables.iceberg.S3TablesCatalog \
--conf spark.sql.catalog.s3tablesbucket.warehouse=arn:aws:s3tables:us-east-1:111122223333:bucket/my-s3-table-bucket \
--conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions

EMRプライマリノードでのSpark-shell

統合の前提条件を満たしているかを必ず確認してください。Amazon EMRの場合、``AmazonS3TablesFullAccessポリシーをEMR_EC2_DefaultRoleにアタッチし、さらにEMR_EC2_DefaultRoleへカタログ・ネームスペース・テーブルレベルのLakeFormation権限を適切に付与する必要があります。

spark.sql("CREATE NAMESPACE IF NOT EXISTS s3tablesbucket.my_first_namespace")
spark.sql(
""" CREATE TABLE IF NOT EXISTS s3tablesbucket.my_first_namespace.`example_table` (
id INT,
name STRING,
value INT
)
USING iceberg """
)
spark.sql(
"""
INSERT INTO s3tablesbucket.my_first_namespace.example_table
VALUES
(1, 'ABC', 100),
(2, 'XYZ', 200)
""")
spark.sql(""" SELECT * FROM s3tablesbucket.my_first_namespace.example_table """).show()

テーブルバケット用に新しいネームスペースを作成

ネームスペース内にテーブルバケットベースのテーブルを作成

テーブルへのクエリ

S3にサンプルのparquetデータがあれば、それを読み込んでS3テーブルを作成し、クエリを実行することもできます。

#Read the parequet file
val data_file = spark.read.parquet("s3://myBucket/prefix1/file.parquet")
#Create a new table
data_file.writeTo("s3tablesbucket.my_first_namespace.my_table").using("Iceberg").tableProperty ("format-version", "2").createOrReplace()
#Query the table we created
spark.sql(""" SELECT * FROM s3tablesbucket.my_first_namespace.my_table """).show()

では、このテーブルをAmazon Athenaと連携してみましょう。S3 Tables用のカタログを作成済みのため、Athenaコンソールの「データソースとカタログ」に表示され、エディター内のドロップダウンからS3テーブルを選択できます。

あとはAthenaのネイティブなGlueカタログテーブルと同じ感覚で、これらのテーブルにクエリを実行できます。

なお、S3 TablesはS3側で管理されるため、基盤となるS3データの場所には直接アクセスできず、Amazon Athenaベースのテーブルに対するIcebergテーブルメタデータのクエリのようにマニフェストファイルを照会することはできない点にご注意ください。

Amazon S3 Tablesを使うと、読み取りパフォーマンスを最適化するためにparquet形式で保存されたS3上のデータに対して、論理テーブルを作成できます。これらのテーブルはIceberg形式に基づいており、ACIDトランザクションに加えて、更新・削除・挿入や、データに対するタイムトラベルクエリにも対応します。これらをすべてAmazon S3が管理してくれるため、S3ならではの耐久性・スケーラビリティ・パフォーマンスもそのまま享受できます。

さらに詳しく知りたい方や、当社のサービスにご関心をお持ちの方は、お気軽にお問い合わせください。お問い合わせはこちらから。

[] Amazon S3 Tablesとテーブルバケットの活用