

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 将 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 支持的数据目录表应用精细的访问控制。此功能允许您为 Amazon EMR Serverless Spark 作业中的 read 查询配置表、行、列和单元格级别的访问控制。要为 Apache Spark 批处理作业和交互式会话配置精细访问控制，请使用 EMR Studio。请参阅以下部分，了解有关 Lake Formation 以及如何将其与 EMR Serverless 结合使用的更多信息。

使用 Amazon EMR 无服务器会 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>

将 EMR Serverless 与 Lake Formation 结合使用，您可以对每个 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_cn/emr/latest/EMR-Serverless-UserGuide/images/lf-emr-s-architecture.png)


1. 用户将 Spark 作业提交到 AWS Lake Formation启用了 EMR 的无服务器应用程序。

1. EMR Serverless 会将作业发送到用户驱动程序，并在用户配置文件中运行作业。用户驱动程序运行精简版的 Spark，该版本无法启动任务、请求执行程序、访问 S3 或 Glue Catalog。其构建了作业计划。

1. EMR Serverless 设置了第二个驱动程序（称为系统驱动程序），在系统配置文件中运行（使用特权身份）。EMR Serverless 在两个驱动程序之间建立了加密的 TLS 通道来进行通信。用户驱动程序使用该通道将作业计划发送到系统驱动程序。系统驱动程序不会运行用户提交的代码。而是运行完整的 Spark，并与 S3 和数据目录通信，以访问数据。并向执行程序发送请求，将作业计划编译成一系列执行阶段。

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)时，在运行时配置参数的 `spark-defaults` 分类下将 `spark.emr-serverless.lakeformation.enabled` 设置为 `true`。

```
aws emr-serverless create-application \
    --release-label emr-7.12.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-submit` 时将 `spark.emr-serverless.lakeformation.enabled` 设置为 true。

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

## 作业运行时角色 IAM 权限
<a name="emr-serverless-lf-enable-permissions"></a>

Lake For AWS mation 权限控制对 Glue 数据目录资源、Amazon S3 位置以及这些位置的基础数据的访问权限。IAM 权限控制对 Lake Formation 和 AWS Glue APIs 以及资源的访问。虽然您可能拥有 Lake Formation 权限来访问数据目录（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 授权后，便可以[在 Amazon 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，作业运行时角色同时访问 Glue 数据 AWS 目录和 Amazon S3 中的基础表数据。这要求任务运行时角色拥有相应的 IAM 权限，可同时执行 Glue AWS 和 Amazon S3 操作。

### 在中注册的表 AWS Lake Formation
<a name="emr-s-lf-otf-permissions-tables-lf-registered"></a>

对于注册到的表 AWS Lake Formation，作业运行时角色访问 AWS Glue 数据目录元数据，而 Lake Formation 提供的临时证书则访问 Amazon S3 中的基础表数据。执行操作所需的 Lake For AWS mation 权限取决于 Spark 任务启动的 Glue 数据目录和 Amazon S3 API 调用，可以总结如下：
+ D@@ **ES** CRIBE 权限允许运行时角色读取数据目录中的表或数据库元数据
+ **ALTER** 权限允许运行时角色修改数据目录中的表或数据库元数据
+ **DROP** 权限允许运行时角色从数据目录中删除表或数据库元数据
+ SE@@ **LECT** 权限允许运行时角色从 Amazon S3 读取表数据
+ INS@@ **ERT** 权限允许运行时角色将表数据写入 Amazon S3
+ **删除**权限允许运行时角色从 Amazon S3 中删除表数据
**注意**  
当 Spark 任务调用 G AWS lue 来检索表元数据并调用 Amazon S3 来检索表数据时，Lake Formation 会延迟评估权限。在 Spark 发出需要缺少权限的 AWS Glue 或 Amazon S3 调用之前，使用权限不足的运行时角色的任务不会失败。

**注意**  
在以下支持的表格矩阵中：  
标记为 “**支持**” 的操作仅使用 Lake Formation 凭据来访问在 Lake Formation 中注册的表的表数据。如果 Lake Formation 权限不足，则操作将不会回退到运行时角色证书。对于未在 Lake Formation 中注册的表，作业运行时角色凭据可以访问表数据。
在 A **mazon S3 位置上标记为 “支持” 且具有 IAM 权限**的操作不会使用 Lake Formation 凭证访问亚马逊 S3 中的基础表数据。要运行这些操作，无论表是否已在 Lake Formation 中注册，任务运行时角色都必须具有访问表数据所必需的 Amazon S3 IAM 权限。

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

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/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_cn/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_cn/emr/latest/EMR-Serverless-UserGuide/emr-serverless-lf-enable.html)

