

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

将 Lake Formation 与 AWS Glue 结合使用时，请考虑以下注意事项和限制。

具有 Lake Formation 的 AWS Glue 可在除 AWS GovCloud（美国东部）和 AWS GovCloud（美国西部）之外的所有受支持区域使用。
+ AWS Glue 仅支持通过 Lake Formation 对 Apache Hive 和 Apache Iceberg 表进行精细访问控制。Apache Hive 格式包括 Parquet、ORC 和 CSV。
+ 您只能将 Lake Formation 与 Spark 作业结合使用。
+ 具有 Lake Formation 的 AWS Glue 在整个作业中仅支持单个 Spark 会话。
+ 启用 Lake Formation 后，AWS Glue 需要更多的工作线程，因为它需要一个系统驱动程序、一个系统执行程序、一个用户驱动程序以及可选的用户执行程序（当您的作业有 UDF 或 `spark.createDataFrame` 时需要此选项）。
+ 具有 Lake Formation 的 AWS Glue 仅支持通过资源链接共享的跨账户表查询。资源链接的名称必须与源账户资源的名称相同。
+ 要为 AWS Glue 作业启用精细访问控制，请传递 `--enable-lakeformation-fine-grained-access` 作业参数。
+ 您可以将 AWS Glue 作业配置为使用 AWS Glue 多目录层次结构。有关与 AWS Glue `StartJobRun` API 一起使用的配置参数的信息，请参阅 [Working with AWS Glue multi-catalog hierarchy on EMR Serverless](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/external-metastore-glue-multi.html)。
+ 不支持以下项：
  + 弹性分布式数据集（RDD）
  + Spark 流
  + 使用 Lake Formation 授予的权限写入
  + 嵌套列的访问控制
+ AWS Glue 会阻止可能破坏系统驱动程序完全隔离的功能，包括：
  + UDT、HiveUDFS 以及任何涉及自定义类的用户定义函数
  + 自定义数据来源
  + 为 Spark 扩展、连接器或元存储提供额外的 jar
  + `ANALYZE TABLE` 命令
+ 为了强制执行访问控制，`EXPLAIN PLAN` 和 DDL 操作（如 `DESCRIBE TABLE`）不会公开受限信息。
+ AWS Glue 会限制访问启用 Lake Formation 的应用程序上的系统驱动程序 Spark 日志。由于系统驱动程序的运行权限更大，因此系统驱动程序生成的事件和日志可能包含敏感信息。为防止未经授权的用户或代码访问此敏感数据，AWS Glue 禁止访问系统驱动程序日志。要进行故障排除，请联系 AWS 支持。
+ 如果您在 Lake Formation 中注册了表位置，则无论 AWS Glue 作业运行时角色的 IAM 权限如何，数据访问路径都会经过 Lake Formation 存储的凭证。如果错误配置了在表位置注册的角色，那么使用具有 S3 IAM 权限的角色提交到表位置的作业就会失败。
+ 写入 Lake Formation 表使用的是 IAM 权限，而不是 Lake Formation 授予的权限。如果作业运行时角色拥有必要的 S3 权限，就可以使用该权限来运行写操作。

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

## 工作线程分配示例
<a name="security-lf-considerations-worker-allocation"></a>

对于配置了以下参数的作业：

```
--enable-lakeformation-fine-grained-access=true  
--number-of-workers=20
```

工作线程分配将是：
+ 一个工作线程用于用户驱动程序。
+ 一个工作线程用于系统驱动程序。
+ 其余 18 个工作线程的 10％（即 2 个工作线程）预留给用户执行程序。
+ 为系统执行程序分配多达 16 个工作线程。

启用自动扩缩后，用户执行程序可以在需要时利用系统执行程序中任何未分配的容量。

## 控制用户执行程序分配
<a name="security-lf-considerations-user-exec-allocation"></a>

您可以使用以下配置调整用户执行程序的预留百分比：

```
--conf spark.dynamicAllocation.maxExecutorsRatio=<value between 0 and 1>
```

此配置允许对相对于总可用容量预留的用户执行程序数量进行微调控制。