EMR Serverless の Lake Formation フルテーブルアクセス - Amazon EMR

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

EMR Serverless の Lake Formation フルテーブルアクセス

Amazon EMR リリース 7.8.0 以降では、ジョブランタイムロールにきめ細かなアクセスコントロールの制限なしに完全なテーブルアクセス許可がある Glue Data Catalog で AWS Lake Formation を活用できます。この機能を使用することにより、EMR Serverless Spark バッチジョブとインタラクティブジョブから Lake Formation によって保護されているテーブルを読み書きできます。Lake Formation の詳細と EMR Serverless での使用方法については、以下のセクションを参照してください。

フルテーブルアクセスでの Lake Formation の使用

AWS Lake Formation で保護された Glue データカタログテーブルには、EMR Serverless Spark ジョブまたはジョブのランタイムロールにフルテーブルアクセスがあるインタラクティブセッションからアクセスできます。EMR Serverless アプリケーションで AWS Lake Formation を有効にする必要はありません。Spark ジョブがフルテーブルアクセス (FTA) 用に設定されている場合、 AWS Lake Formation 認証情報は AWS Lake Formation 登録テーブルの S3 データの読み取り/書き込みに使用され、ジョブのランタイムロール認証情報は AWS Lake Formation に登録されていないテーブルの読み取り/書き込みに使用されます。

重要

きめ細かなアクセスコントロールのために AWS Lake Formation を有効にしないでください。ジョブは、フルテーブルアクセス (FTA) ときめ細かなアクセスコントロール (FGAC) を同じ EMR クラスターまたはアプリケーションに実行することはできません。

ステップ 1: Lake Formation でフルテーブルアクセスを有効にする

フルテーブルアクセス (FTA) モードを使用するには、 AWS Lake Formation の IAM セッションタグの検証なしでサードパーティーのクエリエンジンがデータにアクセスすることを許可する必要があります。有効にするには、「フルテーブルアクセスのためのアプリケーション統合」のステップに従います。

注記

クロスアカウントテーブルにアクセスする場合、プロデューサーアカウントとコンシューマーアカウントの両方でフルテーブルアクセスを有効にしなければなりません。同様に、クロスリージョンテーブルにアクセスする場合、この設定はプロデューサーリージョンとコンシューマーリージョンの両方で有効にしなければなりません。

ステップ 2: ジョブランタイムロールの IAM アクセス許可を設定する

基盤となるデータへの読み取りまたは書き込みアクセスには、Lake Formation アクセス許可に加えて、ジョブランタイムロールに lakeformation:GetDataAccess IAM アクセス許可が必要です。この許可があると、Lake Formation がデータにアクセスするための一時的な認証情報のリクエストを承諾します。

以下は、Amazon S3 のスクリプトにアクセスするための IAM アクセス許可、S3 AWS へのログのアップロード、Glue API アクセス許可、Lake Formation へのアクセス許可を指定する方法のポリシー例です。

JSON
{ "Version":"2012-10-17", "Statement": [ { "Sid": "ScriptAccess", "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::*.amzn-s3-demo-bucket/scripts" ] }, { "Sid": "LoggingAccess", "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket/logs/*" ] }, { "Sid": "GlueCatalogAccess", "Effect": "Allow", "Action": [ "glue:Get*", "glue:Create*", "glue:Update*" ], "Resource": [ "*" ] }, { "Sid": "LakeFormationAccess", "Effect": "Allow", "Action": [ "lakeformation:GetDataAccess" ], "Resource": [ "*" ] } ] }

ステップ 2.1 Lake Formation の許可を設定する

  • S3 からデータを読み取る Spark ジョブには、Lake Formation SELECT アクセス許可が必要です。

  • S3 でデータを書き込み/削除する Spark ジョブには、Lake Formation ALL (SUPER) アクセス許可が必要です。

  • Glue Data を操作する Spark ジョブには、必要に応じて DESCRIBE、ALTER、DROP アクセス許可が必要です。

詳細については、「Granting permissions on Data Catalog resources」を参照してください。

ステップ 3: Lake Formation を使用してフルテーブルアクセスのための Spark セッションを初期化する

前提条件

