Amazon Web Services ブログ

オープンソースの Apache Spark から AWS Glue Iceberg Rest Catalog を使って S3 Iceberg テーブルを読み書きする

今日のデータ主導の世界では、企業はデータレイクウェアハウスにまたがる膨大な量の情報を処理および分析する効率的な方法を常に模索しています。

Amazon SageMaker Lakehouse を使用すると、 Amazon Simple Storage Service ( Amazon S3 ) 上のデータレイクと Amazon Redshift データウェアハウスにまたがるすべてのデータを統合することができ、強力なアナリティクスと AI / ML アプリケーションを一元化されたデータで構築できます。SageMaker Lakehouse は、データを動かさずに Apache Iceberg と互換性のあるすべてのツールとエンジンでクエリを実行できる柔軟性を提供します。これは、SageMaker Lakehouse の機能を使用したい オープンソースの Apache Spark ユーザーにとって、エキサイティングな可能性を開きます。さらに、 SageMaker Lakehouse では、すべてのアナリティクスおよび ML ツールやエンジンに適用されるきめ細かい権限を定義することで、データを保護することができます。

この投稿では、オープンソースの Apache Spark のパワーを利用し、 AWS Glue Iceberg REST Catalog で動作するようサードパーティのエンジンを設定する方法を探ります。 この投稿には、 AWS Lake Formation が一時的なクレデンシャルを提供する機能を使用してメタデータと実データへのアクセスを管理し、 Amazon S3 テーブルに対してデータを読み取り/書き込みする操作を実行する方法の詳細が含まれます。

ソリューション概要

この投稿では、お客様が Data Catalog を使用して組織内の構造化および半構造化データセットのテクニカルメタデータを一元管理し、データチームが Apache Spark を使用してデータ処理を行えるようにしたいと考えています。
お客様は、 AWS Glue データベースを作成します。そして、Lake Formation の権限コントロールを使用してAmazon S3 上の Iceberg データを読み書きするために、Iceberg Rest API を使用して Glue Data Catalog と対話できるよう Apache Spark を設定します。

まず、 Apache Spark を使用して ETL ( 抽出・変換・ロード ) スクリプトを実行することから始めます。 Amazon S3 上に Iceberg テーブルを作成し、 Glue Iceberg REST Catalog を使用してそのテーブルにアクセスします。 ETL スクリプトは Iceberg テーブルにデータを追加し、 その後 Spark SQL を使用してデータを読み取ります。 この投稿では、他のデータチームが Amazon Athena を使用して、このデータをクエリする方法についても紹介します。

前提条件

Data Catalog を持つアカウントの、 Lake Formation データレイク管理者である AWS Identity and Access Management (IAM) ロールにアクセスできる必要があります。 手順については、データレイク管理者を作成するを参照してください。

  1. Python バージョン 3.7 以降がインストールされていることを確認します。 pip3 のバージョンが 22.2.2 以上であることを確認してください。
  2. 最新の AWS Command Line Interface ( AWS CLI ) をインストールまたは更新します。 手順については、最新バージョンの AWS CLI のインストールまたはアップデートを参照してください。 AWS CLI を使用して aws configure を実行し、 AWS アカウントを指定します。
  3. お客様の Iceberg テーブルを格納する S3 バケットを作成します。 今回は、 us-east-2 の AWS リージョンを使用し、バケット名を ossblog-customer-datalake とします。
  4. AWS Glue Iceberg REST Catalog エンドポイントを使用したデータアクセスに使用する、OSS Spark 用の IAM ロールを作成します。作成した IAM ロールが Data engineer permissions で定義されている AWS Glue と Lake Formation のポリシーを持っていることを確認してください。 この投稿では、 spark_role という名前の IAM ロールを使用します。

Lake Formation のサードパーティからのアクセス権限を有効にする

このセクションでは、 Lake Formation に S3 バケットを登録します。 このステップにより、Lake Formation は Amazon S3 に保存されたメタデータとデータの一元的な権限管理システムとして機能し、データレイク環境においてより効率的でセキュアなデータガバナンスを可能にします。

  1. ロケーションの登録に使用するロールの要件に従って、ユーザー定義の IAM ロールを作成します。 この投稿では、IAMロール : LFRegisterRole を使用します。
  2. 以下のコマンドを実行し、 IAM ロール LFRegisterRole を使用して、S3バケット ossblog-customer-datalake を登録します。
aws lakeformation register-resource \
--resource-arn '< S3 bucket ARN for amzn-s3-demo-bucket>' \
--role-arn '< IAM Role ARN for LFRegisterRole >' \
--region <aws_region>
XML

