での EMR Serverless を使用したきめ AWS Lake Formation 細かなアクセスコントロール - Amazon EMR

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

での EMR Serverless を使用したきめ AWS Lake Formation 細かなアクセスコントロール

概要

Amazon EMR リリース 7.2.0 以降では、 AWS Lake Formation を活用して、S3 でバックアップされた Data Catalog テーブルにきめ細かなアクセスコントロールを適用します。この機能を使用すると、Amazon EMR Serverless Spark ジョブ内の read クエリにテーブル、行、列、セルレベルのアクセスコントロールを設定できます。Apache Spark バッチジョブとインタラクティブセッションできめ細かなアクセスコントロールを設定するには、EMR Studio を使用します。Lake Formation の詳細と EMR Serverless での使用方法については、以下のセクションを参照してください。

で Amazon EMR Serverless AWS Lake Formation を使用すると、追加料金が発生します。詳細については、「Amazon EMR の料金」を参照してください。

EMR Serverless と AWS Lake Formationの連携の仕組み

EMR Serverless と Lake Formation を使用すると、各 Spark ジョブにアクセス許可のレイヤーを適用して、EMR Serverless がジョブを実行するときに Lake Formation アクセス許可コントロールを適用できます。EMR Serverless は、Spark リソースプロファイルを使用して 2 つのプロファイルを作成し、ジョブを効果的に実行します。ユーザープロファイルはユーザー提供のコードを実行し、システムプロファイルは Lake Formation ポリシーを適用します。詳細については、「 とは AWS Lake Formation」および「考慮事項と制限事項」を参照してください。

Lake Formation で事前初期化された容量を使用する場合は、最低 2 つの Spark ドライバーを使用することをお勧めします。Lake Formation 対応ジョブごとに 2 つの Spark ドライバー (1 つはユーザープロファイル用、1 つはシステムプロファイル用) を使用します。最高のパフォーマンスを得るには、Lake Formation を使用しない場合と比較して、Lake Formation が有効なジョブのドライバーの数を 2 倍にします。

EMR Serverless で Spark ジョブを実行するときは、リソース管理とクラスターパフォーマンスに対する動的割り当ての影響も考慮してください。リソースプロファイルあたりのエグゼキュターspark.dynamicAllocation.maxExecutorsの最大数の設定は、ユーザーエグゼキュターとシステムエグゼキュターに適用されます。その数を最大許容エグゼキュター数と等しく設定すると、利用可能なすべてのリソースを使用する 1 つのタイプのエグゼキュターが原因でジョブの実行が停止し、ジョブの実行時に他のエグゼキュターが使用できなくなる可能性があります。

したがって、リソースが不足しないように、EMR Serverless はリソースプロファイルあたりのデフォルトの最大エグゼキュター数を spark.dynamicAllocation.maxExecutors 値の 90% に設定します。この設定は、spark.dynamicAllocation.maxExecutorsRatio を 0 から 1 までの値で指定すると上書きできます。さらに、リソースの割り当てと全体的なパフォーマンスを最適化するために、次のプロパティも設定します。

  • spark.dynamicAllocation.cachedExecutorIdleTimeout

  • spark.dynamicAllocation.shuffleTracking.timeout

  • spark.cleaner.periodicGC.interval

以下は、EMR Serverless が Lake Formation セキュリティポリシーで保護されたデータにアクセスする方法の概要を示します。