AWS Glue Data Catalog は、Lake Formation テーブルにアクセスするためのメタストアとして設定する必要があります。

Glue カタログをメタストアとして設定するには、以下の設定を行います:

--conf spark.sql.catalogImplementation=hive --conf spark.hive.metastore.client.factory.class=com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory

EMR Serverless の Data Catalog の有効化の詳細については、「Metastore configuration for EMR Serverless」を参照してください。

AWS Lake Formation に登録されたテーブルにアクセスするには、Spark の初期化中に Lake AWS Formation 認証情報を使用するように Spark を設定するには、次の設定を行う必要があります。

Hive
‐‐conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver --conf spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true --conf spark.hadoop.fs.s3.folderObject.autoAction.disabled=true --conf spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true --conf spark.sql.catalog.createDirectoryAfterTable.enabled=true --conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
Iceberg
--conf spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog --conf spark.sql.catalog.spark_catalog.warehouse=S3_DATA_LOCATION --conf spark.sql.catalog.spark_catalog.client.region=REGION --conf spark.sql.catalog.spark_catalog.type=glue --conf spark.sql.catalog.spark_catalog.glue.account-id=ACCOUNT_ID --conf spark.sql.catalog.spark_catalog.glue.lakeformation-enabled=true --conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
Delta Lake
‐‐conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver --conf spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true --conf spark.hadoop.fs.s3.folderObject.autoAction.disabled=true --conf spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true --conf spark.sql.catalog.createDirectoryAfterTable.enabled=true --conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
Hudi
‐‐conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver --conf spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true --conf spark.hadoop.fs.s3.folderObject.autoAction.disabled=true --conf spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true --conf spark.sql.catalog.createDirectoryAfterTable.enabled=true --conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true --conf spark.jars=/usr/lib/hudi/hudi-spark-bundle.jar --conf spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension --conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.hudi.catalog.HoodieCatalog --conf spark.serializer=org.apache.spark.serializer.KryoSerializer
  • spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver: Lake Formation 登録済みテーブルに AWS Lake Formation S3 認証情報を使用するように EMR Filesystem (EMRFS) または EMR S3A を設定します。 S3 テーブルが登録されていない場合は、ジョブのランタイムロール認証情報を使用します。

  • spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true および spark.hadoop.fs.s3.folderObject.autoAction.disabled=true: S3 フォルダの作成時に $folder$ サフィックスの代わりにコンテンツタイプヘッダー application/x-directory を使用するように EMRFS を設定します。Lake Formation 認証情報は $folder$ サフィックスを持つテーブルフォルダの読み取りを許可しないため、この設定は Lake Formation テーブルを読み取る際に必要です。

  • spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true: 作成前に空のテーブルの場所を検証するステップをスキップするよう Spark を設定します。空の場所を検証するための Lake Formation 認証情報は Glue Data Catalog テーブルの作成後にしか使用できないため、この設定は Lake Formation に登録されたテーブルに対して必要です。この設定がない場合、ジョブのランタイムロール認証情報によって空のテーブルの場所が検証されます。

  • spark.sql.catalog.createDirectoryAfterTable.enabled=true: Hive メタストアでテーブルを作成した後に Amazon S3 フォルダを作成するよう Spark を設定します。S3 フォルダを作成するための Lake Formation 認証情報は Glue Data Catalog テーブルの作成後にしか使用できないため、この設定は Lake Formation に登録されたテーブルに対して必要です。

  • spark.sql.catalog.dropDirectoryBeforeTable.enabled=true: Hive メタストアでテーブルを削除する前に S3 フォルダを削除するよう Spark を設定します。Glue Data Catalog からテーブルを削除した後は、S3 フォルダを削除するための Lake Formation 認証情報を使用できないため、この設定は Lake Formation に登録されたテーブルに対して必要です。

  • spark.sql.catalog.<catalog>.glue.lakeformation-enabled=true: AWS Lake Formation 登録済みテーブルに Lake Formation S3 認証情報を使用するように Iceberg カタログを設定します。テーブルが登録されていない場合は、デフォルトの環境認証情報を使用します。

SageMaker Unified Studio でフルテーブルアクセスモードを設定する