または、Lake Formation の AWS マネジメントコンソールを使用することもできます。

  1. Lake Formation コンソールに移動し、ナビゲーションペインから Administration を選択し、次に Data lake locations を選択して、以下の値を入力します。
    1. Amazon S3 path では、s3://ossblog-customer-datalake を選択します。
    2. IAM role では、 LFRegisterRole を選択します。
    3. Permission mode では、Lake Formation を選択します。
    4. Register location を選択します。

  1. Lake Formationで、外部エンジンがデータにアクセスできるように full table access を有効にします。
    1. 管理者ユーザーとしてサインインし、ナビゲーション ペインで Administration を選択します。
    2. Application integration settings を選択し、Allow external engines to access data in Amazon S3 locations with full table access を選択します。
    3. Save を選択します。

OSS Spark ロールのリソースアクセスを設定

  1. Lake Formation コンソールに移動し、ナビゲーションペインで Databases を選択して、デフォルトカタログに ossblogdb という AWS Glue データベースを作成します。
  2. データベースを選択し、Edit を選択して Use only IAM access control for new tables in this database のチェックボックスをオフにします。

OSS Spark ロールにリソース権限を付与

OSS Spark が ossblogdb データベースの上でデータセットを作成し、データを投入できるようにするには、前提条件のステップ 4 で作成した Apache Spark インスタンスの IAM ロール( spark_role ) を使用します。
Apache Spark はこのロールを使用して、Iceberg テーブルを作成し、レコードを追加し、読み込みます。 この機能を有効にするには、 spark_role にフルテーブルアクセスを付与し、テーブルデータを保存できる S3 バケットにデータロケーション権限を付与します。

spark_role にテーブル作成権限を付与

データレイク管理者としてサインインし、AWS CLIで以下のコマンドを実行します。

aws lakeformation grant-permissions \
--principal '{"DataLakePrincipalIdentifier":"arn:aws:iam::<aws_account_id>:role/<iam_role_name>"}' \
--permissions '["CREATE_TABLE","DESCRIBE"]'\
--resource '{"Database":{"CatalogId":"<aws_account_id>","Name":"ossblogdb"}}' \
--region <aws_region>
XML

またはコンソール上で以下を実施します

  1. Lake Formation コンソールのナビゲーションペインで、Data permissions を選択し、Grant を選択します。
  2. Principals セクションIAM users and roles で、spark_role を選択します。
  3. LF-Tags or catalog resources セクションで、Named Data Catalog resources を選択します。
    1. Catalogs では <accountid> を選択します。
    2. Databases では ossblogdb を選択します。
  4. Database permissions で、DESCRIBECREATE TABLE を選択します。
  5. Grant を選択します。

spark_role にデータロケーション許可を付与

データレイク管理者としてサインインし、AWS CLI を使用して以下のコマンドを実行します。

aws lakeformation grant-permissions 
--principal '{"DataLakePrincipalIdentifier":"<Principal>"}' 
--permissions DATA_LOCATION_ACCESS 
--resource '{"DataLocation":{"CatalogId":"<Catalog ID>","ResourceArn":"<S3 bucket ARN>"}}' 
--region <aws_region>
XML

またはコンソール上で以下を実施します。

  1. Lake Formation コンソールのナビゲーションペインで、Data Locations を選択し、Grant を選択します。
  2. IAM users and roles では、spark_role を選択します。
  3. Storage locations では、バケット名を選択します。
  4. Grant を選択します。

AWS Glue Iceberg REST catalog エンドポイントを使用する Spark スクリプトのセットアップ

以下の内容で、oss_spark_customer_etl.py という名前のファイルをあなたの環境に作成します。

import sys
import os
import time
from pyspark.sql import SparkSession

#Replace <aws_region> with AWS region name.
#Replace <aws_account_id> with AWS account ID.

