本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
EC2 上的 Amazon EMR 的 Lake Formation 完整表访问权限
在 Amazon EMR 7.8.0 及更高版本中,您可以利用带有 Glue 数据目录的 Amazon Lake Formation,其中任务运行时角色拥有完整表权限,不受细粒度访问控制的限制。此功能允许您从 EC2 Spark 批处理和交互式任务上的 Amazon EMR 读取和写入受 Lake Formation 保护的表。请参阅以下章节,详细了解 Lake Formation 以及如何将其与 EC2 上的 Amazon EMR 配合使用。
对 Lake Formation 使用全表访问
您可以通过 EC2 Spark 任务或交互式会话从 Amazon EMR 访问受 Amazon Lake Formation 保护的 Glue 数据目录表,其中任务的运行时角色具有完整表访问权限。您无需在 EC2 应用程序上的亚马逊 EMR 上启用 Amazon Lake Formation。将 Spark 任务配置为全表访问权限 (FTA) 时, Amazon Lake Formation 证书将用于 Amazon Lake Formation 注册表的 read/write S3 数据,而任务的运行时角色凭证将用于未在 Amazon Lake Formation 注册的 read/write 表。
重要
不要启用 Amazon Lake Formation 以实现精细的访问控制。作业不能在同一 EMR 集群或应用程序上同时运行全表 Fine-Grained 访问 (FTA) 和访问控制 (FGAC)。
步骤 1 步:在 Lake Formation 中启用全表访问
要使用全表访问 (FTA) 模式,您必须允许第三方查询引擎在 Amazon Lake Formation 中未经 IAM 会话标签验证的情况下访问数据。要启用此模式,请按照 Application integration for full table access 中的步骤操作。
注意
访问跨账户表时,必须在生产者账户和消费者账户中启用全表访问。同样,在访问跨区域表时,必须在生产者和使用者区域中都启用此设置。
第 2 步:设置作业运行时角色的 IAM 权限
要获得基础数据的读取或写入权限,除 Lake Formation 权限外,作业运行时角色还需要具有 lakeformation:GetDataAccess IAM 权限。获得此权限后,Lake Formation 将授权访问数据的临时凭证请求。
下面是一个策略示例,展示了如何提供 IAM 权限以访问 Amazon S3 中的脚本、将日志上传到 S3、 Amazon Glue API 权限以及访问 Lake Formation 的权限。
步骤 2.1:配置 Lake Formation 权限
从 S3 读取数据的 Spark 作业需要 Lake Formation SELECT 权限。
S3 中 write/delete 数据的 Spark 任务需要 Lake Formation ALL (SUPER) 权限。
与 Glue Data Catalog 交互的 Spark 作业需要视情况具有 DESCRIBE、ALTER、DROP 权限。
有关更多信息,请参阅授予对 Data Catalog 资源的权限。
步骤 3:使用 Lake Formation 初始化 Spark 会话以实现全表访问
先决条件
Amazon 必须将 Glue 数据目录配置为元数据仓才能访问 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 上亚马逊 EMR 的 Metastore 配置。
要访问在 Amazon Lake Formation 中注册的表,需要在 Spark 初始化期间设置以下配置,以将 Spark 配置为使用 Amazon Lake Formation 凭证。
-
spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver: 配置 EMR 文件系统 (EMRFS) 或 EMR S3A 以使用 Amazon Lake Formation S3 凭证来获取 Lake Formation 注册表。如果表未注册,请使用作业的运行时角色凭证。 -
spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true以及spark.hadoop.fs.s3.folderObject.autoAction.disabled=true:在创建 S3 文件夹时,将 EMRFS 配置为使用内容类型标头 application/x-directory 而不是 $folder$ 后缀。这在读取 Lake Formation 表时为必需,因为 Lake Formation 凭证不允许读取带有 $folder$ 后缀的表文件夹。 -
spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true:将 Spark 配置为在创建表之前跳过空表位置验证。这对于注册到 Lake Formation 的表是必需的,因为只有在创建 Glue 数据目标表之后,用于验证空位置的 Lake Formation 凭证才会可用。如果未启用此配置,则作业的运行时角色凭证将会验证空表位置。 -
spark.sql.catalog.createDirectoryAfterTable.enabled=true:将 Spark 配置为在 Hive 元数据存储中创建表后再创建 Amazon S3 文件夹。这对于注册到 Lake Formation 的表为必需,因为只有在创建 Glue Data Catalog 表之后,用于创建 S3 文件夹的 Lake Formation 凭证才会可用。 -
spark.sql.catalog.dropDirectoryBeforeTable.enabled=true:将 Spark 配置为在 Hive 元数据存储中删除表之前删除 S3 文件夹。这对于注册到 Lake Formation 的表是必需的,因为在从 Glue Data Catalog 中删除表之后,用于删除 S3 文件夹的 Lake Formation 凭证将不可用。 -
spark.sql.catalog.<catalog>.glue.lakeformation-enabled=true:将 Iceberg 目录配置为使用 Amazon Lake Formation S3 证书来获取 Lake Formation 注册表 如果表未注册,则会使用默认环境凭证。
在 SageMaker Unified Studio 中配置全表访问模式
要访问 JupyterLab 笔记本电脑中的交互式 Spark 会话中的 Lake Formation 注册表,请使用兼容性权限模式。使用 %%configure 魔术命令设置 Spark 配置。根据表类型选择配置:
替换占位符:
S3_DATA_LOCATION:您的 S3 存储桶路径REGION: Amazon 区域(例如,us-east-1)ACCOUNT_ID: 你的 Amazon 账户 ID
注意
必须在笔记本中执行任何 Spark 操作之前设置这些配置。
支持的操作
这些操作将使用 Amazon Lake Formation 凭证来访问表格数据。
CREATE TABLE
ALTER TABLE
INSERT INTO
INSERT OVERWRITE
UPDATE
MERGE INTO
DELETE FROM
ANALYZE TABLE
REPAIR TABLE
DROP TABLE
Spark Datasource 查询
Spark Datasource 写入
注意
上面未列出的操作将继续使用 IAM 权限来访问表数据。
注意事项
如果使用未启用全表访问的作业创建 Hive 表,并且未插入任何记录,则后续从启用全表访问的作业进行的读取或写入操作都将失败。这是因为未启用全表访问的 EMR Spark 会将
$folder$后缀添加到表文件夹名称。要解决此问题,您可以使用以下任一方法:从未启用 FTA 的作业在表中至少插入一行。
配置未启用 FTA 的作业,从而确保不在 S3 文件夹名称中使用
$folder$后缀。可以通过设置 Spark 配置spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true来实现此目的。s3://path/to/table/table_name使用 S3 控制台或 S3 CLI 在表位置创建 Amazon S3 文件夹。 Amazon
从 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从 Amazon EMR 版本 7.12 开始提供对 Hudi 的全表访问 (FTA) 写入支持。
Hudi FTA 写入支持目前仅适用于默认 Hudi 配置。自定义或非默认 Hudi 设置可能无法完全支持,并可能导致意外行为。
目前,在 FTA 写入模式下不支持 Hudi Merge-On-Read (MOR) 表的群集。
使用湖泊形成 Fine-Grained 访问控制 (FGAC) 规则或 Glue 数据目录视图引用表格的作业将失败。要使用 FGAC 规则或 Glue Data Catalog 视图查询表,您必须使用 FGAC 模式。您可以按照 Amazon 文档中概述的步骤启用 FGAC 模式:在 EC2 上使用 Amazon EMR 和 Amazon Lake Formation 进行精细的访问控制。
全表访问模式不支持 Spark Streaming。
将 Spark DataFrame 写入 Lake Formation 表时,Hive 和 Iceberg 表仅支持 APPEND 模式:
df.write.mode("append").saveAsTable(table_name)创建外部表需要 IAM 权限。
由于 Lake Formation 会在 Spark 作业中临时缓存凭证,因此当前正在运行的 Spark 批处理作业或交互式会话可能无法反映权限更改。
您必须使用用户定义的角色而不是服务相关角色:Lake Formation 对角色的要求。
Hudi FTA 写入支持-支持的操作
下表显示了全表访问模式下 Hudi Copy-On-Write (COW) 和 Merge-On-Read (MOR) 表支持的写入操作:
| 表类型 | 操作 | SQL 写入命令 | Status |
|---|---|---|---|
| 牛 | INSERT | INSERT INTO TABLE | 支持 |
| 牛 | INSERT | 插入表格-分区(静态、动态) | 支持 |
| 牛 | INSERT | INSERT OVERWRITE | 支持 |
| 牛 | INSERT | 插入覆盖-分区(静态、动态) | 支持 |
| UPDATE | UPDATE | UPDATE TABLE | 支持 |
| 牛 | UPDATE | 更新表-更改分区 | 不支持 |
| DELETE | DELETE | DELETE FROM TABLE | 支持 |
| ALTER | ALTER | 更改表-重命名为 | 不支持 |
| 牛 | ALTER | 修改表-设置 TBLPROPERTIES | 支持 |
| 牛 | ALTER | 修改表-取消设置 TBLPROPERTIES | 支持 |
| 牛 | ALTER | 修改表-修改列 | 支持 |
| 牛 | ALTER | 修改表-添加列 | 支持 |
| 牛 | ALTER | 修改表-添加分区 | 支持 |
| 牛 | ALTER | 修改表-删除分区 | 支持 |
| 牛 | ALTER | 修改表-恢复分区 | 支持 |
| 牛 | ALTER | 修复表同步分区 | 支持 |
| DROP | DROP | DROP TABLE | 支持 |
| 牛 | DROP | 删除表-清除 | 支持 |
| CREATE | CREATE | 创建表-管理 | 支持 |
| 牛 | CREATE | 创建表-分区依据 | 支持 |
| 牛 | CREATE | 如果不存在则创建表 | 支持 |
| 牛 | CREATE | CREATE TABLE LIKE | 支持 |
| 牛 | CREATE | CREATE TABLE AS SELECT | 支持 |
| CREATE | CREATE | 使用位置创建表-外部表 | 不支持 |
| 数据框(插入) | 数据框(插入) | 保存 AsTable.Overwrite | 支持 |
| 牛 | 数据框(插入) | 保存 AsTable.Append | 不支持 |
| 牛 | 数据框(插入) | 保存 AsTable.Ignore | 支持 |
| 牛 | 数据框(插入) | 保存 AsTable.ErrorIfExists | 支持 |
| 牛 | 数据框(插入) | 保存 AsTable -外部表(路径) | 不支持 |
| 牛 | 数据框(插入) | 保存(路径)-DF v1 | 不支持 |
| 更多 | INSERT | INSERT INTO TABLE | 支持 |
| 更多 | INSERT | 插入表格-分区(静态、动态) | 支持 |
| 更多 | INSERT | INSERT OVERWRITE | 支持 |
| 更多 | INSERT | 插入覆盖-分区(静态、动态) | 支持 |
| UPDATE | UPDATE | UPDATE TABLE | 支持 |
| 更多 | UPDATE | 更新表-更改分区 | 不支持 |
| DELETE | DELETE | DELETE FROM TABLE | 支持 |
| ALTER | ALTER | 更改表-重命名为 | 不支持 |
| 更多 | ALTER | 修改表-设置 TBLPROPERTIES | 支持 |
| 更多 | ALTER | 修改表-取消设置 TBLPROPERTIES | 支持 |
| 更多 | ALTER | 修改表-修改列 | 支持 |
| 更多 | ALTER | 修改表-添加列 | 支持 |
| 更多 | ALTER | 修改表-添加分区 | 支持 |
| 更多 | ALTER | 修改表-删除分区 | 支持 |
| 更多 | ALTER | 修改表-恢复分区 | 支持 |
| 更多 | ALTER | 修复表同步分区 | 支持 |
| DROP | DROP | DROP TABLE | 支持 |
| 更多 | DROP | 下拉表-清除 | 支持 |
| CREATE | CREATE | 创建表-管理 | 支持 |
| 更多 | CREATE | 创建表-分区依据 | 支持 |
| 更多 | CREATE | 如果不存在则创建表 | 支持 |
| 更多 | CREATE | CREATE TABLE LIKE | 支持 |
| 更多 | CREATE | CREATE TABLE AS SELECT | 支持 |
| CREATE | CREATE | 使用位置创建表-外部表 | 不支持 |
| 数据框(向上插入) | 数据框(向上插入) | 保存 AsTable.Overwrite | 支持 |
| 更多 | 数据框(向上插入) | 保存 AsTable.Append | 不支持 |
| 更多 | 数据框(向上插入) | 保存 AsTable.Ignore | 支持 |
| 更多 | 数据框(向上插入) | 保存 AsTable.ErrorIfExists | 支持 |
| 更多 | 数据框(向上插入) | 保存 AsTable -外部表(路径) | 不支持 |
| 更多 | 数据框(向上插入) | 保存(路径)-DF v1 | 不支持 |
| 数据框(删除) | 数据框(删除) | 保存 AsTable.Append | 不支持 |
| 更多 | 数据框(删除) | 保存 AsTable -外部表(路径) | 不支持 |
| 更多 | 数据框(删除) | 保存(路径)-DF v1 | 不支持 |
| 数据框(BULK_INSERT) | 数据框(BULK_INSERT) | 保存 AsTable.Overwrite | 支持 |
| 更多 | 数据框(BULK_INSERT) | 保存 AsTable.Append | 不支持 |
| 更多 | 数据框(BULK_INSERT) | 保存 AsTable.Ignore | 支持 |
| 更多 | 数据框(BULK_INSERT) | 保存 AsTable.ErrorIfExists | 支持 |
| 更多 | 数据框(BULK_INSERT) | 保存 AsTable -外部表(路径) | 不支持 |
| 更多 | 数据框(BULK_INSERT) | 保存(路径)-DF v1 | 不支持 |