データレイク以外のテーブルを Apache Iceberg テーブルに移行したいです。
簡単な説明
堅牢なデータレイクアーキテクチャにより、さまざまなデータソースを 1 つの場所に統合して簡単にアクセスできます。その後、データ管理ツールと従来のデータウェアハウスシステムの ACID トランザクションを使用するとコストを削減できます。
解決策
Iceberg テーブルは、インプレース移行とシャドウ移行の 2 種類の移行をサポートしています。詳細については、Iceberg のウェブサイトで「インプレースマイグレーションシャドウマイグレーション」を参照してください。
Apache Spark セッションを Iceberg 設定で初期化する
AWS Glue で新しいノートブックを作成します。ノートブックを作成するときには、正しいアクセス許可を持つ AWS Identity and Access Management (IAM) ロールを使用してください。
次の手順を実行します。
- AWS Glue コンソールにログインします。
- Glue ノートブックを作成し、次のパラメータを設定します。
%glue_version 4.0
%idle_timeout 60
%number_of_workers 5
%worker_type G.1X
%%configure
{
"--conf": "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions",
"--datalake-formats": "iceberg"
}
from pyspark.sql import SparkSession
spark = SparkSession.builder \
.config(f"spark.sql.catalog.glue_catalog", "org.apache.iceberg.spark.SparkCatalog") \
.config(f"spark.sql.catalog.glue_catalog.warehouse","s3://bucket_name/prefix/") \
.config(f"spark.sql.catalog.glue_catalog.catalog-impl", "org.apache.iceberg.aws.glue.GlueCatalog") \
.config(f"spark.sql.catalog.glue_catalog.io-impl", "org.apache.iceberg.aws.s3.S3FileIO") \
.getOrCreate()
インプレース移行を使用してデータレイク以外のテーブルを移動する
インプレース移行では、ソーステーブルのデータファイルはそのまま残され、新しい Iceberg テーブルに追加されます。このプロセスでは、ターゲットテーブルのメタデータのみが作成されます。移行中に発生したエラーでは、メタデータの書き換えのみが必要となります。データファイル自体を書き換える必要はありません。
テーブルを移行するには、次の手順を実行します。
注: Parquet データには** add_files** を使用します。
-
ソーステーブルと同じ構造の、空の Iceberg テーブルを作成します。
query = f"""
CREATE TABLE IF NOT EXISTS glue_catalog.dbname.target_iceberg_tablename USING iceberg LOCATION 's3://bucket_name/prefix/' AS
SELECT * FROM dbname.source_tablename LIMIT 0
"""
spark.sql(query)
-
add_files プロシージャを実行します。
query = f"""
CALL glue_catalog.system.add_files(table => 'dbname.target_iceberg_tablename', source_table => 'dbname.source_tablename')
"""
spark.sql(query).show(truncate=False)
-
データファイルが、ソースの場所における以前のデータファイルを指していることを確認します。新しい場所で作成されたメタデータファイルのみが Iceberg テーブルに属します。
query = f"""
SELECT file_path FROM glue_catalog.dbname.target_iceberg_tablename.files
"""
spark.sql(query).show(10, truncate=False)
シャドウ移行を使用してデータレイク以外のテーブルを移動する
シャドウ移行プロセスでは、ソーステーブルのデータを再宣言します。移行中にデータを検証できます。構成ごとに新しいテーブルを作成して、さまざまな構成をテストすることもできます。
衝突を避けるため、このタイプの移行では、ターゲットデータファイルをソースデータファイルとは別の場所に配置します。このプロセスでは、問題からすばやく回復する方法として、ロールバックを使用してターゲットテーブルを削除することもできます。
テーブルを移行するには、次の手順を実行します。
-
既存のテーブルのデータを使用して Iceberg テーブルを作成します。
query = f"""
CREATE TABLE IF NOT EXISTS glue_catalog.dbname.target_iceberg_tablename USING iceberg LOCATION 's3://bucket_name/prefix/' AS
SELECT * FROM dbname.source_tablename
"""
spark.sql(query).show(truncate=False)
-
データファイルが新しい場所に移動されたことを確認します。新しい場所に作成されたメタデータファイルは、Iceberg テーブルに属しています。
query = f"""
SELECT file_path FROM glue_catalog.dbname.target_iceberg_tablename.files
"""
spark.sql(query).show(10, truncate=False)
関連情報
AWS Glue で Iceberg フレームワークを使用する