【前編】Amazon S3 Tables + Apache Iceberg + Athenaを触ってみた

記事タイトルとURLをコピーする

寒暖差で久しぶりにガッツリ体調を崩した荒井です。薬を飲んでも体調戻るのが明らかに遅くなっててダブルの意味で辛くなっています。

今回はタイトルにもある通り、Amazon S3 Tables + Apache Iceberg (+ Athena)について調査する機会がありましたので記事にします。

Amazon S3 Tables とは

aws.amazon.com

  • re:invent2024にて発表された、S3の機能強化アップデート
  • Apache Iceberg 等のオープンテーブルフォーマットをネイティブでサポート
  • データレイクへのアクセス管理がテーブルレベルで設定可能

そもそも Apache Iceberg とは

ざっくり言うと、「S3のようなオブジェクトストレージを信頼性と柔軟性の高いデータベースやデータウェアハウスのように扱えるようにする」ためのオープンソースのテーブルフォーマット仕様です。

Parquetなどの列指向フォーマットファイルをデータ実体として扱い、メタデータでスキーマやパーティションを管理します。

他にもACIDトランザクションやメタデータを利用したスナップショット管理等様々な特徴があります。

より踏み込んだ仕様が気になる方は、下記公式ドキュメントを参照されるとより良いかもしれません。

Spec - Apache Iceberg™

チュートリアルをやってみる

docs.aws.amazon.com

S3 Tables 並びに Apache Iceberg については利用したことがなかったため、まずは公式で用意しているチュートリアルをやってみることにします。

1. テーブルバケットの有効化

S3のページを開き左側メニューから[テーブル バケット]を選択し、[統合を有効化]をクリックします。

(画像ではスクリーンショットを取るためにオレゴンとなっています)

ページ遷移後色々出ていますが、[統合を有効化]をクリックします。

大体以下のようなことが書かれています。

  • テーブルバケット内のテーブルを Athena や EMR 等の分析エンジンから使えるようにするには、AWS Glue データカタログとの統合が必要
  • 有効にすると、テーブル情報が Glue データカタログの s3tablescatalog に自動登録され、分析エンジンがそれを見つけて利用できるようになる

統合を有効化が完了したら、[テーブルバケットの作成]をクリックします。

以下の規則に沿って任意で命名を行います。

現在のリージョン内の AWS アカウント内で一意であること。
3 文字から 63 文字までの長さにしてください。
小文字、数字、ハイフン ( -) のみで構成します。
文字または数字で始まり、終わります。

今回は適当に tutorial-s3table-arai としました。

バケット名には小文字しか利用できないというのはポイントになると思います。

次のステップで記載しますが、テーブルの定義にも小文字しか利用できません。

2. テーブルの名前空間とテーブルを作成する

先ほど作成したテーブルバケットを選択し、[Athenaでテーブルを作成]をクリックします。

名前空間を規則に沿って任意で命名を行います。

ここの名前空間というのは、Amazon Athena を使用して AWS Glue データカタログに Iceberg テーブルを作成する際の CREATE TABLE 文で指定するテーブル名の前の部分になります。

今回は名前空間を s3table_iceberg とし、[名前空間を作成]をクリックします。

[Athenaでテーブルを作成]をクリックします。

最初からサンプルのSQLが投入された状態になっています。

CREATE TABLE句のポイントとしては、テーブル名並びにテーブル定義が全て小文字で定義されている①ことと、テーブルが Iceberg フォーマットであること②の2点があります。

-- Use the following statement to create a table in your S3 Table bucket.
CREATE TABLE `s3table_iceberg `.daily_sales ( ・・・①
  sale_date date, ・・・①
  product_category string, ・・・①
  sales_amount double ・・・①
)
PARTITIONED BY (month(sale_date))
TBLPROPERTIES ('table_type' = 'iceberg') ・・・②

①は少し前にも触れましたが公式ドキュメントにも記載してある通り、テーブル名とテーブル定義の両方で大文字を利用することができません。

今まで命名する際に、全てを大文字にしていた方等は注意する必要があるでしょう。

テーブルを作成するときは、テーブル名とテーブル定義ですべて小文字を使用していることを確認してください。 たとえば、列名はすべて小文字であることを確認してください。 テーブル名またはテーブル定義に大文字が含まれている場合、そのテーブルは AWS Lake Formation または AWS Glue データカタログでサポートされていません。 この場合、テーブルバケットが AWS 分析サービスと統合されている場合でも、テーブルは Amazon Athena などの AWS 分析サービスに表示されません。

テーブル定義に大文字が含まれている場合、SELECTAthena でクエリを実行すると次のエラー メッセージが表示されます。 "GENERIC_INTERNAL_ERROR: Get table request failed: com.amazonaws.services.glue.model.ValidationException: Unsupported Federation Resource - Invalid table or column names."

②はこのテーブルが Iceberg フォーマットであることを AWS Glue データカタログと Athena に宣言している箇所になります。

これにより、本記事の冒頭で触れたIceberg特有のメタデータ管理や機能が有効になります。

3. Athena でクエリしてみる

サンプルデータを投入後、通常のSQL文でクエリ可能です。

メタデータからテーブルの履歴を確認したい場合は、ビュー テーブル名$history を参照します。

この状態で 1. で作成したテーブルバケットを確認すると、確かに先ほど作成したテーブルが存在しています。

しかし、コンソールからはこれ以上のデータ(メタデータや実ファイル)が見れるわけではありませんでした。

Glue データカタログから確認してみる

公式ドキュメントには、以下の文言がありましたので Glue のデータカタログから今回作成した Database や Table が見れるかどうか気になりました。

S3 テーブルと AWS Glue データカタログの統合はプレビュー段階にあり、Amazon Data Firehose、Athena、Redshift、EMR、QuickSight などの AWS Analytics サービスを使用して、S3 メタデータテーブルを含むデータのストリーミング、クエリ、および可視化を行うことができます。

コンソールから Glue のページを開きメニューから Tables を選択し、先程作成した daily_sales があるかというと...

残念ながら見つかりませんでした。Database の方にも今回作成した s3table_iceberg はありませんでした。

S3 Tables 上に存在する Database や Table が、Glue のデータカタログに追加されるというわけでは無さそうです。

次回は、S3 Tables 上のデータを Glue ETL ジョブからアクセスする方法について確認してみます。

(後編はこちら)

荒井 泰二郎 (記事一覧)

2023年8月入社 最近ジムに通い始めました