本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Lake Formation 未经过滤的 EMR Serverless 访问权限
在 Amazon EMR 7.8.0 及更高版本中,您可以利用带有 Glue Data Catalog 的 Lake Formation Amazon ,其中任务运行时角色拥有完整的表权限,不受细粒度访问控制的限制。此功能允许您读取和写入受 Lake Formation 保护的表,使其免受 EMR Serverless Spark 批处理和交互式作业的影响。请参阅以下部分,了解有关 Lake Formation 以及如何将其与 EMR Serverless 结合使用的更多信息。
使用具有完整表格访问权限的 Lake Formation
您可以从 EMR Serverless Spark 作业或交互式会话中访问受 La Amazon ke Formation 保护的 Glue 数据目录表,在这些会话中,作业的运行时角色具有完整表访问权限。你不必在 EMR Serverless 应用程序上启用 Amazon Lake Formation。将 Spark 作业配置为全表访问权限 (FTA) 时, Amazon Lake Formation 凭据用于读取/写入 La Amazon ke Formation 注册表的 S3 数据,而作业的运行时角色凭据将用于读取/写入未在 Lake Formation 中注册的表。 Amazon
重要
请勿启用 Amazon Lake Formation 进行精细的访问控制。作业不能在同一 EMR 集群或应用程序上同时运行全表访问 (FTA) 和精细访问控制 (FGAC)。
第 1 步:在 Lake Formation 中启用完整表访问权限
要使用全表访问 (FTA) 模式,您需要允许第三方查询引擎访问数据,而无需在 La Amazon ke Formation 中进行 IAM 会话标签验证。要启用,请按照应用程序集成中的步骤进行全表访问。
注意
访问跨账户表时,必须在生产者账户和消费者账户中启用全表访问权限。同样,在访问跨区域表时,必须在生产者和使用者区域中都启用此设置。
步骤 2:为作业运行时角色设置 IAM 权限
要获得底层数据的读取或写入权限,除了 Lake Formation 权限外,作业运行时角色还需要 lakeformation:GetDataAccess
IAM 权限。获得此权限后,Lake Formation 将授权访问数据的临时凭证请求。
以下是如何提供 IAM 权限以访问 Amazon S3 中的脚本、将日志上传到 S3、 Amazon Glue API 权限以及访问 Lake Formation 的权限的示例策略。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "ScriptAccess", "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::*.amzn-s3-demo-bucket/scripts" ] }, { "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": [ "*" ] } ] }
步骤 2.1 配置 Lake Formation 权限
从 S3 读取数据的 Spark 作业需要 Lake Formation SELECT 权限。
在 S3 中写入/删除数据的 Spark 作业需要 Lake Formation ALL(超级)权限。
与 Glue 数据目录交互的 Spark 作业需要相应的 DESCRIBE、ALTER、DROP 权限。
有关更多信息,请参阅授予数据目录资源的权限。
第 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
有关为 EMR Serverless 启用数据目录的更多信息,请参阅 EMR Serverless 的元数据仓配置。
要访问在 Amazon Lake Formation 中注册的表,需要在 Spark 初始化期间设置以下配置,将 Spark 配置为使用 Amazon Lake Formation 凭据。
-
spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver
:将 EMR 文件系统 (EMRFS) 配置为对 Lake Formation 注册表使用 Lak Amazon e Formation S3 凭据。如果表未注册,请使用作业的运行时角色证书。 -
spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true
和spark.hadoop.fs.s3.folderObject.autoAction.disabled=true
:在创建 S3 文件夹时,将 EMRFS 配置为使用内容类型标题应用程序/x 目录而不是 $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 注册表所必需的,因为创建 S3 文件夹的 Lake Formation 凭据只有在创建 Glue 数据目录表后才可用。 -
spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
:将 Spark 配置为在 Hive 元数据仓中删除表之前删除 S3 文件夹。对于 Lake Formation 注册的表,这是必需的,因为从 Glue 数据目录中删除表后,无法使用删除 S3 文件夹的 Lake Formation 凭证。 -
spark.sql.catalog.<catalog>.glue.lakeformation-enabled=true
: 将 Iceberg 目录配置为使用 Amazon Lake Formation S3 凭据对 Lake Formation 注册的表。如果表未注册,请使用默认环境凭证。
在 SageMaker 统一工作室中配置全桌访问模式
要通过 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
分析表
修理台
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 位置创建 Amazon S3 文件夹。
Full Table Access 仅适用于 EMR 文件系统 (EMRFS)。S3A 文件系统不兼容。
Hive 和 Iceberg 表支持完全表访问权限。尚未添加对 Hudi 和 Delta 表的支持。
使用 Lake Formation 精细访问控制 (FGAC) 规则或 Glue 数据目录视图引用表格的作业将失败。要使用 FGAC 规则或 Glue 数据目录视图查询表,您需要使用 FGAC 模式。您可以按照 Amazon 文档中概述的步骤启用 FGAC 模式:使用 EMR Serverless 和 Lake Formation 进行精 Amazon 细的访问控制。
全表访问权限不支持 Spark 直播。
将 Spark DataFrame 写入 Lake Formation 表时,仅支持 APPEND 模式:
df.write.mode("append").saveAsTable(
table_name
)