JupyterLab ノートブックのインタラクティブ Spark セッションから Lake Formation に登録されたテーブルにアクセスするには、互換性アクセス許可モードを使用します。%%configure magic コマンドを使用して Spark 設定をセットアップします。次のテーブルタイプに基づいて設定を選択します。

For Hive tables
%%configure -f { "conf": { "spark.hadoop.fs.s3.credentialsResolverClass": "com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver", "spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject": true, "spark.hadoop.fs.s3.folderObject.autoAction.disabled": true, "spark.sql.catalog.skipLocationValidationOnCreateTable.enabled": true, "spark.sql.catalog.createDirectoryAfterTable.enabled": true, "spark.sql.catalog.dropDirectoryBeforeTable.enabled": true } }
For Iceberg tables
%%configure -f { "conf": { "spark.sql.catalog.spark_catalog": "org.apache.iceberg.spark.SparkSessionCatalog", "spark.sql.catalog.spark_catalog.warehouse": "S3_DATA_LOCATION", "spark.sql.catalog.spark_catalog.client.region": "REGION", "spark.sql.catalog.spark_catalog.type": "glue", "spark.sql.catalog.spark_catalog.glue.account-id": "ACCOUNT_ID", "spark.sql.catalog.spark_catalog.glue.lakeformation-enabled": "true", "spark.sql.catalog.dropDirectoryBeforeTable.enabled": "true", } }
For Delta Lake tables
%%configure -f { "conf": { "spark.hadoop.fs.s3.credentialsResolverClass": "com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver", "spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject": true, "spark.hadoop.fs.s3.folderObject.autoAction.disabled": true, "spark.sql.catalog.skipLocationValidationOnCreateTable.enabled": true, "spark.sql.catalog.createDirectoryAfterTable.enabled": true, "spark.sql.catalog.dropDirectoryBeforeTable.enabled": true } }
For Hudi tables
%%configure -f { "conf": { "spark.hadoop.fs.s3.credentialsResolverClass": "com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver", "spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject": true, "spark.hadoop.fs.s3.folderObject.autoAction.disabled": true, "spark.sql.catalog.skipLocationValidationOnCreateTable.enabled": true, "spark.sql.catalog.createDirectoryAfterTable.enabled": true, "spark.sql.catalog.dropDirectoryBeforeTable.enabled": true, "spark.jars": "/usr/lib/hudi/hudi-spark-bundle.jar", "spark.sql.extensions": "org.apache.spark.sql.hudi.HoodieSparkSessionExtension", "spark.sql.catalog.spark_catalog": "org.apache.spark.sql.hudi.catalog.HoodieCatalog", "spark.serializer": "org.apache.spark.serializer.KryoSerializer" } }

プレースホルダーを置き換えます:

  • S3_DATA_LOCATION: S3 バケットパス

  • REGION: AWS region (us-east-1 など)

  • ACCOUNT_ID: AWS アカウント ID

注記

ノートブックで Spark 操作を実行する前に、これらの設定を行う必要があります。

サポートされているオペレーション

これらのオペレーションでは、 AWS Lake Formation 認証情報を使用してテーブルデータにアクセスします。

  • CREATE TABLE

  • ALTER TABLE

  • INSERT INTO

  • INSERT OVERWRITE

  • UPDATE

  • MERGE INTO

  • DELETE FROM

  • ANALYZE TABLE

  • REPAIR TABLE

  • DROP TABLE

  • Spark データソースクエリ

  • Spark データソース書き込み

注記

上記に示されていない操作は、引き続き IAM アクセス許可を使用してテーブルデータにアクセスします。