spark = SparkSession.builder.appName('osspark') \
.config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.1,software.amazon.awssdk:bundle:2.20.160,software.amazon.awssdk:url-connection-client:2.20.160') \
.config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
.config('spark.sql.defaultCatalog', 'spark_catalog') \
.config('spark.sql.catalog.spark_catalog', 'org.apache.iceberg.spark.SparkCatalog') \
.config('spark.sql.catalog.spark_catalog.type', 'rest') \
.config('spark.sql.catalog.spark_catalog.uri','https://glue.<aws_region>.amazonaws.com/iceberg') \
.config('spark.sql.catalog.spark_catalog.warehouse','<aws_account_id>') \
.config('spark.sql.catalog.spark_catalog.rest.sigv4-enabled','true') \
.config('spark.sql.catalog.spark_catalog.rest.signing-name','glue') \
.config('spark.sql.catalog.spark_catalog.rest.signing-region', <aws_region>) \
.config('spark.sql.catalog.spark_catalog.io-impl','org.apache.iceberg.aws.s3.S3FileIO') \
.config('spark.hadoop.fs.s3a.aws.credentials.provider','org.apache.hadoop.fs.s3a.SimpleAWSCredentialProvider') \
.config('spark.sql.catalog.spark_catalog.rest-metrics-reporting-enabled','false') \
.getOrCreate()
spark.sql("use ossblogdb").show()
spark.sql("""CREATE TABLE ossblogdb.customer (name string) USING iceberg location 's3://<3_bucket_name>/customer'""")
time.sleep(120)
spark.sql("insert into ossblogdb.customer values('Alice') ").show()
spark.sql("select * from ossblogdb.customer").show()
Python

Pyspark をローカルで起動し、 Amazon S3 上の Iceberg テーブルへの読み書き を検証する

pip install pyspark を実行します。 スクリプトをローカルに保存し、環境変数( AWS_ACCESS_KEY_ID , AWS_SECRET_ACCESS_KEY , AWS_SESSION_TOKEN)に spark_role の一時的な認証情報を設定します。

python /path/to/oss_spark_customer_etl.py を実行します。

Athena を使用して Iceberg テーブルのデータを表示することもできます。

他のデータチームがコンテンツを閲覧できるようにするには、Lake Formation コンソールを使用してデータチームの IAM ロールに読み取りアクセス権を付与します。

  1. Lake Formation コンソールのナビゲーションペインで、Data permissions を選択し、Grant を選択します。
  2. Principals セクションの IAM users and roles で、<iam_role>を選択します。
  3. LF-Tags or catalog resources セクションで、Named Data Catalog resources を選択します。
    1. Catalogs では <accountid> を選択します。
    2. Databases では ossblogdb を選択します。
    3. Tables では customer を選択します。
  4. DESCRIBESELECTテーブル権限に選択します。
  5. Grantを選択します。

IAM ロールでサインインし、以下のコマンドを実行します。

SELECT * FROM "ossblogdb"."customer" limit 10;
SQL

クリーンアップ

リソースをクリーンアップするには、以下の手順を実行します。

  1. Data Catalog で作成したリソース(データベース/テーブル)を削除します。
  2. S3バケットを空にして削除します

結論

この投稿では、Amazon S3 の Iceberg テーブルにアクセスするための Apache Spark と AWS Glue Iceberg Rest Catalog のシームレスな統合について説明し、Iceberg REST API を使用して読み取りと書き込みの操作を効果的に実行する方法を示しました。 このソリューションの素晴らしいところは、その柔軟性にあります。データセンターのベアメタルサーバーで Spark を実行している場合でも、 Kubernetes クラスタで実行している場合でも、その他の環境であっても、このアーキテクチャはニーズに合わせて適応させることができます。


著者について

Raj Ramasubbu は、Amazon Web Servicesのビッグデータおよびアナリティクス、AI / MLに特化したシニアアナリティクススペシャリストソリューションアーキテクトです。 AWS 上で拡張性、パフォーマンス、安全性の高いクラウドベースのソリューションを設計、構築するお客様を支援しています。 AWS 入社以前 20 年以上にわたり、データエンジニアリング、ビッグデータ分析、ビジネスインテリジェンス、データサイエンスソリューションの構築における技術的専門知識とリーダーシップを発揮してきました。 彼は、ヘルスケア、医療機器、ライフサイエンス、小売、資産管理、自動車保険、住宅用不動産投資信託、農業、タイトル保険、サプライチェーン、文書管理、不動産など、さまざまな業種のお客様を支援しました。

Srividya Parthasarathy は、 AWS Lake Formation チームのシニアビッグデータアーキテクトです。 プロダクトチームやお客様と協力して、分析データプラットフォーム向けの堅牢な機能とソリューションを構築しています。彼女は、データメッシュソリューションを構築し、コミュニティと共有することを楽しんでいます。

Pratik Das は、 AWS Lake Formation のシニアプロダクトマネージャーです。 データに関するあらゆることに情熱を持っており、お客様の要件を理解し、楽しいエクスペリエンスを構築するためにお客様と協力しています。 彼は、データドリブンソリューションと機械学習システムの構築経験があります。

翻訳は Solutions Architect 圓山が担当しました。原文はこちらです。