将 EMR Serverless 与配合使用以实现精细 AWS Lake Formation 的访问控制 - Amazon EMR

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

将 EMR Serverless 与配合使用以实现精细 AWS Lake Formation 的访问控制

概览

在 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 定价。

EMR Serverless 如何与 AWS Lake Formation结合使用

将 EMR Serverless 与 Lake Formation 结合使用,您可以对每个 Spark 作业强制执行一层权限,以便在 EMR Serverless 执行作业时应用 Lake Formation 权限控制。EMR Serverless 使用 Spark 资源配置文件创建两个配置文件来有效执行作业。用户配置文件执行用户提供的代码,而系统配置文件强制执行 Lake Formation 策略。有关更多信息,请参阅什么是 AWS Lake Formation以及注意事项和限制

当你在 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 安全策略保护的数据。

亚马逊 EMR 如何访问受 Lake Formation 安全策略保护的数据。
  1. 用户将 Spark 作业提交到 AWS Lake Formation启用了 EMR 的无服务器应用程序。

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

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

  4. 然后,EMR Serverless 使用用户驱动程序或系统驱动程序在执行程序上运行这些阶段。任何阶段的用户代码都只能在用户配置文件执行程序上运行。

  5. 从受安全筛选器保护的数据目录表中读取数据的阶段 AWS Lake Formation 或应用安全筛选器的阶段将委托给系统执行者。

在 Amazon EMR 中启用 Lake Formation

要启用 Lake Formati spark.emr-serverless.lakeformation.enabled on,请在创建 EMR Serverless 应用程序时将运行时配置参数设置为spark-defaults分类true下方。

aws emr-serverless create-application \ --release-label emr-7.10.0 \ --runtime-configuration '{ "classification": "spark-defaults", "properties": { "spark.emr-serverless.lakeformation.enabled": "true" } }' \ --type "SPARK"

您还可以在 EMR Studio 中创建新应用程序时启用 Lake Formation。在其他配置下,选择使用 Lake Formation 进行精细访问控制

当您将 Lake F@@ ormation 与 EMR Serverless 结合使用时,默认情况下会启用工作器间加密,因此您无需再次明确启用工作者间加密。

为 Spark 作业启用 Lake Formation

要为单个 Spark 作业启用 Lake Formation,请在使用 spark-submit 时将 spark.emr-serverless.lakeformation.enabled 设置为 true。

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

作业运行时角色 IAM 权限

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 的作业运行时角色权限

首先,在 Lake Formation 中注册 Hive 表的位置。然后在所需的表上创建作业运行时角色的权限。有关 Lake Formation 的更多详情,请参阅什么是 AWS Lake Formation? 在《AWS Lake Formation 开发人员指南》中。

设置 Lake Formation 权限后,在亚马逊 EMR Serverless 上提交 Spark 任务。有关 Spark 任务的更多信息,请参阅 Spark 示例

提交作业运行

设置 Lake Formation 授权后,便可以在 Amazon EMR Serverless 上提交 Spark 作业。以下部分显示了如何配置和提交作业运行属性的示例。

开放表格式支持

EMR Serverless 支持 Apache Hive、Apache Iceberg,以及从 7.6.0 版本起的 Delta Lake 和 Apache Hudi。有关操作支持的信息,请参阅以下选项卡。

Hive
操作 备注
读取操作 完全支持
递增查询 不适用
时间旅行查询 不适用于此表格式
DML INSERT 仅具有 IAM 权限
DML UPDATE 不适用于此表格式
DML DELETE 不适用于此表格式
DDL 命令 仅具有 IAM 权限
元数据表 不适用于此表格式
存储过程 不适用
餐桌维护和实用功能 不适用
Iceberg
操作 备注
读取操作 完全支持
递增查询 完全支持
时间旅行查询 完全支持
DML INSERT 仅具有 IAM 权限
DML UPDATE 仅具有 IAM 权限
DML DELETE 仅具有 IAM 权限
DDL 命令 仅具有 IAM 权限
元数据表 支持,但某些表被隐藏。有关更多信息,请参阅注意事项和限制
存储过程 支持,但 register_tablemigrate 除外。有关更多信息,请参阅注意事项和限制
餐桌维护和实用功能 不适用

冰山的 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
操作 备注
读取操作 完全支持
递增查询 完全支持
时间旅行查询 完全支持
DML INSERT 仅具有 IAM 权限
DML UPDATE 仅具有 IAM 权限
DML DELETE 仅具有 IAM 权限
DDL 命令 仅具有 IAM 权限
元数据表 不支持
存储过程 不适用
餐桌维护和实用功能 不支持

以下示例使用 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
操作 备注
读取操作 完全支持
递增查询 完全支持
时间旅行查询 完全支持
DML INSERT 仅具有 IAM 权限
DML UPDATE 仅具有 IAM 权限
DML DELETE 仅具有 IAM 权限
DDL 命令 仅具有 IAM 权限
元数据表 不支持
存储过程 不适用
餐桌维护和实用功能 不支持

带有 Delta Lake 的 EMR Serverless:要在 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 \