考慮事項

  • フルテーブルアクセスが有効になっていないジョブを使用して Hive テーブルが作成され、レコードが挿入されていない場合、フルテーブルアクセスを持つジョブからの後続の読み取りまたは書き込みは失敗します。これは、フルテーブルアクセスを持たない EMR Spark がテーブルフォルダ名に $folder$ サフィックスを追加するためです。この問題は、以下のいずれかの方法で解決できます。

    • FTA が有効になっていないジョブからテーブルに少なくとも 1 つの行を挿入します。

    • S3 のフォルダ名に $folder$ サフィックスが使用されないようにするため、FTA が有効になっていないジョブを設定します。そのために、Spark の設定を spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true にします。

    • S3 コンソールまたは AWS S3 CLI s3://path/to/table/table_nameを使用して、テーブルの場所に AWS S3 フォルダを作成します。

  • フルテーブルアクセスは、Amazon EMR リリース 7.8.0 以降の EMR ファイルシステム (EMRFS)、および Amazon EMR リリース 7.10.0 以降の S3A ファイルシステムでサポートされています。

  • フルテーブルアクセスは、Hive、Iceberg、Delta、および Hudi テーブルでサポートされています。

  • Hudi FTA 書き込みサポートに関する考慮事項:

    • Hudi FTA 書き込みでは、ジョブ実行中の認証情報の払い出しに HoodieCredentialedHadoopStorage を使用する必要があります。Hudi ジョブを実行するときは、次の設定を行います。 hoodie.storage.class=org.apache.spark.sql.hudi.storage.HoodieCredentialedHadoopStorage

    • Hudi のフルテーブルアクセス (FTA) 書き込みサポートは、Amazon EMR リリース 7.12 以降で利用できます。

    • Hudi FTA 書き込みサポートは現在、デフォルトの Hudi 設定でのみ機能します。カスタムまたはデフォルト以外の Hudi 設定は完全にサポートされていない可能性があり、予期しない動作が発生する可能性があります。

    • Hudi Merge-On-Read (MOR) テーブルのクラスタリングは、現時点では FTA 書き込みモードではサポートされていません。

  • Lake Formation きめ細かなアクセスコントロール (FGAC) ルールまたは Glue Data Catalog ビューを持つテーブルを参照するジョブは失敗します。FGAC ルールまたは Glue Data Catalog ビューを使用してテーブルをクエリするには、FGAC モードを使用する必要があります。FGAC モードを有効にするには、 AWS ドキュメント「EMR Serverless with AWS Lake Formation を使用してきめ細かなアクセスコントロールを行う」で説明されているステップに従います。

  • フルテーブルアクセスは Spark ストリーミングをサポートしていません。

  • Lake Formation テーブルに Spark DataFrame を書き込む場合、Hive テーブルと Iceberg テーブルでは APPEND モードのみがサポートされます: df.write.mode("append").saveAsTable(table_name)

  • 外部テーブルを作成するには、IAM アクセス許可が必要です。

  • Lake Formation は Spark ジョブ内に認証情報を一時的にキャッシュするため、現在実行中の Spark バッチジョブまたはインタラクティブセッションには、アクセス許可の変更が反映されない場合があります。

  • ロールには、サービスにリンクされたロール: Lake Formation の要件ではなく、ユーザー定義のロールを使用する必要があります。

Hudi FTA 書き込みサポート - サポートされているオペレーション

次の表は、フルテーブルアクセスモードで Hudi Copy-On-Write (COW) テーブルと Merge-On-Read (MOR) テーブルでサポートされている書き込みオペレーションを示しています。

