2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TTDCAdvent Calendar 2024

Day 12

S3 Tablesを使ってIcebergに触れてみる

Last updated at Posted at 2024-12-11

本記事は「 TTDC Advent Calendar 2024 」 12 日目の記事です。

AWS re:Invent 2024でAmazon S3 Tablesが発表され、Apache Icebergをサポートする初のクラウドオブジェクトストアが誕生しました。AWSはこれまでにもAthenaやRedshiftなどのサービスで従来のDatalakeの弱点を解消してきました。その中核技術としてIcebergをはじめとするOpenTableFormatに対応してきましたが、今回はS3の機能として追加された形になります。AWSニュースブログによると「セルフマネージドテーブルストレージと比較すると、最大 3 倍のクエリパフォーマンスと最大 10 倍のトランザクション/秒が期待できます。」とのこと

今回は、最近よく聞くIceberg(OpenTableFormat)とはなにか?をGAとなったS3 Tablesを使いながらざっくりと理解していきます。

従来のDatalakeフォーマットに関してとっても参考になる神スライド
「AWSにおけるHudi/Iceberg/Delta Lakeの使いどころと違いについて」
https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_Datalake-Format-On-AWS_0516_v1.pdf

OpenTableFormatとは

OpenTableFormatとしてIceberg, Hudi, DeltaLakeが上げられます。これらのフォーマットでは従来のDatalakeでの課題がいくらか解消されています。例えば従来のDatalakeで課題となっていた「スキーマ変更への追従が大変」という問題を解決するためIcebergではテーブルへの変更をスナップショットログで追跡する機能が搭載されています。

OpenTableFormatが分かりすぎる神サイト
「データレイクの新しいカタチ:Open Table Formatの紹介」
https://bering.hatenadiary.com/entry/2023/07/17/235246

Icebergとは(OpenTableFormatの代表格)

catalog/metadata/dataの3階層であらわされるデータベース(テーブル)とファイル(メタファイルとデータファイル)の一式のことです。

image.png

Icebergを理解するためのハンズオンが記載された神リポジトリ

S3TablesとGlue Catalogの関係

Glue Catalogとの紐づけは以下のようになります

  • テーブルバケット = カタログ
  • 名前空間 = データベース
  • テーブル = テーブル

image-19.png

S3 Tablesの作成

テーブルバケットの作成

S3メニューにテーブルバケットという項目が増えていますのでここから「テーブルバケット作成」のボタンを押します
※ 日本リージョンはまだ対応していないようですのでバージニアを使用します

image-1.png

s3-tables-tryというバケットを作りました。「統合を有効にする」にチェックを入れておきます

image-2.png

「統合を有効にする」にチェックを入れるとAWS Lake Formationテーブルバケットの登録とAWS Glueカタログの作成が実行されます

image-5.png

リージョンで1回行うと次回は有効になっています。

image-6.png

数秒でできあがりました。削除はコンソールから実行できず、CLIなどから実行する必要があるようです。

image-7.png

出来上がったバケットをクリックするとテーブル一覧が表示されますが、コンソールからは何も操作できません。

image-4.png

LakeFormationの設定

Get Startedボタンを押して利用を開始します

image-12.png

DataCatalog > Catalogs Newを見るとs3tablescatalogが追加されています

image-13.png

s3tablescatalogを選択してActionsのGrant(権限付与)を押します

image-14.png

自身のIAMユーザに対してs3tablescatalogとs3tablescatalog/s3-tables-tryを選択して、SuperUser権限を与えました

image-15.png

image-17.png

image-16.png

parquetファイルのデータをテーブルにロードしてみる

Cloudshellにsparkshellをインストールしてsparkから操作します
sparkを準備する手順はこちらの神記事で紹介されています

sparkが起動するとロゴが表示されsparkコマンドが使えるようになります

image-20.png

名前空間とテーブルを適当に作成します

spark.sql("create namespace if not exists s3tablesbucket.namespace_s3tables_try")
spark.sql("create table if not exists s3tablesbucket.namespace_s3tables_try.test_parqeut ( measurement_time timestamp, speed int, accel float, gas float) using iceberg ")

この時点でathenaを見るとでカタログ(テーブルバケット)やデータベース(名前空間)、テーブル(テーブル)が選択できるようになっています

image-21.png

スキーマを合わせたparquetファイルを作成してテーブルにロードしてみます

pythonでparquetの作成

import pandas as pd
import pyarrow.parquet as pq
import pprint
import numpy as np
from datetime import datetime, timedelta

# データフレームの行数を定義
num_rows = 10000

# measurement_time 列をカウントアップする値で生成 (ミリ秒単位)
measurement_time = [datetime.now() + timedelta(milliseconds=i*10) for i in range(num_rows)]

# 他の3つの列には適当に変化する値を生成
col_speed = (np.random.random(num_rows) * 100).astype(int)  # 0から100の範囲でランダムな値(int)
col_accel = np.random.random(num_rows)   # 0から1の範囲でランダムな値(float)
col_gas = np.random.normal(loc=50, scale=10, size=num_rows)  # 平均50、標準偏差10の正規分布に従うランダム値(float)

# データフレームの作成
df = pd.DataFrame({
    'measurement_time': measurement_time,
    'speed': col_speed,
    'accel': col_accel,
    'gas': col_gas,
})

print(df.head())
df.to_parquet('output.parquet',
              version = "2.6",      # default "2.6"
              row_group_size = 4000,   # default None(minimum of the Table size and 1024 * 1024.)
              data_page_size = 1024 * 1, # 1KB default None(1MB)
            )

parquetの読み込み

var df = spark.read.parquet("/home/cloudshell-user/output.parquet") // or s3 uri

sparkがnano分解能のtimestampをサポートしていなかったためint96 timestampで出力して再トライします
image-22.png

df.to_parquet('output.parquet',
              version = "1.0",      # default "2.6"
              row_group_size = 4000,   # default None(minimum of the Table size and 1024 * 1024.)
              data_page_size = 1024 * 1, # 1KB default None(1MB)
              use_deprecated_int96_timestamps = True
            )

上手く読み込めました
image-24.png

テーブルにロードして無事athenaでクエリすることができました

df.writeTo("s3tablesbucket.namespace_s3tables_try.test_parqeut").using("Iceberg").tableProperty("format-version", "2").createOrReplace()

image-26.png

まとめ

s3 tablesを使用してIcebergに触れることができました。
今回の内容ではs3 tablesの利点やIcebergの利点については感じ取ることができなかったため、これらに注目した記事も書いてみたいと思います。

最後まで読んでいただきありがとうございました。本記事の内容に誤りなどあればコメントにてご教授お願いいたします。

参考

データレイクの新しいカタチ:Open Table Formatの紹介
AWSにおける Hudi/Iceberg/Delta Lake の使いどころと違いについて
Apache Iceberg
[アップデート]Apache Iceberg形式のテーブルデータに最適化されたストレージAmazon S3 Tablesが発表されました

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?