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を使用してソリューションリソースを設定するには、以下の手順を実行します。

  1. IAM 管理者として AWS Management Console にログインします。
  2. スタックの作成 を選択してCloudFormation テンプレートをデプロイします。
  3. 次へを選択します。
  4. 次のページで、次へを選択します。
  5. 最後のページで詳細を確認し、「AWS CloudFormation によって IAM リソースがカスタム名で作成される場合があることを承認します。」を選択します。
  6. 送信(注意:画面上は左記の表記ですが作成の意味です。)を選択します。

CloudFormationテンプレートは以下のリソースを生成します。

  • EMR クラスタ用の VPC、サブネット、セキュリティグループ
  • Iceberg テーブルデータとメタデータを格納するデータレイクバケット
  • クローラーと Lake Formation 登録用の IAM ロール
  • EMR クラスタと、Hive メタストアを使用して Iceberg テーブルを作成する手順
  • データアクセス用のアナリストロール
  • 結果用の Athena バケットパス

  1. スタックが完成したら、AWS CloudFormation コンソールで、スタックの リソース タブに移動します。
  2. EmrClusterIdDataLakeBucketNameLFRegisterLocationServiceRoleAWSGlueServiceRoleAthenaBucketName、および LFBusinessAnalystRole の値をメモします。
  3. Amazon EMR コンソールに移動し、作成された EMR クラスタを選択します。
  4. ステップ タブに移動し、ステップが実行されたことを確認します。

このスクリプトは、Hive と Iceberg テーブルの product を使用してデータベース icebergcrawlerblodb を作成します。メタストアとして Amazon EMR 上の Hive メタストアサーバーを使用し、Amazon S3 にデータを保存します。

  1. 作成した S3 バケットに移動し、Iceberg テーブルのデータとメタデータが作成されていることを確認します。

このスタックがデプロイするリソースの中には、使用時にコストが発生するものもあります。

データが Amazon S3 上にあるので、バケットを Lake Formation に登録してアクセスコントロールを実装し、データガバナンスを一元化することができます。

Lake Formation の権限を設定する

Lake Formation で AWS Glue Data Catalog を使用するには、以下の手順で Data Catalog の設定を更新し、IAM ベースのアクセス制御の代わりに Lake Formation によるアクセス権の許可を設定して Data Catalog リソースを制御します。

  1. Lake Formation コンソールに admin としてサインインします。
    • Lake Formation コンソールに初めてアクセスする場合は、自分をデータレイク管理者として追加します。
  2. ナビゲーションペインの AdministrationData Catalog Settings を選択します。
  3. Use only IAM access control for new databases の選択を解除します。
  4. Use only IAM access control for new tables in new databases の選択を解除します。
  5. Cross account version settings Version 3 を選択します。
  6. Save を選択します。

これで Lake Formation によるアクセス権の許可を設定できるようになりました。

データレイクのS3バケットをLake Formationに登録する

データレイクの S3 バケットを登録するには、以下の手順を実行します。

  1. Lake Formation コンソールのナビゲーションペインで、Data lake locations を選択します。
  2. Register location を選択します。
  3. Amazon S3 path には、データレイクバケットのパスを入力します。
  4. IAM ロールは、CloudFormation テンプレートから LFRegisterLocationServiceRole に指定されたロールを選択します。
  5. Permission modeLake Formation を選択します。
  6. Register location を選択します。

クローラーにデータロケーションへのアクセス権を与える

クローラーへのアクセスを許可するには、以下の手順を実行します。

  1. Lake Formation コンソールのナビゲーションペインで、Data locations を選択します。
  2. Grant を選択します。
  3. IAM users and roles で、クローラーのロールを選択します。
  4. Storage locations には、データレイクのバケットパスを入力します。
  5. Grant を選択します。

データベースを作成し、クローラーロールにアクセス権を付与する

以下の手順でデータベースを作成し、クローラーロールにアクセス権を付与します。

  1. Lake Formation コンソールのナビゲーションペインで、Databases を選択します。
  2. Create database を選択します。
  3. データベースの名前を icebergcrawlerblogdb とします。
  4. Use only IAM access control for new tables in this database オプションが選択されていないことを確認します。
  5. Create database を選択します。
  6. Action メニューで Grant を選択します。
  7. IAM users and roles で、クローラーのロールを選択します。
  8. データベースは icebergcrawlerblogdb のままにしておきます。
  9. Database permissionsCreate tableDescribe、および Alter を選択します。
  10. Grant を選択します。

Iceberg 用クローラーの設定

Iceberg 用のクローラーを設定するには、以下の手順を実行します。

  1. AWS Glue コンソールのナビゲーションペインで、Crawlers を選択します。
  2. Create crawler を選択します。
  3. クローラーの名前を入力します。この記事では、icebergcrawler を使用します。
  4. Next を選択します。
  5. Data source configuration で、Add data source を選択します。
  6. Data sourceIceberg を選択します。
  7. S3 path には、s3://<datalakebucket>/icebergcrawlerblogdb.db/ を入力します。
  8. Add a Iceberg data source を選択します。

