

# 将 Lake Formation 与 Athena Spark 工作组搭配使用
<a name="notebooks-spark-lakeformation"></a>

在 Apache Spark 3.5 发行版中，您可以将 AWS Lake Formation 与 AWS Glue Data Catalog 搭配使用，其中会话执行角色具有完整表权限。此功能允许您从 Athena Spark 交互式会话中读取和写入受 Lake Formation 保护的表。请参阅以下部分，了解有关 Lake Formation 以及如何将其与 Athena Spark 结合使用的更多信息。

## 步骤 1 步：在 Lake Formation 中启用全表访问
<a name="notebooks-spark-lakeformation-enable-fta"></a>

要使用全表访问（FTA）模式，您必须允许 Athena Spark 无需在 AWS Lake Formation 中验证 IAM 会话标签即可访问数据。要启用此模式，请按照 [Application integration for full table access](https://docs.aws.amazon.com//lake-formation/latest/dg/fta-app-integration.html) 中的步骤操作。

### 步骤 1.1：使用用户定义的角色在 Lake Formation 中注册数据位置
<a name="notebooks-spark-lakeformation-register-locations"></a>

您必须使用用户定义的角色，才能在 AWS Lake Formation 中注册数据位置。有关详细信息，请参阅 [Requirements for roles used to register locations](https://docs.aws.amazon.com//lake-formation/latest/dg/registration-role.html)。

## 步骤 2：设置会话执行角色的 IAM 权限
<a name="notebooks-spark-lakeformation-iam-permissions"></a>

要获得底层数据的读取或写入权限，除 Lake Formation 权限外，执行角色还需要 `lakeformation:GetDataAccess` IAM 权限。获得此权限后，Lake Formation 将授权访问数据的临时凭证请求。

下面是一个策略示例，展示了如何提供 IAM 权限以访问 Amazon S3 中的脚本、将日志上传到 S3、AWS Glue API 权限以及访问 Lake Formation 的权限。

### 步骤 2.1：配置 Lake Formation 权限
<a name="notebooks-spark-lakeformation-configure-permissions"></a>
+ 从 S3 读取数据的 Spark 作业需要 Lake Formation `SELECT` 权限。
+ 在 S3 中写入/删除数据的 Spark 作业需要 Lake Formation `ALL (SUPER)` 权限。
+ 与 AWS Glue Data Catalog 交互的 Spark 作业需要视情况具有 `DESCRIBE`、`ALTER`、`DROP` 权限。

## 步骤 3：使用 Lake Formation 初始化 Spark 会话以实现全表访问
<a name="notebooks-spark-lakeformation-initialize-session"></a>

### 先决条件
<a name="notebooks-spark-lakeformation-prerequisites"></a>

必须将 AWS Glue Data Catalog 配置为元存储才能访问 Lake Formation 表。

设置以下设置以将 AWS Glue 目录配置为元存储：

```
{
  "spark.hadoop.glue.catalogid": "ACCOUNT_ID",
  "spark.hadoop.hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory",
  "spark.hadoop.hive.metastore.glue.catalogid": "ACCOUNT_ID",
  "spark.sql.catalogImplementation": "hive"
}
```

要访问注册到 AWS Lake Formation 的表，需要在 Spark 初始化期间设置以下配置，以便将 Spark 配置为使用 AWS Lake Formation 凭证。

### Hive
<a name="notebooks-spark-lakeformation-hive-config"></a>

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

### Apache Iceberg
<a name="notebooks-spark-lakeformation-iceberg-config"></a>

```
{
  "spark.sql.extensions": "io.delta.sql.DeltaSparkSessionExtension",
  "spark.sql.catalog.spark_catalog": "org.apache.iceberg.spark.SparkSessionCatalog",
  "spark.sql.catalog.spark_catalog.warehouse": "s3://your-bucket/warehouse/",
  "spark.sql.catalog.spark_catalog.client.region": "REGION",
  "spark.sql.catalog.spark_catalog.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog",
  "spark.sql.catalog.spark_catalog.glue.account-id": "ACCOUNT_ID",
  "spark.sql.catalog.spark_catalog.glue.lakeformation-enabled": "true"
}
```

### Amazon S3 表
<a name="notebooks-spark-lakeformation-s3tables-config"></a>

```
{
  "spark.sql.extensions": "io.delta.sql.DeltaSparkSessionExtension",
  "spark.sql.catalog.{catalogName}": "org.apache.iceberg.spark.SparkCatalog",
  "spark.sql.catalog.{catalogName}.warehouse": "arn:aws:s3tables:{region}:{accountId}:bucket/{bucketName}",
  "spark.sql.catalog.{catalogName}.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog",
  "spark.sql.catalog.{catalogName}.glue.id": "{accountId}:s3tablescatalog/{bucketName}",
  "spark.sql.catalog.{catalogName}.glue.lakeformation-enabled": "true",
  "spark.sql.catalog.{catalogName}.client.region": "REGION",
  "spark.sql.catalog.{catalogName}.glue.account-id": "ACCOUNT_ID"
}
```

### Delta Lake
<a name="notebooks-spark-lakeformation-deltalake-config"></a>

```
{
  "spark.sql.extensions": "io.delta.sql.DeltaSparkSessionExtension",
  "spark.sql.catalog.spark_catalog": "org.apache.spark.sql.delta.catalog.DeltaCatalog",
  "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"
}
```

## 注意事项和限制
<a name="notebooks-spark-lakeformation-considerations"></a>
+ Hive、Iceberg、Amazon S3 表和 Delta 表均支持全表访问。Hudi 表不支持全表访问。
+ 要将新目录添加到活动会话中，请将 `spark.conf.set` 用于新的目录配置。
+ 目录配置不可变。如果要更新目录配置，请使用 `spark.conf.set` 创建新目录。
+ 仅向 Spark 会话添加您需要的目录。
+ 更改默认目录：`spark.catalog.setCurrentCatalog("s3tablesbucket")`
+ 如果您的目录名称中有 `-` 等特殊字符，请在查询中将其转义，例如：

  ```
  SELECT sales_amount as nums FROM `my-s3-tables-bucket`.`s3namespace`.`daily_sales` LIMIT 100
  ```