Amazon Web Services ブログ

Amazon S3 の新しいテーブル: 分析ワークロードのために最適化されたストレージ

Amazon S3 テーブルは、日々の購入取引、ストリーミングセンサーデータ、Apache Iceberg 形式の広告インプレッションなどの表形式データのために最適化されたストレージを提供します。これを使用することで、Amazon AthenaAmazon EMRApache Spark などの一般的なクエリエンジンを使用して簡単にクエリを実行できます。セルフマネージドテーブルストレージと比較すると、クエリパフォーマンスが最大 3 倍高速になり、1 秒あたりのトランザクション数が最大 10 倍になるほか、フルマネージドサービスを使用する場合に不可欠な運用効率の向上も期待できます。

Iceberg は Parquet ファイルを管理するための極めて一般的な方法となっており、何千もの AWS のお客様が Iceberg を使用して、PB または EB 規模のデータを含む数十億のファイルに対してクエリを実行しています。

テーブルバケット、テーブル、および名前空間
テーブルバケットは、既存の汎用およびディレクトリバケットに続く 3 つ目のタイプの S3 バケットです。テーブルバケットは、さまざまなスキーマを持つ Iceberg テーブルを保存できる分析ウェアハウスと考えることができます。さらに、S3 テーブルは S3 自体と同じ耐久性、可用性、スケーラビリティ、およびパフォーマンスの特性を提供するとともに、ストレージを自動的に最適化してクエリパフォーマンスを最大化し、コストを最小限に抑えます。

各テーブルバケットは特定の AWS リージョンに存在し、リージョンに関して AWS アカウント内で一意でなければならない名前を持ちます。バケットは ARN によって参照され、リソースポリシーも持っています。最後に、各バケットは名前空間を使用して、バケット内のテーブルを論理的にグループ化します。

テーブルは、テーブルバケットに保存される構造化データセットです。テーブルバケットと同様に、テーブルには ARN とリソースポリシーがあり、バケットの名前空間の 1 つの中に存在します。テーブルは完全に管理されており、圧縮、古いスナップショットの管理、参照されていないファイルの削除など、自動、設定可能、継続的なメンテナンスが行われます。各テーブルには、ストレージオペレーションのための S3 API エンドポイントがあります。

アクセス管理を簡素化するために、アクセスポリシーから名前空間を参照できます。

コマンドラインからのバケットとテーブル
では、早速バケットを作成して、その中に 1 つまたは 2 つのテーブルを配置してみましょう。ここでは AWS コマンドラインインターフェイス (AWS CLI) を使用しますが、AWS マネジメントコンソールと API サポートも使用できます。簡潔にするために、より詳細なコマンドの出力を jq を通じてパイプし、最も関連性の高い値のみを表示します。

最初のステップは、テーブルバケットを作成することです:

$ aws s3tables create-table-bucket --name jbarr-table-bucket-2 | jq .arn
"arn:aws:s3tables:us-east-2:123456789012:bucket/jbarr-table-bucket-2"

便宜上、テーブルバケットの ARN を使用して環境変数を作成します:

$ export ARN="arn:aws:s3tables:us-east-2:123456789012:bucket/jbarr-table-bucket-2"

その後、テーブルバケットを一覧表示します:

$ aws s3tables list-table-buckets | jq .tableBuckets[].arn
"arn:aws:s3tables:us-east-2:123456789012:bucket/jbarr-table-bucket-1"
"arn:aws:s3tables:us-east-2:123456789012:bucket/jbarr-table-bucket-2"

さまざまな方法でテーブルにアクセスし、データを取り込むことができます。テストの目的で、Apache Spark をインストールしてから、コマンドライン引数を使用して Spark シェルを呼び出し、Amazon S3 Tables Catalog for Apache Iceberg パッケージを使用して、mytablebucket をテーブルの ARN に設定しました。

テーブルをグループ化するために使用する名前空間 (mydata) を作成します:

scala> spark.sql("""CREATE NAMESPACE IF NOT EXISTS mytablebucket.mydata""")