Iceberg テーブルのサポートは、CreateCrawlerUpdateCrawler の API と、以下のプロパティを持つ IcebergTarget をターゲットとして追加することで利用できます。

  • connectionId – Iceberg テーブルが VPC 認証が必要なバケットに格納されている場合、ここに接続プロパティを設定します。
  • icebergTables – これは icebergPaths 文字列の配列で、それぞれ Iceberg テーブルのメタデータファイルが存在するフォルダを示します。

以下のコードを参照してください。

{
    "IcebergTarget": {
        "connectionId": "iceberg-connection-123",
        "icebergMetaDataPaths": [ 
            "s3://bucketA/", 
            "s3://bucketB/", 
            "s3://bucket3/financedb/financetable/" 
        ] 
        "exclusions": [
            "departments/**", 
            "employees/folder/**"
        ] 
        "maximumDepth": 5 
    } 
}
  1. Next を選択します。
  2. Existing IAM role には、スタックで作成したクローラーロールを選択します。
  3. Lake Formation configuration で、Use Lake Formation credentials for crawling S3 data source を選択します。
  4. Next を選択します。

  1. Set output and scheduling で、ターゲットデータベースを icebergcrawlerblogdb に指定します。
  2. Next を選択します。
  3. Create crawler を選択します。
  4. クローラーを実行します。

各クロール中、提供された icebergTable パスごとに、クローラーは Amazon S3 List API を呼び出して、その Iceberg テーブルメタデータフォルダ下の最新のメタデータファイルを見つけ、metadata_location パラメータを最新のマニフェストファイルに更新します。

次のスクリーンショットは、正常に実行された後の詳細を示しています。

クローラーは S3 データソースをクロールし、データカタログに Iceberg データのスキーマを入力することに成功しました。

これでデータカタログをプライマリメタストアとして使い始め、データカタログで直接、または createtable API を使って新しい Iceberg テーブルを作成することができます。

新しいIcebergテーブルを作成する

コンソールを使用してデータカタログに Iceberg テーブルを作成するには、このセクションの手順を実施します。または、CloudFormation テンプレートを使用して、以下のコードを使用して Iceberg テーブルを作成することもできます。

Type: AWS::Glue::Table
Properties: 
  CatalogId:"<account_id>"
  DatabaseName:"icebergcrawlerblogdb"
  TableInput:
    Name: "product_details"
    StorageDescriptor:
       Columns:
         - Name: "product_id"
           Type: "string"
         - Name: "manufacture_name"
           Type: "string"
         - Name: "product_rating"
           Type: "int"
       Location: "s3://<datalakebucket>/icebergcrawlerblogdb.db/"
    TableType: "EXTERNAL_TABLE"
  OpenTableFormatInput:
    IcebergInput:
      MetadataOperation: "CREATE"
      Version: "2"

IAMロールにデータロケーションへのアクセス権を付与する

まず、IAM ロールにデータロケーションへのアクセス権を付与します。

  1. Lake Formation コンソールのナビゲーションペインで Data locations を選択します。
  2. Grant を選択します。
  3. IAM users and rolesAdmin IAM role を選択します。
  4. Storage location に、データレイクのバケットパスを入力します。
  5. Grant を選択します。

Iceberg テーブルの作成

以下の手順を実行して、Iceberg テーブルを作成します。

  1. Lake Formation コンソールのナビゲーション ペインで、Tables を選択します。
  2. Create table を選択します。
  3. Nameproduct_details と入力します。
  4. Databaseicebergcrawlerblogdb を選択します。

  1. Table formatApache Iceberg table を選択します。
  2. Table location<datalakebucket>/icebergcrawlerblogdb.db/ のパスを指定します。
  3. Upload schema を選択後、以下のスキーマを指定し、Upload を選択します。
[ 
    { 
        "Name": "product_id", 
        "Type": "string" 
    }, 
    { 
        "Name": "manufacture_name", 
        "Type": "string" 
    }, 
    {
        "Name": "product_rating", 
        "Type": "int" 
    } 
]
  1. Submitを選択してテーブルを作成します。

新しいIcebergテーブルにレコードを追加する

Iceberg テーブルにレコードを追加するには、次の手順を実行します。

  1. Athena コンソールで、クエリエディタに移動します。
  2. 設定のタブを選択後、管理を選択し、CloudFormation の出力から AthenaBucketName に指定された値を使用して Athena クエリ結果の場所を構成します。
  3. 保存を選択します。
  4. 以下のクエリを実行して、テーブルにレコードを追加します。
insert into icebergcrawlerblogdb.product_details values('00001','ABC Company',10)

データカタログの Iceberg テーブルに Lake Formation によるアクセス権の許可を設定する