Amazon EMR が Lake Formation セキュリティポリシーで保護されたデータにアクセスする方法。
  1. ユーザーは、Spark ジョブを AWS Lake Formation有効な EMR Serverless アプリケーションに送信します。

  2. EMR Serverless はジョブをユーザードライバーに送信し、ユーザープロファイルでジョブを実行します。ユーザードライバーは、タスクの起動、エグゼキュターのリクエスト、S3 または Glue カタログへのアクセスができない Spark のリーンバージョンを実行します。ジョブプランを構築します。

  3. EMR Serverless は、システムドライバーと呼ばれる 2 番目のドライバーを設定し、システムプロファイルで (特権 ID を使用して) 実行します。EMR Serverless は、通信用の 2 つのドライバー間に暗号化された TLS チャネルを設定します。ユーザードライバーはチャネルを使用して、ジョブプランをシステムドライバーに送信します。システムドライバーは、ユーザーが送信したコードを実行しません。フル Spark を実行して、データアクセスのために S3 およびデータカタログと通信します。エグゼキュターをリクエストし、ジョブプランを一連の実行ステージにコンパイルします。

  4. 次に、EMR Serverless はユーザードライバーまたはシステムドライバーを使用してエグゼキュターでステージを実行します。どのステージのユーザーコードも、ユーザープロファイルのエグゼキュターでのみ実行されます。

  5. で保護された Data Catalog テーブルからデータを読み取るステージ AWS Lake Formation 、またはセキュリティフィルターを適用するステージは、システムエグゼキュターに委任されます。

Amazon EMR での Lake Formation の有効化

Lake Formation を有効にするには、EMR Serverless アプリケーションを作成するときに、ランタイム設定パラメータのspark-defaults分類truespark.emr-serverless.lakeformation.enabledに設定します。

aws emr-serverless create-application \ --release-label emr-7.10.0 \ --runtime-configuration '{ "classification": "spark-defaults", "properties": { "spark.emr-serverless.lakeformation.enabled": "true" } }' \ --type "SPARK"

EMR Studio で新しいアプリケーションを作成するときに Lake Formation を有効にすることもできます。[追加の設定] で利用可能な [Lake Formation のきめ細かなアクセスコントロールを使用する] を選択します。

EMR Serverless で Lake Formation を使用する場合、ワーカー間の暗号化はデフォルトで有効になっているため、ワーカー間の暗号化を再度明示的に有効にする必要はありません。

Spark ジョブの Lake Formation の有効化

個々の Spark ジョブの Lake Formation を有効にするには、spark-submit の使用時に spark.emr-serverless.lakeformation.enabled を true に設定します。

--conf spark.emr-serverless.lakeformation.enabled=true

ジョブランタイムロールの IAM アクセス許可

Lake Formation のアクセス許可は、Glue Data Catalog AWS リソース、Amazon S3 ロケーション、およびそれらのロケーションの基盤となるデータへのアクセスを制御します。IAM アクセス許可は、Lake Formation および AWS Glue API とリソースへのアクセスを制御します。データカタログ内のテーブルにアクセスするための Lake Formation アクセス許可 (SELECT) を持っていても、glue:Get* API オペレーションに対する IAM アクセス許可がない場合、操作は失敗します。

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

