Amazon Web Services ブログ
AWS Glue クローラーとテーブル作成におけるApache Iceberg フォーマットサポートの紹介
Apache Iceberg は、Amazon Simple Storage Service( Amazon S3 )における大規模データセット用のオープンなテーブルフォーマットであり、大規模テーブルに対する高速なクエリパフォーマンス、アトミックコミット、同時書き込み、SQL 互換のテーブル進化を提供します。Iceberg はデータレイクにおける ACID トランザクションをサポートし、スキーマやパーティションのエボリューション、タイムトラベル、ロールバックなどの機能で非常に人気があります。Iceberg はデータセットの状態に関するメタデータ情報を取得し、データセットの進化や時間経過に伴う変化を記録します。
AWS Glue クローラーが Iceberg テーブルをサポートするようになり、AWS Glue Data Catalog の利用や他の Iceberg カタログからの移行が容易になりました。AWS Glue クローラーはスキーマ情報を抽出し、Iceberg メタデータの場所やスキーマの変更を Glue Data Catalog に更新します。その後、すべてのアナリティクスエンジンでデータカタログの Iceberg テーブルにクエリし、AWS Lake Formation のきめ細かい権限を適用することができます。
Iceberg カタログは、Iceberg テーブルのコレクションを管理し、テーブルの現在のメタデータを追跡するのに役立ちます。Iceberg カタログには、AWS Glue Data Catalog、Hive メタストア、JDBC カタログなど、いくつかの実装オプションがあります。AWS Glue Data Catalog は、Amazon Athena、AWS Glue、Amazon EMR、Lake Formation などの AWS 分析サービスと統合されているため、ユーザーにおいて AWS Glue Data Catalog の使用や移行が好まれています。
本日(2023年8月16日)の発表で、データカタログにある既存の Iceberg テーブルに対して AWS Glue クローラーを作成し、スケジュールすることができるようになりました。そして、Iceberg テーブルが配置されている 1 つまたは複数の S3 パスを指定することができます。クローラーがクロールできる S3 パスの最大深度を指定するオプションがあります。各クローラーの実行ごとに、クローラーは各 S3 パスを検査し、データカタログ内のスキーマに対する新しいテーブル、削除、更新などのスキーマ情報をカタログ化します。クローラーはすべてのスナップショットでスキーマのマージをサポートし、AWS の分析エンジンが直接使用できるデータカタログの最新のメタデータファイルの場所を更新します。
さらに、AWS Glue は、AWS Glue コンソールまたは AWS Glue CreateTable
API を使用して、データカタログに新しい(空の)Iceberg テーブルを作成するためのサポートを開始します。今回のリリース以前は、Iceberg テーブルフォーマットを採用したいユーザーは、CreateTable
に加えて、別途 PutObject
を使用して Amazon S3 上に Iceberg の metadata.json
ファイルを生成する必要がありました。多くの場合、ユーザーは Athena や AWS Glue などの分析エンジンで create table
ステートメントを使用していました。新しい CreateTable
API は、metadata.json ファイルを別途作成する必要性をなくし、与えられた API 入力に基づいて metadata.json
を自動生成します。また、AWS CloudFormation テンプレートを使用してデプロイメントを管理するユーザーは、CreateTable
API を使用して Iceberg テーブルを作成できるようになりました。詳細については、Apache Iceberg テーブルの作成を参照してください。
Athena を使用してデータにアクセスする場合、Amazon S3 のデータロケーションを Lake Formation に登録する際に、Lake Formation によるきめ細かいアクセス制御権限を設定して Iceberg テーブルを保護することもできます。Amazon S3 のソースデータと Lake Formation に登録されていないメタデータについては、Amazon S3 と AWS Glue アクションの AWS Identity and Access Management (IAM) 権限ポリシーによってアクセスが決定されます。
ソリューション概要
このユースケースの例では、あるユーザーがデータ処理に Amazon EMR を使用し、トランザクションデータには Iceberg フォーマットを使用しています。商品データを Amazon S3 に Iceberg フォーマットで保存し、データセットのメタデータを EMR のプライマリノード上の Hive メタストア にホストしています。ユーザーは、Athena を使用したインタラクティブな分析のために、アナリストロールの人が商品データにアクセスできるようにしたいと考えています。多くのAWS分析サービスは Hive メタストア とネイティブに統合されていないため、AWS Glue Data Catalog にメタデータを入力するために AWS Glue クローラーを使用します。Athena は Iceberg テーブルの Lake Formation アクセス権の許可をサポートしていますので、データアクセスにはきめ細かいアクセス権を適用可能です。
Iceberg スキーマをデータカタログにオンボードし、Lake Formation アクセスコントロールを使用してクローリングを行うようにクローラーを構成します。データベースとクロールされたテーブルに対して Lake Formation によるアクセス権の許可を付与し、アナリストユーザーが Athena を使ってデータをクエリし、検証できるようにします。
既存の Iceberg データセットのスキーマを Data Catalog に入力した後、新しい Iceberg テーブルを Data Catalog に登録し、Athena を使用して新しく作成したデータにデータをロードします。データベースと新しく作成したテーブルに Lake Formation によるアクセス権の許可を付与し、アナリスト・ユーザーが Athena を使用してデータをクエリし、検証できるようにします。
次の図は、ソリューションのアーキテクチャーを示しています。
AWS CloudFormationでリソースをセットアップする
AWS CloudFormationを使用してソリューションリソースを設定するには、以下の手順を実行します。
- IAM 管理者として AWS Management Console にログインします。
- スタックの作成 を選択してCloudFormation テンプレートをデプロイします。
- 次へを選択します。
- 次のページで、次へを選択します。
- 最後のページで詳細を確認し、「AWS CloudFormation によって IAM リソースがカスタム名で作成される場合があることを承認します。」を選択します。
- 送信(注意:画面上は左記の表記ですが作成の意味です。)を選択します。
CloudFormationテンプレートは以下のリソースを生成します。
- EMR クラスタ用の VPC、サブネット、セキュリティグループ
- Iceberg テーブルデータとメタデータを格納するデータレイクバケット
- クローラーと Lake Formation 登録用の IAM ロール
- EMR クラスタと、Hive メタストアを使用して Iceberg テーブルを作成する手順
- データアクセス用のアナリストロール
- 結果用の Athena バケットパス
- スタックが完成したら、AWS CloudFormation コンソールで、スタックの リソース タブに移動します。
EmrClusterId
、DataLakeBucketName
、LFRegisterLocationServiceRole
、AWSGlueServiceRole
、AthenaBucketName
、およびLFBusinessAnalystRole
の値をメモします。- Amazon EMR コンソールに移動し、作成された EMR クラスタを選択します。
- ステップ タブに移動し、ステップが実行されたことを確認します。
このスクリプトは、Hive と Iceberg テーブルの product を使用してデータベース icebergcrawlerblodb
を作成します。メタストアとして Amazon EMR 上の Hive メタストアサーバーを使用し、Amazon S3 にデータを保存します。
- 作成した S3 バケットに移動し、Iceberg テーブルのデータとメタデータが作成されていることを確認します。
このスタックがデプロイするリソースの中には、使用時にコストが発生するものもあります。
データが Amazon S3 上にあるので、バケットを Lake Formation に登録してアクセスコントロールを実装し、データガバナンスを一元化することができます。
Lake Formation の権限を設定する
Lake Formation で AWS Glue Data Catalog を使用するには、以下の手順で Data Catalog の設定を更新し、IAM ベースのアクセス制御の代わりに Lake Formation によるアクセス権の許可を設定して Data Catalog リソースを制御します。
- Lake Formation コンソールに admin としてサインインします。
- Lake Formation コンソールに初めてアクセスする場合は、自分をデータレイク管理者として追加します。
- ナビゲーションペインの Administration で Data Catalog Settings を選択します。
- Use only IAM access control for new databases の選択を解除します。
- Use only IAM access control for new tables in new databases の選択を解除します。
- Cross account version settings で Version 3 を選択します。
- Save を選択します。
これで Lake Formation によるアクセス権の許可を設定できるようになりました。
データレイクのS3バケットをLake Formationに登録する
データレイクの S3 バケットを登録するには、以下の手順を実行します。
- Lake Formation コンソールのナビゲーションペインで、Data lake locations を選択します。
- Register location を選択します。
- Amazon S3 path には、データレイクバケットのパスを入力します。
- IAM ロールは、CloudFormation テンプレートから
LFRegisterLocationServiceRole
に指定されたロールを選択します。 - Permission mode は Lake Formation を選択します。
- Register location を選択します。
クローラーにデータロケーションへのアクセス権を与える
クローラーへのアクセスを許可するには、以下の手順を実行します。
- Lake Formation コンソールのナビゲーションペインで、Data locations を選択します。
- Grant を選択します。
- IAM users and roles で、クローラーのロールを選択します。
- Storage locations には、データレイクのバケットパスを入力します。
- Grant を選択します。
データベースを作成し、クローラーロールにアクセス権を付与する
以下の手順でデータベースを作成し、クローラーロールにアクセス権を付与します。
- Lake Formation コンソールのナビゲーションペインで、Databases を選択します。
- Create database を選択します。
- データベースの名前を
icebergcrawlerblogdb
とします。 - Use only IAM access control for new tables in this database オプションが選択されていないことを確認します。
- Create database を選択します。
- Action メニューで Grant を選択します。
- IAM users and roles で、クローラーのロールを選択します。
- データベースは
icebergcrawlerblogdb
のままにしておきます。 - Database permissions で Create table、Describe、および Alter を選択します。
- Grant を選択します。
Iceberg 用クローラーの設定
Iceberg 用のクローラーを設定するには、以下の手順を実行します。
- AWS Glue コンソールのナビゲーションペインで、Crawlers を選択します。
- Create crawler を選択します。
- クローラーの名前を入力します。この記事では、
icebergcrawler
を使用します。 - Next を選択します。
- Data source configuration で、Add data source を選択します。
- Data source で Iceberg を選択します。
- S3 path には、
s3://<datalakebucket>/icebergcrawlerblogdb.db/
を入力します。 - Add a Iceberg data source を選択します。
Iceberg テーブルのサポートは、CreateCrawler
とUpdateCrawler
の API と、以下のプロパティを持つ IcebergTarget
をターゲットとして追加することで利用できます。
connectionId
– Iceberg テーブルが VPC 認証が必要なバケットに格納されている場合、ここに接続プロパティを設定します。icebergTables
– これはicebergPaths
文字列の配列で、それぞれ Iceberg テーブルのメタデータファイルが存在するフォルダを示します。
以下のコードを参照してください。
- Next を選択します。
- Existing IAM role には、スタックで作成したクローラーロールを選択します。
- Lake Formation configuration で、Use Lake Formation credentials for crawling S3 data source を選択します。
- Next を選択します。
- Set output and scheduling で、ターゲットデータベースを
icebergcrawlerblogdb
に指定します。 - Next を選択します。
- Create crawler を選択します。
- クローラーを実行します。
各クロール中、提供された icebergTable
パスごとに、クローラーは Amazon S3 List API を呼び出して、その Iceberg テーブルメタデータフォルダ下の最新のメタデータファイルを見つけ、metadata_location
パラメータを最新のマニフェストファイルに更新します。
次のスクリーンショットは、正常に実行された後の詳細を示しています。
クローラーは S3 データソースをクロールし、データカタログに Iceberg データのスキーマを入力することに成功しました。
これでデータカタログをプライマリメタストアとして使い始め、データカタログで直接、または createtable
API を使って新しい Iceberg テーブルを作成することができます。
新しいIcebergテーブルを作成する
コンソールを使用してデータカタログに Iceberg テーブルを作成するには、このセクションの手順を実施します。または、CloudFormation テンプレートを使用して、以下のコードを使用して Iceberg テーブルを作成することもできます。
IAMロールにデータロケーションへのアクセス権を付与する
まず、IAM ロールにデータロケーションへのアクセス権を付与します。
- Lake Formation コンソールのナビゲーションペインで Data locations を選択します。
- Grant を選択します。
- IAM users and roles の Admin IAM role を選択します。
- Storage location に、データレイクのバケットパスを入力します。
- Grant を選択します。
Iceberg テーブルの作成
以下の手順を実行して、Iceberg テーブルを作成します。
- Lake Formation コンソールのナビゲーション ペインで、Tables を選択します。
- Create table を選択します。
- Name に
product_details
と入力します。 - Database に
icebergcrawlerblogdb
を選択します。
- Table format は Apache Iceberg table を選択します。
- Table location に
<datalakebucket>/icebergcrawlerblogdb.db/
のパスを指定します。 - Upload schema を選択後、以下のスキーマを指定し、Upload を選択します。
- Submitを選択してテーブルを作成します。
新しいIcebergテーブルにレコードを追加する
Iceberg テーブルにレコードを追加するには、次の手順を実行します。
- Athena コンソールで、クエリエディタに移動します。
- 設定のタブを選択後、管理を選択し、CloudFormation の出力から
AthenaBucketName
に指定された値を使用して Athena クエリ結果の場所を構成します。 - 保存を選択します。
- 以下のクエリを実行して、テーブルにレコードを追加します。
データカタログの Iceberg テーブルに Lake Formation によるアクセス権の許可を設定する
Athena は Iceberg テーブルの Lake Formation によるアクセス権の許可をサポートしているので、この記事ではテーブルへのきめ細かいアクセス権を設定し、Athena を使用してクエリを実行する方法を紹介します。
これにより、データレイク管理者は Lake Formation コンソールを介して LFBusinessAnalystRole-IcebergBlogIAM
ロールにデータベースとテーブルへのアクセス権の許可を委譲することができます。
ロールにデータベースと Describe へのアクセス権を許可する
LFBusinessAnalystRole-IcebergBlogIAM
ロールにDescribe 権限とともにデータベースへのアクセス権を許可するには、次の手順を実行します。
- Lake Formationコンソールで、ナビゲーションペインの Permissions の下にある Data lake permissions を選択します。
- Grant を選択します。
- Principals で、IAM users and roles を選択します。
- IAM ロール
LFBusinessAnalystRole-IcebergBlog
を選択します。 - LF-Tags or catalog resources で、Named Data Catalog resources を選択し、Databases に
icebergcrawlerblogdb
を選択します。 - Database permissions で Describe を選択します。
- 許可を適用するには、Grant を選択します。
ロールにカラムアクセスを許可する
次に、LFBusinessAnalystRole-IcebergBlogIAM
ロールに列アクセス権を付与します。
- Lake Formation コンソールのナビゲーションペインの Permissions で、Data lake permissions を選択します。
- Grant を選択します。
- Principals で、IAM users and roles を選択します。
- IAM ロール
LFBusinessAnalystRole-IcebergBlog
を選択します。 - LF-Tags or catalog resources で、Named Data Catalog resources を選択し、Databases に
icebergcrawlerblogdb
を、Tables に product を選択します。 - Table permissions で Select を選択します。
- Data permissions で Column-based access を選択します。
- Include columns を選択し、
product_name
とprice
を選択します。 - 権限を適用するには、Grant を選択します。
ロールにテーブルへのアクセス権を付与する
最後に、LFBusinessAnalystRole-IcebergBlogIAM
ロールにテーブルアクセスを付与します。
- Lake Formation コンソールのナビゲーションペインの Permissions で Data lake permissions を選択します。
- Grant を選択します。
- Principals で、IAM users and roles を選択します。
- IAM ロール
LFBusinessAnalystRole-IcebergBlog
を選択します。 - LF-Tags or catalog resources で、Named Data Catalog resources を選択し、Databases に
icebergcrawlerblogdb
を、Tables にproduct_details
を選択します。 - Table permissions で Select と Describe を選択します。
- 許可を適用するには、Grant を選択します。
Athena を使用したテーブルの検証
Athena を使用してテーブルを検証するには、LFBusinessAnalystRole-IcebergBlogrole
に切り替え、以下の手順を実行します。
- Athena コンソールで、クエリエディターに移動します。
- 設定のタブを選択後、管理を選択し、CloudFormation 出力から
AthenaBucketName
の値を使用して Athena クエリ結果の場所を構成します。 - 保存 を選択します。
product
とproduct_details
のクエリを実行して、アクセスを検証する。
次のスクリーンショットは、product
のカラムパーミッションを示しています。
次のスクリーンショットは、product_details
のテーブル・パーミッションを示しています。
Hive メタストアから作成した Iceberg データセットを Amazon S3 上のデータでクロールし、スキーマが設定された AWS Glue Data Catalog テーブルを作成することに成功しました。データレイクのバケットを Lake Formation に登録し、Lake Formation によるアクセス権の許可設定を使用してデータレイクへのクローラーのアクセスを有効にしました。データベースとテーブルに対する Lake Formation によるアクセス権の許可をアナリストユーザーに付与し、Athena を使用してデータへのアクセスを検証しました。
クリーンアップ
AWSアカウントへの不要な課金を避けるために、AWSリソースを削除します。
- CloudFormation スタックの作成に使用した IAM 管理者として CloudFormation コンソールにサインインします。
- 作成したCloudFormationスタックを削除します。
まとめ
Iceberg のクローラーがサポートされたことで、Iceberg テーブルのプライマリカタログとしてAWS Glue データカタログへすぐに移行することができます。AWS の Glue クローラーを実行することで、自動的にIceberg テーブルをデータカタログに登録することができ、DDL や手動でのスキーマ定義が不要になります。AWS Glue クローラーを使用して AWS 上のサーバーレスでトランザクション可能なデータレイクの構築の開始、データカタログを使用して新しいテーブルの作成、Athena による Iceberg テーブルフォーマットのクエリのために Lake Formation のきめ細かいアクセス制御を利用することができます。
様々な AWS 分析サービスにおける Iceberg テーブルの Lake Formation サポートについては、他のAWSサービスでの使用を参照してください。
原文はこちらです。