Athena は Iceberg テーブルの Lake Formation によるアクセス権の許可をサポートしているので、この記事ではテーブルへのきめ細かいアクセス権を設定し、Athena を使用してクエリを実行する方法を紹介します。

これにより、データレイク管理者は Lake Formation コンソールを介して LFBusinessAnalystRole-IcebergBlogIAM ロールにデータベースとテーブルへのアクセス権の許可を委譲することができます。

ロールにデータベースと Describe へのアクセス権を許可する

LFBusinessAnalystRole-IcebergBlogIAM ロールにDescribe 権限とともにデータベースへのアクセス権を許可するには、次の手順を実行します。

  1. Lake Formationコンソールで、ナビゲーションペインの Permissions の下にある Data lake permissions を選択します。
  2. Grant を選択します。
  3. Principals で、IAM users and roles を選択します。
  4. IAM ロール LFBusinessAnalystRole-IcebergBlog を選択します。
  5. LF-Tags or catalog resources で、Named Data Catalog resources を選択し、Databasesicebergcrawlerblogdb を選択します。
  6. Database permissionsDescribe を選択します。
  7. 許可を適用するには、Grant を選択します。

ロールにカラムアクセスを許可する

次に、LFBusinessAnalystRole-IcebergBlogIAM ロールに列アクセス権を付与します。

  1. Lake Formation コンソールのナビゲーションペインの Permissions で、Data lake permissions を選択します。
  2. Grant を選択します。
  3. Principals で、IAM users and roles を選択します。
  4. IAM ロール LFBusinessAnalystRole-IcebergBlog を選択します。
  5. LF-Tags or catalog resources で、Named Data Catalog resources を選択し、Databasesicebergcrawlerblogdb を、Tables に product を選択します。
  6. Table permissionsSelect を選択します。
  7. Data permissionsColumn-based access を選択します。
  8. Include columns を選択し、product_nameprice を選択します。
  9. 権限を適用するには、Grant を選択します。

ロールにテーブルへのアクセス権を付与する

最後に、LFBusinessAnalystRole-IcebergBlogIAM ロールにテーブルアクセスを付与します。

  1. Lake Formation コンソールのナビゲーションペインの PermissionsData lake permissions を選択します。
  2. Grant を選択します。
  3. Principals で、IAM users and roles を選択します。
  4. IAM ロール LFBusinessAnalystRole-IcebergBlog を選択します。
  5. LF-Tags or catalog resources で、Named Data Catalog resources を選択し、Databasesicebergcrawlerblogdb を、Tablesproduct_details を選択します。
  6. Table permissionsSelectDescribe を選択します。
  7. 許可を適用するには、Grant を選択します。

Athena を使用したテーブルの検証

Athena を使用してテーブルを検証するには、LFBusinessAnalystRole-IcebergBlogrole に切り替え、以下の手順を実行します。

  1. Athena コンソールで、クエリエディターに移動します。
  2. 設定のタブを選択後、管理を選択し、CloudFormation 出力から AthenaBucketName の値を使用して Athena クエリ結果の場所を構成します。
  3. 保存 を選択します。
  4. productproduct_details のクエリを実行して、アクセスを検証する。

次のスクリーンショットは、product のカラムパーミッションを示しています。

次のスクリーンショットは、product_details のテーブル・パーミッションを示しています。

Hive メタストアから作成した Iceberg データセットを Amazon S3 上のデータでクロールし、スキーマが設定された AWS Glue Data Catalog テーブルを作成することに成功しました。データレイクのバケットを Lake Formation に登録し、Lake Formation によるアクセス権の許可設定を使用してデータレイクへのクローラーのアクセスを有効にしました。データベースとテーブルに対する Lake Formation によるアクセス権の許可をアナリストユーザーに付与し、Athena を使用してデータへのアクセスを検証しました。

クリーンアップ

AWSアカウントへの不要な課金を避けるために、AWSリソースを削除します。

  1. CloudFormation スタックの作成に使用した IAM 管理者として CloudFormation コンソールにサインインします。
  2. 作成したCloudFormationスタックを削除します。

まとめ

Iceberg のクローラーがサポートされたことで、Iceberg テーブルのプライマリカタログとしてAWS Glue データカタログへすぐに移行することができます。AWS の Glue クローラーを実行することで、自動的にIceberg テーブルをデータカタログに登録することができ、DDL や手動でのスキーマ定義が不要になります。AWS Glue クローラーを使用して AWS 上のサーバーレスでトランザクション可能なデータレイクの構築の開始、データカタログを使用して新しいテーブルの作成、Athena による Iceberg テーブルフォーマットのクエリのために Lake Formation のきめ細かいアクセス制御を利用することができます。

様々な AWS 分析サービスにおける Iceberg テーブルの Lake Formation サポートについては、他のAWSサービスでの使用を参照してください。


原文はこちらです。