Hudi FTA でサポートされている書き込みオペレーション
テーブルタイプ 運用 SQL Write コマンド ステータス
COW INSERT INSERT INTO TABLE サポート
COW INSERT INSERT INTO TABLE - PARTITION (静的、動的) サポート
COW INSERT INSERT OVERWRITE サポート
COW INSERT INSERT OVERWRITE - PARTITION (静的、動的) サポート
UPDATE UPDATE UPDATE TABLE サポート
COW UPDATE UPDATE TABLE - パーティションの変更 サポート外
DELETE DELETE TABLE から削除する サポート
ALTER ALTER テーブルの変更 - 名前を に変更する サポート外
COW ALTER テーブルの変更 - TBLPROPERTIES の設定 サポート
COW ALTER テーブルの変更 - TBLPROPERTIES の設定を解除する サポート
COW ALTER テーブルの変更 - 列の変更 サポート
COW ALTER テーブルの変更 - 列の追加 サポート
COW ALTER テーブルの変更 - パーティションの追加 サポート
COW ALTER テーブルの変更 - パーティションの削除 サポート
COW ALTER テーブルの変更 - パーティションの復元 サポート
COW ALTER テーブル同期パーティションの修復 サポート
DROP DROP DROP TABLE サポート
COW DROP DROP TABLE - 購入 サポート
CREATE CREATE CREATE TABLE - マネージド サポート
COW CREATE テーブルの作成 - によるパーティション分割 サポート
COW CREATE テーブルが存在しない場合は作成 サポート
COW CREATE CREATE TABLE LIKE サポート
COW CREATE CREATE TABLE AS SELECT サポート
CREATE CREATE CREATE TABLE with LOCATION - 外部テーブル サポート外
DATAFRAME(INSERT) DATAFRAME(INSERT) saveAsTable.Overwrite サポート
COW DATAFRAME(INSERT) saveAsTable.Append サポート外
COW DATAFRAME(INSERT) saveAsTable.Ignore サポート
COW DATAFRAME(INSERT) saveAsTable.ErrorIfExists サポート
COW DATAFRAME(INSERT) saveAsTable - 外部テーブル (パス) サポート外
COW DATAFRAME(INSERT) save(path) - DF v1 サポート外
MOR INSERT INSERT INTO TABLE サポート
MOR INSERT INSERT INTO TABLE - PARTITION (静的、動的) サポート
MOR INSERT INSERT OVERWRITE サポート
MOR INSERT INSERT OVERWRITE - PARTITION (静的、動的) サポート
UPDATE UPDATE UPDATE TABLE サポート
MOR UPDATE UPDATE TABLE - パーティションの変更 サポート外
DELETE DELETE テーブルから削除する サポート
ALTER ALTER テーブルの変更 - 名前を に変更する サポート外
MOR ALTER テーブルの変更 - TBLPROPERTIES の設定 サポート
MOR ALTER テーブルの変更 - TBLPROPERTIES の設定を解除する サポート
MOR ALTER テーブルの変更 - 列の変更 サポート
MOR ALTER テーブルの変更 - 列の追加 サポート
MOR ALTER テーブルの変更 - パーティションの追加 サポート
MOR ALTER テーブルの変更 - パーティションの削除 サポート
MOR ALTER テーブルの変更 - パーティションの復元 サポート
MOR ALTER テーブル同期パーティションの修復 サポート
DROP DROP DROP TABLE サポート
MOR DROP DROP TABLE - 購入 サポート
CREATE CREATE CREATE TABLE - マネージド サポート
MOR CREATE テーブルの作成 - によるパーティション分割 サポート
MOR CREATE テーブルが存在しない場合は作成 サポート
MOR CREATE CREATE TABLE LIKE サポート
MOR CREATE CREATE TABLE AS SELECT サポート
CREATE CREATE CREATE TABLE with LOCATION - 外部テーブル サポート外
DATAFRAME (UPSERT) DATAFRAME (UPSERT) saveAsTable.Overwrite サポート
MOR DATAFRAME (UPSERT) saveAsTable.Append サポート外
MOR DATAFRAME (UPSERT) saveAsTable.Ignore サポート
MOR DATAFRAME (UPSERT) saveAsTable.ErrorIfExists サポート
MOR DATAFRAME (UPSERT) saveAsTable - 外部テーブル (パス) サポート外
MOR DATAFRAME (UPSERT) save(path) - DF v1 サポート外
DATAFRAME (削除) DATAFRAME (削除) saveAsTable.Append サポート外
MOR DATAFRAME (削除) saveAsTable - 外部テーブル (パス) サポート外
MOR DATAFRAME (削除) save(path) - DF v1 サポート外
DATAFRAME(BULK_INSERT) DATAFRAME(BULK_INSERT) saveAsTable.Overwrite サポート
MOR DATAFRAME(BULK_INSERT) saveAsTable.Append サポート外
MOR DATAFRAME(BULK_INSERT) saveAsTable.Ignore サポート
MOR DATAFRAME(BULK_INSERT) saveAsTable.ErrorIfExists サポート
MOR DATAFRAME(BULK_INSERT) saveAsTable - 外部テーブル (パス) サポート外
MOR DATAFRAME(BULK_INSERT) save(path) - DF v1 サポート外