以下示例使用 Hudi 配置 Spark，指定文件位置和使用所需的其他属性。

**Hudi 的 Spark 配置：**在笔记本中使用时，此代码片段指定 Hudi Spark 捆绑 JAR 文件的路径，从而在 Spark 中启用 Hudi 功能。它还将 Spark 配置为使用 AWS Glue 数据目录作为元数据库。

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

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/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 \
```

------

# 调试作业
<a name="emr-serverless-lf-enable-debugging"></a>

**注意**  
借助此功能，可以访问系统配置文件工作线程的 **stdout** 和 **stderr** 日志，其中可能包含未经筛选的敏感信息。以下权限仅应用于访问非生产数据。对于为用于生产作业而创建的应用程序，我们强烈建议您仅向管理员或具有更高数据访问权限的用户添加这些权限。

在 EMR-7.3.0 及更高版本中，EMR Serverless 为启用 Lake Formation 的批处理作业启用了自调试功能。为此，请使用 [GetDashboardForJobRun](https://docs.aws.amazon.com/emr-serverless/latest/APIReference/API_GetDashboardForJobRun.html)API 中的新**accessSystemProfile参数 Logs**。如果 “**accessSystemProfile日志**” 设置为 **true**，则可以访问系统配置文件工作人员的 **stdout** 和 **stderr** 日志，这些日志可用于调试启用 Lake Formation 的 EMR Serverless 批处理作业。

```
aws emr-serverless get-dashboard-for-job-run \
  --application-id application-id
  --job-run-id job-run-id
  --access-system-profile-logs