それから、シンプルな Iceberg テーブルを名前空間に作成します:

spark.sql("""CREATE TABLE IF NOT EXISTS mytablebucket.mydata.table1
 (id INT,
  name STRING,
  value INT)
  USING iceberg
  """)

いくつかの s3tables コマンドを使用して、作業内容を確認します:

$ aws s3tables list-namespaces --table-bucket-arn $ARN | jq .namespaces[].namespace[] 
"mydata"
$
$ aws s3tables list-tables --table-bucket-arn $ARN | jq .tables[].name
"table1"

その後、Spark シェルに戻り、テーブルに数行のデータを追加します:

spark.sql("""INSERT INTO mytablebucket.mydata.table1
  VALUES
  (1, 'Jeff', 100),
  (2, 'Carmen', 200),
  (3, 'Stephen', 300),
  (4, 'Andy', 400),
  (5, 'Tina', 500),
  (6, 'Bianca', 600),
  (7, 'Grace', 700)
  """)

コンソールからのバケットとテーブル
また、S3 コンソールを使用してテーブルバケットを作成し、操作することもできます。使用を開始するには、[テーブルバケット] をクリックします:

最初のバケットを作成する前に、Amazon AthenaAmazon RedshiftAmazon EMR、および他の AWS クエリエンジンからテーブルバケットにアクセスできるように、[統合を有効にする] をクリックします (今ではなく、後で行うこともできます):

細字部分を読んで [統合を有効にする] をクリックし、指定された IAM ロールと AWS Glue データカタログのエントリを作成します。

数秒後に統合が有効になり、[テーブルバケットを作成] をクリックして続行します。

名前 (jbarr-table-bucket-3) を入力し、[テーブルバケットを作成] をクリックします。

ここから、CLI セクションで前述したようにテーブルを作成して使用できます。

テーブルのメンテナンス
テーブルバケットは、お客様が独自の Iceberg テーブルを作成して管理する場合にお客様が実行する重要なメンテナンス作業の一部を実行します。お客様がこれらの作業から解放され、テーブルにより多くの時間を費やせるように、次のメンテナンスオペレーションが自動的に実行されます:

圧縮 – このプロセスは、64 MiB~512 MiB の範囲で設定できるターゲットファイルサイズになるように、複数の小さなテーブルオブジェクトを 1 つの大きなオブジェクトに結合してクエリパフォーマンスを改善します。新しいオブジェクトは新しいスナップショットとして書き換えられます。

スナップショット管理 – このプロセスは、保持するスナップショットの最小数と保持するスナップショットの最大存続期間の設定オプションを使用して、テーブルスナップショットを期限切れにし、最終的に削除します。期限切れになったスナップショットは非最新としてマークされ、指定した日数が経過すると削除されます。

参照されていないファイルの削除 – このプロセスは、どのテーブルスナップショットによっても参照されていないオブジェクトを削除します。

知っておくべきこと
テーブルバケットとテーブルについて知っておくべき重要な点がいくつかあります:

AWS 統合 – S3 テーブルと AWS Glue データカタログの統合は現在プレビューで提供されており、Amazon AthenaAmazon RedshiftAmazon EMRAmazon QuickSight などの AWS の分析サービスを使用してデータをクエリおよび視覚化できます。

S3 API サポート – テーブルバケットは、GetObjectHeadObjectPutObjectマルチパートアップロードオペレーションなどの関連する S3 API 関数をサポートしています。

セキュリティ – テーブルバケットに保存されているすべてのオブジェクトは自動的に暗号化されます。テーブルバケットは、[ブロックパブリックアクセス] を強制適用するように設定されています。

料金 – ストレージ、リクエスト、オブジェクトモニタリング料金、および圧縮の料金をお支払いいただきます。詳細については、「S3 の料金」ページをご覧ください。

リージョン – この新機能は、米国東部 (オハイオ、バージニア北部) および米国西部 (オレゴン) の AWS リージョンでご使用いただけます。

Jeff;

原文はこちらです。