

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

# EC2 での Amazon EMR の Lake Formation フルテーブルアクセス
<a name="lake-formation-unfiltered-ec2-access"></a>

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

## フルテーブルアクセスでの Lake Formation の使用
<a name="lake-formation-unfiltered-ec2-full-access"></a>

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

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

### ステップ 1: Lake Formation でフルテーブルアクセスを有効にする
<a name="lake-formation-unfiltered-ec2-full-table-access"></a>

フルテーブルアクセス (FTA) モードを使用するには、 AWS Lake Formation の IAM セッションタグの検証なしでサードパーティーのクエリエンジンがデータにアクセスすることを許可する必要があります。有効にするには、「[フルテーブルアクセスのためのアプリケーション統合](https://docs.aws.amazon.com/lake-formation/latest/dg/full-table-credential-vending.html)」のステップに従います。

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

### ステップ 2: ジョブランタイムロールの IAM アクセス許可を設定する
<a name="lake-formation-unfiltered-ec2-iam-permissions"></a>

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

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

#### ステップ 2.1 Lake Formation の許可を設定する
<a name="lake-formation-unfiltered-ec2-permission-model"></a>
+ S3 からデータを読み取る Spark ジョブには、Lake Formation SELECT アクセス許可が必要です。
+ S3 でデータを書き込み/削除する Spark ジョブには、Lake Formation ALL (SUPER) アクセス許可が必要です。
+ Glue Data を操作する Spark ジョブには、必要に応じて DESCRIBE、ALTER、DROP アクセス許可が必要です。

詳細については、「[Granting permissions on Data Catalog resources](https://docs.aws.amazon.com/lake-formation/latest/dg/granting-catalog-permissions.html)」を参照してください。

### ステップ 3: Lake Formation を使用してフルテーブルアクセスのための Spark セッションを初期化する
<a name="lake-formation-unfiltered-ec2-spark-session"></a>

#### 前提条件
<a name="lake-formation-unfiltered-ec2-spark-session-prereq"></a>

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
```

EC2 で Amazon EMR のデータカタログを有効にする方法の詳細については、[EC2 での Amazon EMR のメタストア設定](metastore-config.html)」を参照してください。

 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 でフルテーブルアクセスモードを設定する
<a name="lake-formation-unfiltered-ec2-full-table"></a>

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 操作を実行する前に、これらの設定を行う必要があります。

#### サポートされているオペレーション
<a name="lake-formation-unfiltered-ec2-supported-operations"></a>

これらのオペレーションでは、 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 アクセス許可を使用してテーブルデータにアクセスします。

#### 考慮事項
<a name="considerations"></a>
+ フルテーブルアクセスが有効になっていないジョブを使用して 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 ドキュメントで説明されている手順に従います。[AWS Lake Formation で EC2 上の Amazon EMR を使用してきめ細かなアクセスコントロールを行います](emr-serverless-lf-enable.html)。
+ フルテーブルアクセスは Spark ストリーミングをサポートしていません。
+ Lake Formation テーブルに Spark DataFrame を書き込む場合、Hive テーブルと Iceberg テーブルでは APPEND モードのみがサポートされます: `df.write.mode("append").saveAsTable({{table_name}})`
+ 外部テーブルを作成するには、IAM アクセス許可が必要です。
+ Lake Formation は Spark ジョブ内に認証情報を一時的にキャッシュするため、現在実行中の Spark バッチジョブまたはインタラクティブセッションには、アクセス許可の変更が反映されない場合があります。
+ ロールには、サービスにリンクされたロール: [Lake Formation の要件ではなく、ユーザー定義のロール](https://docs.aws.amazon.com/lake-formation/latest/dg/registration-role.html)を使用する必要があります。

#### Hudi FTA 書き込みサポート - サポートされているオペレーション
<a name="hudi-fta-supported-operations"></a>

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


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

| テーブルタイプ | 運用 | SQL Write コマンド | ステータス | 
| --- | --- | --- | --- | 
| COW | INSERT | テーブルに挿入する | サポート | 
| 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 | テーブルから削除する | サポート | 
| 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 | テーブルに挿入する | サポート | 
| 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 (DELETE) | DATAFRAME (DELETE) | saveAsTable.Append | サポート外 | 
| MOR | DATAFRAME (DELETE) | saveAsTable - 外部テーブル (パス) | サポート外 | 
| MOR | DATAFRAME (DELETE) | 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 | サポート外 | 