

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 EMR Serverless 搭配 AWS Lake Formation 進行精細存取控制
<a name="emr-serverless-lf-enable"></a>

## 概觀
<a name="emr-serverless-lf-enable-overview"></a>

使用 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 定價](https://aws.amazon.com/emr/pricing/)。

## EMR Serverless 如何使用 AWS Lake Formation
<a name="emr-serverless-lf-enable-how-it-works"></a>

搭配 Lake Formation 使用 EMR Serverless 可讓您對每個 Spark 任務強制執行一層許可，以在 EMR Serverless 執行任務時套用 Lake Formation 許可控制。EMR Serverless 使用 [ Spark 資源描述](https://spark.apache.org/docs/latest/api/java/org/apache/spark/resource/ResourceProfile.html)檔來建立兩個描述檔，以有效地執行任務。使用者設定檔會執行使用者提供的程式碼，而系統設定檔則會強制執行 Lake Formation 政策。如需詳細資訊，請參閱[什麼是 AWS Lake Formation](https://docs.aws.amazon.com/lake-formation/latest/dg/what-is-lake-formation.html) 以及[考量和限制](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/emr-serverless-lf-enable-considerations.html)。

當您搭配 Lake Formation 使用預先初始化的容量時，我們建議您至少有兩個 Spark 驅動程式。每個啟用 Lake Formation 的任務都會使用兩個 Spark 驅動程式，一個用於使用者設定檔，另一個用於系統設定檔。為了獲得最佳效能，如果您不使用 Lake Formation，請使用已啟用 Lake Formation 任務的驅動程式數量的兩倍。

當您在 EMR Serverless 上執行 Spark 任務時，也請考慮動態配置對資源管理和叢集效能的影響。每個資源設定檔的執行器數目`spark.dynamicAllocation.maxExecutors`上限組態適用於使用者和系統執行器。如果您將該數目設定為等於允許的執行器數量上限，您的任務執行可能會因為使用所有可用資源的一種執行器類型而停滯，這會在您執行任務任務時防止其他執行器。

因此，您不會耗盡資源，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 安全政策保護的資料。](http://docs.aws.amazon.com/zh_tw/emr/latest/EMR-Serverless-UserGuide/images/lf-emr-s-architecture.png)


1. 使用者將 Spark 任務提交至 AWS Lake Formation已啟用 EMR Serverless 應用程式。

1. EMR Serverless 會將任務傳送給使用者驅動程式，並在使用者設定檔中執行任務。使用者驅動程式會執行 Spark 的精簡版本，該版本無法啟動任務、請求執行器、存取 S3 或 Glue Catalog。其會建置任務計畫。

1. EMR Serverless 會設定第二個稱為系統驅動程式的驅動程式，並在系統設定檔中執行它 （具有特殊權限身分）。EMR Serverless 會在兩個驅動程式之間設定加密的 TLS 頻道以進行通訊。使用者驅動程式使用該頻道將任務計劃傳送至系統驅動程式。系統驅動程式不會執行使用者提交的程式碼。其會執行完整的 Spark，並與 S3 和 Data Catalog 通訊以進行資料存取。其會請求執行器，並將任務計畫編譯成一系列的執行階段。

1. 然後，EMR Serverless 會使用使用者驅動程式或系統驅動程式在執行器上執行階段。任何階段的使用者程式碼只會在使用者設定檔執行器上執行。

1. 從受 保護的資料目錄資料表 AWS Lake Formation 或套用安全篩選條件的資料表讀取資料的階段，會委派給系統執行器。

## 在 Amazon EMR 中啟用 Lake Formation
<a name="emr-serverless-lf-enable-config"></a>

若要啟用 Lake Formation，請在[建立 EMR Serverless 應用程式](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/getting-started.html#gs-application-console)時，將 Runtime-configuration 參數的`spark-defaults`分類`spark.emr-serverless.lakeformation.enabled`設為 `true` 。

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

您也可以在 EMR Studio 中建立新應用程式時啟用 Lake Formation。選擇**使用 Lake Formation 進行精細存取控制**，可在**其他組態**下使用。

使用 Lake Formation 搭配 EMR Serverless 時，預設會啟用[工作者間加密](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/interworker-encryption.html)，因此您不需要再次明確啟用工作者間加密。

**為 Spark 任務啟用 Lake Formation**

若要為個別 Spark 任務啟用 Lake Formation，請在使用 時`spark.emr-serverless.lakeformation.enabled`將 設定為 true`spark-submit`。

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

## 任務執行時期角色 IAM 許可
<a name="emr-serverless-lf-enable-permissions"></a>

Lake Formation 許可控制對 AWS Glue Data Catalog 資源、Amazon S3 位置和這些位置基礎資料的存取。IAM 許可可控制對 Lake Formation 和 AWS Glue API 和資源的存取。雖然您可能具有 Lake Formation 許可來存取 Data Catalog (SELECT) 中的資料表，但是如果您沒有 `glue:Get*` API 操作的 IAM 許可，您的操作會失敗。

以下範例政策說明如何提供 IAM 許可來存取 S3 中的指令碼 (將日誌上傳至 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 許可
<a name="emr-serverless-lf-enable-set-up-grants-for-role"></a>

首先，向 Lake Formation 註冊 Hive 資料表的位置。然後在所需的資料表上建立任務執行時期角色的許可。如需 Lake Formation 的詳細資訊，請參閱[什麼是 AWS Lake Formation？](https://docs.aws.amazon.com/lake-formation/latest/dg/what-is-lake-formation.html) 《 *AWS Lake Formation 開發人員指南*》中的 。

設定 Lake Formation 許可後，請在 Amazon EMR Serverless 上提交 Spark 任務。如需 Spark 任務的詳細資訊，請參閱 [Spark 範例](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/jobs-spark.html#spark-examples)。

## 提交任務執行
<a name="emr-serverless-lf-enable-submit-job"></a>

完成 Lake Formation 授予的設定後，您可以在 [ EMR Serverless 上提交 Spark 任務。](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/jobs-spark.html#spark-examples)以下章節顯示如何設定和提交任務執行屬性的範例。

## 許可要求
<a name="emr-serverless-lf-enable-otf-permissions"></a>

### 資料表未在 中註冊 AWS Lake Formation
<a name="emr-s-lf-otf-permissions"></a>

對於未向 註冊的資料表 AWS Lake Formation，任務執行期角色會存取 AWS Glue Data Catalog 和 Amazon S3 中的基礎資料表資料。這需要任務執行期角色具有 Glue 和 Amazon S3 AWS 操作的適當 IAM 許可。

### 在 中註冊的資料表 AWS Lake Formation
<a name="emr-s-lf-otf-permissions-tables-lf-registered"></a>

對於向 註冊的資料表 AWS Lake Formation，任務執行時間角色會存取 AWS Glue Data Catalog 中繼資料，而 Lake Formation 提供的臨時憑證則會存取 Amazon S3 中的基礎資料表資料。執行 操作所需的 Lake Formation 許可取決於 Spark 任務啟動的 AWS Glue Data Catalog 和 Amazon S3 API 呼叫，可以摘要如下：
+ **DESCRIBE** 許可允許執行期角色讀取 Data Catalog 中的資料表或資料庫中繼資料
+ **ALTER** 許可允許執行期角色修改 Data Catalog 中的資料表或資料庫中繼資料
+ **DROP** 許可允許執行期角色從 Data Catalog 刪除資料表或資料庫中繼資料
+ **SELECT** 許可允許執行期角色從 Amazon S3 讀取資料表資料
+ **INSERT** 許可允許執行期角色將資料表資料寫入 Amazon S3
+ **DELETE** 許可允許執行期角色從 Amazon S3 刪除資料表資料
**注意**  
當 Spark 任務呼叫 AWS Glue 擷取資料表中繼資料和 Amazon S3 擷取資料表資料時，Lake Formation 會延遲評估許可。在 Spark 進行需要缺少許可的 AWS Glue 或 Amazon S3 呼叫之前，使用執行時間角色且許可不足的任務不會失敗。

**注意**  
在下列支援的資料表矩陣中：  
標示為 **Supported** 的操作只會使用 Lake Formation 登入資料來存取向 Lake Formation 註冊之資料表的資料表資料。如果 Lake Formation 許可不足，操作將不會回復為執行時間角色登入資料。對於未向 Lake Formation 註冊的資料表，任務執行期角色登入資料會存取資料表資料。
在 **Amazon S3 位置上標記為支援 IAM 許可**的操作不會使用 Lake Formation 登入資料來存取 Amazon S3 中的基礎資料表資料。若要執行這些操作，任務執行時間角色必須具有存取資料表資料所需的 Amazon S3 IAM 許可，無論資料表是否已向 Lake Formation 註冊。

------
#### [ Hive ]

[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/emr/latest/EMR-Serverless-UserGuide/emr-serverless-lf-enable.html)

------
#### [ Iceberg ]

[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/emr/latest/EMR-Serverless-UserGuide/emr-serverless-lf-enable.html)

**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 ]

[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/emr/latest/EMR-Serverless-UserGuide/emr-serverless-lf-enable.html)

下列範例使用 Hudi 設定 Spark，指定檔案位置和使用所需的其他屬性。

**Hudi 的 Spark 組態：**此程式碼片段用於筆記本時，會指定 Hudi Spark 套件 JAR 檔案的路徑，以啟用 Spark 中的 Hudi 功能。它也會將 Spark 設定為使用 AWS Glue Data Catalog 作為中繼存放區。

```
%%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"
    }
}
```

**Hudi 與 Glue AWS 的 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 ]

[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/emr/latest/EMR-Serverless-UserGuide/emr-serverless-lf-enable.html)

**EMR Serverless 搭配 Delta Lake：**若要在 EMR Serverless 上使用 Delta Lake 搭配 Lake Formation，請執行下列命令：

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

------