```

## 所需的权限
<a name="emr-serverless-lf-enable-debugging-perms"></a>

想要使用调试启用 Lake Formation 的批处理作业的委托人**GetDashboardForJobRun**必须具有以下额外权限：

```
{
    "Sid": "AccessSystemProfileLogs",
    "Effect": "Allow",
    "Action": [
        "emr-serverless:GetDashboardForJobRun",
        "emr-serverless:AccessSystemProfileLogs",
        "glue:GetDatabases",
        "glue:SearchTables"
    ],
    "Resource": [
        "arn:aws:emr-serverless:region:account-id:/applications/applicationId/jobruns/jobid",
        "arn:aws:glue:region:account-id:catalog",
        "arn:aws:glue:region:account-id:database/*",
        "arn:aws:glue:region:account-id:table/*/*"
    ]
}
```

## 注意事项
<a name="emr-serverless-lf-enable-debugging-considerations"></a>

对于使用与作业相同的账户访问 Lake Formation 中的数据库或表的作业，可以查看用于调试的系统配置文件日志。在以下情况下，它们不可见：
+ 如果使用 Lake Formation 权限管理的数据目录具有跨账户数据库和表
+ 如果使用 Lake Formation 权限管理的数据目录具有资源链接

# 使用 Glue Data Catalog 视图
<a name="SECTION-jobs-glue-data-catalog-views"></a>

您可以在 AWS Glue 数据目录中创建和管理视图，以便与 EMR Serverless 配合使用。这些视图通常被称为 AWS Glue 数据目录视图。这些视图之所以有用，是因为它们支持多个 SQL 查询引擎，因此您可以跨不同的 AWS 服务（例如 EMR Serverless 和 Amazon Redshift）访问相同的视图。 Amazon Athena

通过在数据目录中创建视图，在中使用资源授予和基于标签的访问控制 AWS Lake Formation 来授予对该视图的访问权限。使用这种访问控制方法，您无需为创建视图时引用的表配置其他访问权限。这种授予权限的方法称为定义者语义，这些视图称为定义者视图。有关 Lake Formation 中访问控制的更多信息，请参阅[《Lake Formation 开发者指南》中的授予和撤消数据目录资源的权限](https://docs.aws.amazon.com/lake-formation/latest/dg/granting-catalog-permissions.html)。 AWS 

数据目录视图对于以下用例非常实用：
+ **精细访问控制**：您可以创建一个视图，根据用户所需的权限来限制数据访问。例如，您可以使用 Data Catalog 中的视图来防止不在 HR 部门工作的员工查看个人身份信息 (PII)。
+ **完整视图定义**：通过对 Data Catalog 中的视图应用筛选条件，可确保 Data Catalog 中视图内的数据记录始终完整。
+ **增强安全性**：用于创建视图的查询定义必须完整。这种优势意味着 Data Catalog 中的视图不容易受到恶意行为者的 SQL 命令的影响。
+ **简单共享数据**-无需移动数据即可与其他 AWS 账户共享数据。有关更多信息，请参阅 [Lake Formation 中的跨账户数据共享](https://docs.aws.amazon.com/lake-formation/latest/dg/cross-account-permissions.html)。

## 创建 Data Catalog 视图
<a name="SECTION-jobs-glue-data-catalog-views-create"></a>

创建 Data Catalog 视图的方法有很多种。其中包括使用 AWS CLI 或 Spark SQL。以下是一些示例。

------
#### [ Using SQL ]

下面展示了创建 Data Catalog 视图的语法。注意 `MULTI DIALECT` 视图类型。这将 Data Catalog 视图与其他视图区分开来。`SECURITY` 谓词指定为 `DEFINER`。这表示带有 `DEFINER` 语义的 Data Catalog 视图。

```
CREATE [ OR REPLACE ] PROTECTED MULTI DIALECT VIEW [IF NOT EXISTS] view_name
[(column_name [COMMENT column_comment], ...) ]
[ COMMENT view_comment ]
[TBLPROPERTIES (property_name = property_value, ... )]
SECURITY DEFINER
AS query;
```

以下是 `CREATE` 语句示例，其语法如下：

```
CREATE PROTECTED MULTI DIALECT VIEW catalog_view
SECURITY DEFINER
AS
SELECT order_date, sum(totalprice) AS price
FROM source_table
GROUP BY order_date
```

您还可以使用 SQL 在试运行模式下创建视图以测试视图创建，而无需实际创建资源。使用此选项会导致 “试运行”，该试运行可以验证输入，如果验证成功，则返回将代表视图的 Glue AWS 表对象的 JSON。在这种情况下，不会创建实际视图。

```
CREATE [ OR REPLACE ] PROTECTED MULTI DIALECT VIEW view_name
SECURITY DEFINER 
[ SHOW VIEW JSON ]
AS view-sql
```

------
#### [ Using the AWS CLI ]

**注意**  
使用 CLI 命令时，不会解析用于创建视图的 SQL。这可能会导致创建视图，但查询不成功。创建视图之前，请务必测试 SQL 语法。

您可以使用以下 CLI 命令创建视图：

```
aws glue create-table --cli-input-json '{
  "DatabaseName": "database",
  "TableInput": {
    "Name": "view",
    "StorageDescriptor": {
      "Columns": [
        {
          "Name": "col1",
          "Type": "data-type"
        },
        ...
        {
          "Name": "col_n",
          "Type": "data-type"
        }
      ],
      "SerdeInfo": {}
    },
    "ViewDefinition": {
      "SubObjects": [
        "arn:aws:glue:aws-region:aws-account-id:table/database/referenced-table1",
        ...
        "arn:aws:glue:aws-region:aws-account-id:table/database/referenced-tableN",
       ],
      "IsProtected": true,
      "Representations": [
        {
          "Dialect": "SPARK",
          "DialectVersion": "1.0",
          "ViewOriginalText": "Spark-SQL",
          "ViewExpandedText": "Spark-SQL"
        }
      ]
    }
  }
}'
```

------

## 支持的视图操作
<a name="SECTION-jobs-glue-data-catalog-views-supported-operations"></a>

以下命令片段展示了使用 Data Catalog 视图的各种方法：
+ **CREATE VIEW**

  创建数据目录视图。以下示例演示如何根据现有表格创建视图：

  ```
  CREATE PROTECTED MULTI DIALECT VIEW catalog_view 
  SECURITY DEFINER AS SELECT * FROM my_catalog.my_database.source_table
  ```
+ **ALTER VIEW**

  可用语法：
  + `ALTER VIEW view_name [FORCE] ADD DIALECT AS query`
  + `ALTER VIEW view_name [FORCE] UPDATE DIALECT AS query`
  + `ALTER VIEW view_name DROP DIALECT`

  您可以使用 `FORCE ADD DIALECT` 选项，根据新的引擎方言强制更新架构和子对象。请注意，如果不同时使用 `FORCE` 更新其他引擎方言，这样做可能会导致查询错误。下面展示了一个示例：

  ```
  ALTER VIEW catalog_view FORCE ADD DIALECT
  AS
  SELECT order_date, sum(totalprice) AS price
  FROM source_table
  GROUP BY orderdate;
  ```

  下面展示了如何更改视图来更新方言：

  ```
  ALTER VIEW catalog_view UPDATE DIALECT AS 
  SELECT count(*) FROM my_catalog.my_database.source_table;
  ```
+ **DESCRIBE VIEW**

  描述视图的可用语法：
  + `SHOW COLUMNS {FROM|IN} view_name [{FROM|IN} database_name]`— 如果用户拥有描述视图所需的 AWS Glue 和 Lake Formation 权限，则他们可以列出这些列。下面展示了几个用于显示列的示例命令：

    ```
    SHOW COLUMNS FROM my_database.source_table;    
    SHOW COLUMNS IN my_database.source_table;
    ```
  + `DESCRIBE view_name`— 如果用户具有描述视图所需的 AWS Glue 和 Lake Formation 权限，则他们可以列出视图中的列及其元数据。
+ **DROP VIEW**

  可用语法：
  + `DROP VIEW [ IF EXISTS ] view_name`

    以下示例显示了 `DROP` 语句，该语句用于在删除视图之前测试视图是否存在：

    ```
    DROP VIEW IF EXISTS catalog_view;
    ```
+ **显示创建视图**
  + `SHOW CREATE VIEW view_name`：显示创建指定视图的 SQL 语句。以下示例演示如何创建数据目录视图：

    ```
    SHOW CREATE TABLE my_database.catalog_view;
    CREATE PROTECTED MULTI DIALECT VIEW my_catalog.my_database.catalog_view (
      net_profit,
      customer_id,
      item_id,
      sold_date)
    TBLPROPERTIES (
      'transient_lastDdlTime' = '1736267222')
    SECURITY DEFINER AS SELECT * FROM
    my_database.store_sales_partitioned_lf WHERE customer_id IN (SELECT customer_id from source_table limit 10)
    ```
+ **SHOW VIEWS**

  列出目录中的所有视图，例如常规视图、多方言视图 (MDV) 和没有 Spark 方言的 MDV。可用语法如下：
  + `SHOW VIEWS [{ FROM | IN } database_name] [LIKE regex_pattern]`:

    下面展示了用于显示视图的示例命令：

    ```
    SHOW VIEWS IN marketing_analytics LIKE 'catalog_view*';
    ```

有关创建和配置数据目录视图的更多信息，请参阅《 AWS Lake Formation 开发人员指南》中的 B [AWS uilding Glue 数据目录视图](https://docs.aws.amazon.com/lake-formation/latest/dg/working-with-views.html)。

## 查询 Data Catalog 视图
<a name="SECTION-jobs-glue-data-catalog-views-querying"></a>

 创建数据目录视图后，您可以使用启用了 AWS Lake Formation 精细访问控制的 Amazon EMR Serverless Spark 任务对其进行查询。作业运行时角色必须拥有对 Data Catalog 视图的 Lake Formation `SELECT` 权限。您无需授予对视图中引用的基础表的访问权限。

完成所有设置后，就可以查询视图。例如，在 EMR Studio 中创建 EMR Serverless 应用程序后，请运行以下查询来访问视图。

```
SELECT * from my_database.catalog_view LIMIT 10;
```

一个有用的功能是 `invoker_principal`。它返回 EMRS 作业运行时角色的唯一标识符。这可用于根据调用主体控制视图输出。您可以使用它在视图中添加一个条件，以便根据调用角色优化查询结果。作业运行时角色必须拥有执行 `LakeFormation:GetDataLakePrincipal` IAM 操作的权限才能使用此函数。

```
select invoker_principal();
```

例如，您可以将此函数添加到 `WHERE` 子句以优化查询结果。

## 注意事项和限制
<a name="SECTION-jobs-glue-data-catalog-views-considerations"></a>

创建 Data Catalog 视图时，以下内容适用：
+ 只能使用 Amazon EMR 7.6 及更高版本创建 Data Catalog 视图。
+ Data Catalog 视图定义者必须拥有对视图访问的基础基表的 `SELECT` 访问权限。如果特定基表对定义者角色施加了任何 Lake Formation 筛选条件，则创建 Data Catalog 视图将失败。
+ 在 Lake Formation 中，基表不得具有 `IAMAllowedPrincipals` 数据湖权限。如果存在，则会出现错误 “*多方言视图” 只能引用没有 IAMAllowed委托人权限的表*。
+ 该表的 Amazon S3 位置必须注册为 Lake Formation 数据湖位置。如果该表未注册，则会出现错误*多方言视图只能引用 Lake Formation 托管表*。有关如何在 Lake Formation 中注册亚马逊 S3 营业地点的信息，请参阅 AWS Lake Formation 开发者指南中的[注册亚马逊 S3 营业地点](https://docs.aws.amazon.com/lake-formation/latest/dg/register-location.html)。
+ 只能创建 `PROTECTED` 数据目录视图。不支持 `UNPROTECTED` 视图。
+ 您不能在数据目录视图定义中引用其他 AWS 账户中的表。也不能引用不同区域中同一账户中的表。
+ 要跨账户或区域共享数据，必须使用 Lake Formation 资源链接跨账户和跨区域共享整个视图。
+ 不支持用户定义的函数 (UDFs)。
+ 您可以使用基于 Iceberg 表的视图。还支持开放式表格格式 Apache Hudi 和 Delta Lake。
+ 不能在数据目录视图中引用其他视图。
+  AWS Glue 数据目录视图架构始终使用小写形式存储。例如，如果使用 DDL 语句创建包含名为 `Castle` 的列的 Glue Data Catalog 视图，则在 Glue Data Catalog 中创建的列将被小写为 `castle`。如果您随后将 DML 查询中的列名指定为 `Castle` 或 `CASTLE`，EMR Spark 会将名称转换为小写，以便您运行查询。但是列标题会使用您在查询中指定的大小写形式显示。

  如果您希望在 DML 查询中指定的列名与 Glue Data Catalog 中的列名不匹配时查询失败，请设置 `spark.sql.caseSensitive=true`。

# 开放表格式支持
<a name="emr-serverless-lf-enable-open-table-format-support"></a>

EMR Serverless 支持 Apache Hive、Apache Iceberg、Delta Lake（7.6.0\$1）和 Apache Hudi（7.6.0\$1）上的 SELECT 查询。从 EMR 7.12 开始，Apache Hive、Apache Iceberg 和 Delta Lake 表支持使用 Lake Formation 提供的凭据修改表数据的 DML 和 DDL 操作。

# 注意事项和限制
<a name="emr-serverless-lf-enable-considerations"></a>

## General
<a name="emr-s-lf-considerations"></a>

在 EMR Serverless 中使用 Lake Formation 时，请查看以下限制。

**注意**  
在 EMR Serverless 上为 Spark 作业启用 Lake Formation 时，作业会启动系统驱动程序和用户驱动程序。如果在启动时指定了预初始化容量，则会从预初始化容量中预置驱动程序，系统驱动程序的数量与指定的用户驱动程序的数量相等。如果选择按需容量，EMR Serverless 除了会启动用户驱动程序外，还会启动系统驱动程序。要估算在 Lake Formation 作业中使用 EMR Serverless 相关的成本，请使用 [AWS 定价计算器](https://calculator.aws/#/addService/EMR)。
+ 启用 Lake Formation 的 Amazon EMR Serverless 适用于所有受支持的 [EMR Serverless 区域](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/considerations.html)。
+ 启用 Lake Formation 的应用程序不支持使用[自定义 EMR Serverless 映像](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/application-custom-image.html)。
+ 您不能为 Lake Formation 作业关闭 `DynamicResourceAllocation`。
+ 您只能将 Lake Formation 与 Spark 作业结合使用。
+ 启用 Lake Formation 的 EMR Serverless 在整个作业中仅支持单个 Spark 会话。
+ 启用 Lake Formation 的 EMR Serverless 仅支持通过资源链接共享的跨账户表查询。
+ 不支持以下项：
  + 弹性分布式数据集（RDD）
  + Spark 流
  + 嵌套列的访问控制
+ EMR Serverless 会阻止可能破坏系统驱动程序完全隔离的功能，包括：
  + UDTs、Hive UDFs 以及任何涉及自定义类的用户定义函数
  + 自定义数据来源
  + 为 Spark 扩展、连接器或元存储提供额外的 jar
  + `ANALYZE TABLE` 命令
+ 如果您的 EMR Serverless 应用程序位于具有适用于 Amazon S3 的 VPC 终端节点的私有子网中，并且您附加了终端节点策略来控制访问权限，则在您的任务可以将日志数据发送到托管 A AWS mazon S3 之前，请在您的 VPC 策略中将[托管存储](logging.html#jobs-log-storage-managed-storage)中详述的权限添加到 S3 网关终端节点。如需疑难解答请求，请联系 AWS 支持人员。
+ 从 Amazon EMR 7.9.0 开始，Spark FGAC 在与 s3a://方案一起使用时支持 S3 AFile 系统。
+ 亚马逊 EMR 7.11 支持使用 CTAS 创建托管表。
+ Amazon EMR 7.12 支持使用 CTAS 创建托管表和外部表。

## Permissions
<a name="emr-s-lf-reads-writes"></a>
+ 为了强制执行访问控制，EXPLAIN PLAN 和 DDL 操作（例如 DESCRIBE TABLE）不会泄露受限信息。
+ 当您向 Lake Formation 注册表位置时，数据访问将使用 Lake Formation 存储的证书，而不是 EMR Serverless 作业运行时角色的 IAM 权限。如果表位置的注册角色配置错误，即使运行时角色对该位置拥有 S3 IAM 权限，任务也会失败。
+ 从 Amazon EMR 7.12 开始，你可以在追加模式下使用 DataFrameWriter (V2) 和 Lake Formation 凭证写入现有 Hive 和 Iceberg 表。对于覆盖操作或创建新表时，EMR 使用运行时角色凭据来修改表数据。
+ 使用视图或缓存表作为源数据时，存在以下限制（这些限制不适用于 AWS Glue 数据目录视图）：
  + 用于合并、删除和更新操作
    + 支持：使用视图和缓存表作为源表。
    + 不支持：在赋值和条件子句中使用视图和缓存表。
  + 对于创建或替换和替换表作为选择操作：
    + 不支持：使用视图和缓存表作为源表。
+ 仅当启用删除向量时，包含 UDFs 源数据的 Delta Lake 表才支持合并、删除和更新操作。

## 日志和调试
<a name="emr-s-lf-debug-logs"></a>
+ EMR Serverless 限制访问启用 Lake Formation 的应用程序上的系统驱动程序 Spark 日志。由于系统驱动程序以提升的权限运行，因此系统驱动程序生成的事件和日志可能包含敏感信息。为防止未经授权的用户或代码访问此敏感数据，EMR Serverless 禁止访问系统驱动程序日志。
+ 系统配置文件日志始终保存在托管存储中：这是一项强制性设置，无法禁用。这些日志使用客户托管 KMS 密钥或托管 KMS 密钥 AWS 进行安全存储和加密。

## Iceberg
<a name="emr-s-lf-iceberg"></a>

使用 Apache Iceberg 时，请查看以下注意事项：
+ 您只能在会话目录中使用 Apache Iceberg，而不能使用任意命名的目录。
+ 在 Lake Formation 中注册的 Iceberg 表仅支持元数据表 `history`、`metadata_log_entries`、`snapshots`、`files`、`manifests` 和 `refs`。Amazon EMR 会隐藏可能包含敏感数据的列，例如 `partitions`、`path` 和 `summaries`。此限制不适用于未在 Lake Formation 中注册的 Iceberg 表。
+ 未在 Lake Formation 中注册的表支持所有 Iceberg 存储过程。任何表都不支持 `register_table` 和 `migrate` 程序。
+ 我们建议你使用 Iceberg DataFrameWriter V2 而不是 V1。

# 问题排查
<a name="emr-serverless-lf-troubleshooting"></a>

有关故障排除解决方案，请参阅以下部分：

## 日志记录
<a name="emr-serverless-lf-troubleshooting-logging"></a>

EMR Serverless 使用 Spark 资源配置文件来拆分作业执行。EMR Serverless 使用用户配置文件来运行您提供的代码，而系统配置文件则强制执行 Lake Formation 策略。您可以访问作为用户配置文件运行的任务的日志。

有关调试启用 Lake Formation 的作业的更多信息，请参阅[调试作业](emr-serverless-lf-enable-debugging.html)。

## Live UI 和 Spark History Server
<a name="emr-serverless-lf-troubleshooting-live-ui"></a>

Live UI 和 Spark History Server 包含从用户配置文件生成的所有 Spark 事件以及从系统驱动程序生成的编辑事件。

您可以在**执行程序**选项卡中查看用户和系统驱动程序中的所有任务。但日志链接仅适用于用户配置文件。此外，还会从 Live UI 中编辑一些信息，例如输出记录数。

## 由于 Lake Formation 权限不足，作业失败
<a name="emr-serverless-lf-troubleshooting-insufficient-lf-permissions"></a>

确保您的作业运行时角色有权在您要访问的表上运行 SELECT 和 DESCRIBE。

## RDD 作业执行失败
<a name="emr-serverless-lf-troubleshooting-rdd-execution"></a>

EMR Serverless 目前不支持在启用了 Lake Formation 的作业上进行弹性分布式数据集（RDD）操作。

## 无法访问 Amazon S3 中的数据文件
<a name="emr-serverless-lf-troubleshooting-s3-access-failure"></a>

确保您已在 Lake Formation 中注册数据湖的位置。

## 安全验证异常
<a name="emr-serverless-lf-troubleshooting-security-validation"></a>

EMR Serverless 检测到安全验证错误。请联系 AWS 支持人员寻求帮助。

## 跨账户 AWS 共享 Glue 数据目录和表格
<a name="emr-serverless-lf-troubleshooting-cross-account"></a>

您可以跨账户共享数据库和表，且仍可使用 Lake Formation。有关更多信息，请参阅 [Lake Formation 中的跨账户数据共享](https://docs.aws.amazon.com/lake-formation/latest/dg/cross-account-permissions.html)和[如何使用跨账户共享 AWS Glue 数据目录和表格](https://repost.aws/knowledge-center/glue-lake-formation-cross-account)？ AWS Lake Formation。

# Spark 原生精细访问控制允许列入名单 API PySpark
<a name="clean-rooms-spark-fgac-pyspark-api-allowlist"></a>

为了维护安全性和数据访问控制，Spark 精细访问控制 (FGAC) 限制了某些功能。 PySpark 这些限制是通过以下方式强制执行的：
+ 用于阻止函数执行的显式阻塞
+ 使函数无法运行的架构不兼容
+ 可能引发错误、返回被拒绝访问的消息或在调用时什么都不做的函数

Spark FGAC 不支持以下 PySpark 功能：
+ RDD 操作（被 Spark RDDUnsupported 异常阻止）
+ Spark Connect（不支持）
+ Spark 直播（不支持）

虽然我们已经在 Native Spark FGAC 环境中测试了列出的函数并确认它们可以按预期运行，但我们的测试通常仅涵盖每个 API 的基本用法。具有多种输入类型或复杂逻辑路径的函数可能有未经测试的场景。

对于此处未列出且不明显属于上述不支持的类别的任何函数，我们建议：
+ 首先在 gamma 环境或小规模部署中对其进行测试
+ 在生产中使用它们之前对其行为进行验证

**注意**  
如果您看到列出了一个类方法但没有列出其基类，则该方法应该仍然有效，这只是意味着我们尚未明确验证基类构造函数。

 PySpark API 被组织成多个模块。下表详细说明了对每个模块中方法的普遍支持。


| 模块名称 | Status | 注意 | 
| --- | --- | --- | 
|  pystark\$1core  |  支持  |  该模块包含主要的 RDD 类，这些函数大多不受支持。  | 
|  pystark\$1sql  |  支持  |  | 
|  pyspark\$1tes  |  支持  |  | 
|  pyspark\$1res  |  支持  |  | 
|  pyspark\$1stre  |  阻止  |  Spark FGAC 中已禁止使用直播功能。  | 
|  pyspark\$1mllib  |  实验性的  |  该模块包含基于 RDD 的 ML 操作，这些函数大多不受支持。此模块未经过全面测试。  | 
|  pyspark\$1ml  |  实验性的  |  该模块包含 DataFrame 基于机器学习的操作，这些函数大多受支持。此模块未经过全面测试。  | 
|  pypark\$1pandas  |  支持  |    | 
|  pyspark\$1pandas\$1low  |  支持  |    | 
| pyspark\$1con |  阻止  |  Spark FGAC 中禁止使用 Spark Connect。  | 
| pyspark\$1pandas\$1conn |  阻止  |  Spark FGAC 中禁止使用 Spark Connect。  | 
| pyspark\$1pandas\$1slow\$1conn |  阻止  |  Spark FGAC 中禁止使用 Spark Connect。  | 
| pyspark\$1erro |  实验性的  |  此模块未经过全面测试。无法使用自定义错误类。  | 

**API 许可名单**

为了获得可下载且更易于搜索的列表，可以在[原生 FGAC 中允许的 Python 函数中](samples/Python functions allowed in Native FGAC.zip)找到包含模块和类的文件。