JSON
{ "Version":"2012-10-17", "Statement": [ { "Sid": "ScriptAccess", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::*.amzn-s3-demo-bucket/scripts", "arn:aws:s3:::*.amzn-s3-demo-bucket/*" ] }, { "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": [ "*" ] } ] }

ジョブランタイムロールの Lake Formation アクセス許可の設定

まず、Hive テーブルの場所を Lake Formation に登録します。次に、目的のテーブルにジョブランタイムロールのアクセス許可を作成します。Lake Formation の詳細については、「 AWS Lake Formation デベロッパーガイド」の「What is AWS Lake Formation?」を参照してください。

Lake Formation アクセス許可を設定したら、Amazon EMR Serverless で Spark ジョブを送信します。Spark ジョブの詳細については、「Spark の例」を参照してください。

ジョブ実行の送信

Lake Formation 許可の設定が完了したら、EMR Serverless で Spark ジョブを送信できます。次のセクションでは、ジョブ実行プロパティを設定して送信する方法の例を示します。

オープンテーブル形式のサポート

EMR Serverless は、リリース 7.6.0 の時点で Apache Hive、Apache Iceberg、および Delta Lake と Apache Hudi をサポートしています。オペレーションのサポートについては、次のタブを参照してください。

Hive
オペレーション 注意
読み込みオペレーション 完全サポートされています
増分クエリ 該当しない
タイムトラベルクエリ このテーブル形式には適用されません
DML INSERT IAM アクセス許可のみ
DML UPDATE このテーブル形式には適用されません
DML DELETE このテーブル形式には適用されません
DDL コマンド IAM アクセス許可のみ
メタデータテーブル このテーブル形式には適用されません
ストアドプロシージャ 該当しない
テーブルのメンテナンスとユーティリティの機能 該当しない
Iceberg
オペレーション 注意
読み込みオペレーション 完全サポートされています
増分クエリ 完全サポートされています
タイムトラベルクエリ 完全サポートされています
DML INSERT IAM アクセス許可のみ
DML UPDATE IAM アクセス許可のみ
DML DELETE IAM アクセス許可のみ
DDL コマンド IAM アクセス許可のみ
メタデータテーブル サポートされていますが、特定のテーブルは非表示になっています。詳細については、「考慮事項と制限」を参照してください。
ストアドプロシージャ register_table および migrate の例外でサポートされます。詳細については、「考慮事項と制限」を参照してください。
テーブルのメンテナンスとユーティリティの機能 該当しない

Iceberg の Spark 設定: 次のサンプルは、Iceberg で Spark を設定する方法を示しています。Iceberg ジョブを実行するには、次のspark-submitプロパティを指定します。

--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.glue.account-id=<ACCOUNT_ID> --conf spark.sql.catalog.spark_catalog.client.region=<REGION> --conf spark.sql.catalog.spark_catalog.glue.endpoint=https://glue.<REGION>.amazonaws.com
Hudi
オペレーション 注意
読み込みオペレーション 完全サポートされています
増分クエリ 完全サポートされています
タイムトラベルクエリ 完全サポートされています
DML INSERT IAM アクセス許可のみ
DML UPDATE IAM アクセス許可のみ
DML DELETE IAM アクセス許可のみ
DDL コマンド IAM アクセス許可のみ
メタデータテーブル サポートされていません
ストアドプロシージャ 該当しない
テーブルのメンテナンスとユーティリティの機能 サポートされていません

次の例では、Hudi を使用して Spark を設定し、ファイルの場所と使用に必要なその他のプロパティを指定します。

Hudi の Spark 設定: このスニペットをノートブックで使用すると、Hudi Spark バンドル JAR ファイルへのパスが指定され、Spark の Hudi 機能が有効になります。また、 Glue データカタログをメタストアとして使用するように AWS Spark を設定します。

%%configure -f { "conf": { "spark.jars": "/usr/lib/hudi/hudi-spark-bundle.jar", "spark.hadoop.hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory", "spark.serializer": "org.apache.spark.serializer.JavaSerializer", "spark.sql.catalog.spark_catalog": "org.apache.spark.sql.hudi.catalog.HoodieCatalog", "spark.sql.extensions": "org.apache.spark.sql.hudi.HoodieSparkSessionExtension" } }

AWS Glue を使用した Hudi の Spark 設定: このスニペットをノートブックで使用すると、Hudi はサポートされているデータレイク形式として有効になり、Hudi ライブラリと依存関係が利用可能になります。

%%configure { "--conf": "spark.serializer=org.apache.spark.serializer.JavaSerializer --conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.hudi.catalog.HoodieCatalog --conf spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension", "--datalake-formats": "hudi", "--enable-glue-datacatalog": True, "--enable-lakeformation-fine-grained-access": "true" }
Delta Lake
オペレーション 注意
読み込みオペレーション 完全サポートされています
増分クエリ 完全サポートされています
タイムトラベルクエリ 完全サポートされています
DML INSERT IAM アクセス許可のみ
DML UPDATE IAM アクセス許可のみ
DML DELETE IAM アクセス許可のみ
DDL コマンド IAM アクセス許可のみ
メタデータテーブル サポートされていません
ストアドプロシージャ 該当しない
テーブルのメンテナンスとユーティリティの機能 サポートされていません

Delta Lake での EMR Serverless: EMR Serverless で Lake Formation で Delta Lake を使用するには、次のコマンドを実行します。

spark-sql \ --conf spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension,com.amazonaws.emr.recordserver.connector.spark.sql.RecordServerSQLExtension \ --conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog \