使用 EMR Serverless 搭配 AWS Lake Formation 進行精細存取控制 - Amazon EMR

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 EMR Serverless 搭配 AWS Lake Formation 進行精細存取控制

概觀

使用 Amazon EMR 7.2.0 版和更新版本,利用 AWS Lake Formation 對 S3 支援的 Data Catalog 資料表套用精細存取控制。此功能可讓您設定 Amazon EMR Serverless Spark 任務中read查詢的資料表、資料列、資料欄和儲存格層級存取控制。若要設定 Apache Spark 批次任務和互動式工作階段的精細存取控制,請使用 EMR Studio。請參閱下列各節,進一步了解 Lake Formation 以及如何搭配 EMR Serverless 使用。

搭配 使用 Amazon EMR Serverless AWS Lake Formation 會產生額外費用。如需詳細資訊,請參閱 Amazon EMR 定價

EMR Serverless 如何使用 AWS Lake Formation

搭配 Lake Formation 使用 EMR Serverless 可讓您對每個 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 安全政策所保護資料的高階概觀。

Amazon EMR 如何存取受 Lake Formation 安全政策保護的資料。
  1. 使用者將 Spark 任務提交至 AWS Lake Formation已啟用 EMR Serverless 應用程式。

  2. EMR Serverless 會將任務傳送給使用者驅動程式,並在使用者設定檔中執行任務。使用者驅動程式會執行 Spark 的精簡版本,該版本無法啟動任務、請求執行器、存取 S3 或 Glue Catalog。其會建置任務計畫。

  3. EMR Serverless 會設定第二個稱為系統驅動程式的驅動程式,並在系統設定檔中執行它 (具有特殊權限身分)。EMR Serverless 會在兩個驅動程式之間設定加密的 TLS 頻道以進行通訊。使用者驅動程式使用該頻道將任務計劃傳送至系統驅動程式。系統驅動程式不會執行使用者提交的程式碼。其會執行完整的 Spark,並與 S3 和 Data Catalog 通訊以進行資料存取。其會請求執行器,並將任務計畫編譯成一系列的執行階段。

  4. 然後,EMR Serverless 會使用使用者驅動程式或系統驅動程式在執行器上執行階段。任何階段的使用者程式碼只會在使用者設定檔執行器上執行。

  5. 從受 保護的 Data Catalog 資料表 AWS Lake Formation 或套用安全篩選條件的資料表讀取資料的階段,會委派給系統執行器。

在 Amazon EMR 中啟用 Lake Formation

若要啟用 Lake Formation,請在建立 EMR Serverless 應用程式時,將 Runtime-configuration 參數的spark-defaults分類spark.emr-serverless.lakeformation.enabled設為 true

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

您也可以在 EMR Studio 中建立新應用程式時啟用 Lake Formation。選擇使用 Lake Formation 進行精細存取控制,可在其他組態下使用。

使用 Lake Formation 搭配 EMR Serverless 時,預設會啟用工作者間加密,因此您不需要再次明確啟用工作者間加密。

為 Spark 任務啟用 Lake Formation

若要為個別 Spark 任務啟用 Lake Formation,請在使用 時spark.emr-serverless.lakeformation.enabled將 設定為 truespark-submit

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

任務執行時期角色 IAM 許可

Lake Formation 許可控制對 AWS Glue Data Catalog 資源、Amazon S3 位置和這些位置基礎資料的存取。IAM 許可可控制對 Lake Formation 和 AWS Glue API 和資源的存取。雖然您可能具有 Lake Formation 許可來存取 Data Catalog (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 許可後,請在 Amazon EMR Serverless 上提交 Spark 任務。如需 Spark 任務的詳細資訊,請參閱 Spark 範例

提交任務執行

完成 Lake Formation 授予的設定後,您可以在 EMR Serverless 上提交 Spark 任務。以下章節顯示如何設定和提交任務執行屬性的範例。

許可要求

資料表未在 中註冊 AWS Lake Formation

對於未向 註冊的資料表 AWS Lake Formation,任務執行期角色會存取 AWS Glue Data Catalog 和 Amazon S3 中的基礎資料表資料。這需要任務執行時間角色才能同時擁有 Glue 和 Amazon S3 AWS 操作的適當 IAM 許可。

在 中註冊的資料表 AWS Lake Formation

對於向 註冊的資料表 AWS Lake Formation,任務執行時間角色會存取 AWS Glue Data Catalog 中繼資料,而 Lake Formation 提供的臨時憑證則會存取 Amazon S3 中的基礎資料表資料。執行 操作所需的 Lake Formation 許可取決於 Spark 任務啟動的 AWS Glue Data Catalog 和 Amazon S3 API 呼叫,可以摘要如下:

  • DESCRIBE 許可允許執行期角色讀取 Data Catalog 中的資料表或資料庫中繼資料

  • ALTER 許可允許執行期角色修改 Data Catalog 中的資料表或資料庫中繼資料

  • DROP 許可允許執行期角色從 Data Catalog 刪除資料表或資料庫中繼資料

  • SELECT 許可允許執行期角色從 Amazon S3 讀取資料表資料

  • INSERT 許可允許執行期角色將資料表資料寫入 Amazon S3

  • DELETE 許可允許執行期角色從 Amazon S3 刪除資料表資料

    注意

    當 Spark 任務呼叫 AWS Glue 擷取資料表中繼資料和 Amazon S3 擷取資料表資料時,Lake Formation 會延遲評估許可。在 Spark 進行需要缺少許可的 AWS Glue 或 Amazon S3 呼叫之前,使用執行時間角色且許可不足的任務不會失敗。

注意

在下列支援的資料表矩陣中:

  • 標示為 Supported 的操作只會使用 Lake Formation 登入資料來存取向 Lake Formation 註冊之資料表的資料表資料。如果 Lake Formation 許可不足,操作將不會回復為執行時間角色登入資料。對於未向 Lake Formation 註冊的資料表,任務執行期角色登入資料會存取資料表資料。

  • Amazon S3 位置上標記為支援 IAM 許可的操作不會使用 Lake Formation 登入資料來存取 Amazon S3 中的基礎資料表資料。若要執行這些操作,任務執行期角色必須具有存取資料表資料的必要 Amazon S3 IAM 許可,無論資料表是否已向 Lake Formation 註冊。

Hive
作業 AWS Lake Formation 許可 支援狀態
SELECT SELECT 支援
CREATE TABLE CREATE_TABLE 支援
CREATE TABLE LIKE CREATE_TABLE 在 Amazon S3 位置上支援 IAM 許可
CREATE TABLE AS SELECT CREATE_TABLE 在 Amazon S3 位置上支援 IAM 許可
DESCRIBE TABLE DESCRIBE 支援
SHOW TBLPROPERTIES DESCRIBE 支援
SHOW COLUMNS DESCRIBE 支援
SHOW PARTITIONS DESCRIBE 支援
SHOW CREATE TABLE DESCRIBE 支援
ALTER 資料表 tablename SELECT 和 ALTER 支援
ALTER TABLE tablename SET 位置 - 不支援
ALTER TABLE tablename新增參與者 SELECT、INSERT 和 ALTER 支援
REPAIR TABLE SELECT 和 ALTER 支援
載入資料 不支援
INSERT INSERT 和 ALTER 支援
INSERT OVERWRITE SELECT、INSERT、DELETE 和 ALTER 支援
DROP TABLE SELECT、DROP、DELETE 和 ALTER 支援
TRUNCATE TABLE SELECT、INSERT、DELETE 和 ALTER 支援
Dataframe Writer V1 與對應的 SQL 操作相同

將資料附加至現有資料表時支援。如需詳細資訊,請參閱考量事項和限制

Dataframe Writer V2 與對應的 SQL 操作相同

將資料附加至現有資料表時支援。如需詳細資訊,請參閱考量事項和限制

Iceberg
作業 AWS Lake Formation 許可 支援狀態
SELECT SELECT 支援
CREATE TABLE CREATE_TABLE 支援
CREATE TABLE LIKE CREATE_TABLE 在 Amazon S3 位置上支援 IAM 許可
CREATE TABLE AS SELECT CREATE_TABLE 在 Amazon S3 位置上支援 IAM 許可
將資料表取代為 SELECT SELECT、INSERT 和 ALTER 支援
DESCRIBE TABLE DESCRIBE 在 Amazon S3 位置上支援 IAM 許可
SHOW TBLPROPERTIES DESCRIBE 在 Amazon S3 位置上支援 IAM 許可
SHOW CREATE TABLE DESCRIBE 在 Amazon S3 位置上支援 IAM 許可
ALTER TABLE SELECT、INSERT 和 ALTER 支援
ALTER TABLE SET LOCATION SELECT、INSERT 和 ALTER 在 Amazon S3 位置上支援 IAM 許可
更改 排序的資料表寫入 SELECT、INSERT 和 ALTER 在 Amazon S3 位置上支援 IAM 許可
更改 分佈的資料表寫入 SELECT、INSERT 和 ALTER 在 Amazon S3 位置上支援 IAM 許可
ALTER TABLE 重新命名表 CREATE_TABLE 和 DROP 支援
INSERT INTO SELECT、INSERT 和 ALTER 支援
INSERT OVERWRITE SELECT、INSERT 和 ALTER 支援
DELETE SELECT、INSERT 和 ALTER 支援
UPDATE SELECT、INSERT 和 ALTER 支援
合併為 SELECT、INSERT 和 ALTER 支援
DROP TABLE SELECT、DELETE 和 DROP 支援
DataFrame 寫入器 V1 - 不支援
DataFrame 寫入器 V2 與對應的 SQL 操作相同

將資料附加至現有資料表時支援。如需詳細資訊,請參閱考量事項和限制

中繼資料表 SELECT 支援。某些資料表會隱藏。如需詳細資訊,請參閱考量事項和限制
預存程序 - 支援符合下列條件的資料表:
  • 資料表未在 中註冊 AWS Lake Formation

  • 不使用 register_table和 的資料表 migrate

    如需詳細資訊,請參閱考量事項和限制

Iceberg 的 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
作業 AWS Lake Formation 許可 支援狀態
SELECT SELECT 支援
CREATE TABLE CREATE_TABLE 在 Amazon S3 位置上支援 IAM 許可
CREATE TABLE LIKE CREATE_TABLE 在 Amazon S3 位置上支援 IAM 許可
CREATE TABLE AS SELECT - 不支援
DESCRIBE TABLE DESCRIBE 在 Amazon S3 位置上支援 IAM 許可
SHOW TBLPROPERTIES DESCRIBE 在 Amazon S3 位置上支援 IAM 許可
SHOW COLUMNS DESCRIBE 在 Amazon S3 位置上支援 IAM 許可
SHOW CREATE TABLE DESCRIBE 在 Amazon S3 位置上支援 IAM 許可
ALTER TABLE SELECT 在 Amazon S3 位置上支援 IAM 許可
INSERT INTO SELECT 和 ALTER 在 Amazon S3 位置上支援 IAM 許可
INSERT OVERWRITE SELECT 和 ALTER 在 Amazon S3 位置上支援 IAM 許可
DELETE - 不支援
UPDATE - 不支援
合併為 - 不支援
DROP TABLE SELECT 和 DROP 在 Amazon S3 位置上支援 IAM 許可
DataFrame 寫入器 V1 - 不支援
DataFrame 寫入器 V2 與對應的 SQL 操作相同 在 Amazon S3 位置上支援 IAM 許可
中繼資料表 - 不支援
資料表維護和公用程式功能 - 不支援

下列範例使用 Hudi 設定 Spark,指定檔案位置和其他使用所需的屬性。

Hudi 的 Spark 組態:此程式碼片段用於筆記本時,會指定 Hudi Spark 套件 JAR 檔案的路徑,以啟用 Spark 中的 Hudi 功能。它也會將 Spark 設定為使用 AWS Glue Data Catalog 作為中繼存放區。

%%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" } }

Hudi 與 Glue AWS 的 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
作業 AWS Lake Formation 許可 支援狀態
SELECT SELECT 支援
CREATE TABLE CREATE_TABLE 支援
CREATE TABLE LIKE - 不支援
CREATE TABLE AS SELECT CREATE_TABLE 支援
將資料表取代為 SELECT SELECT、INSERT 和 ALTER 支援
DESCRIBE TABLE DESCRIBE 在 Amazon S3 位置上支援 IAM 許可
SHOW TBLPROPERTIES DESCRIBE 在 Amazon S3 位置上支援 IAM 許可
SHOW COLUMNS DESCRIBE 在 Amazon S3 位置上支援 IAM 許可
SHOW CREATE TABLE DESCRIBE 在 Amazon S3 位置上支援 IAM 許可
ALTER TABLE SELECT 和 INSERT 支援
ALTER TABLE SET LOCATION SELECT 和 INSERT 在 Amazon S3 位置上支援 IAM 許可
ALTER TABLE tablename CLUSTER BY SELECT 和 INSERT 在 Amazon S3 位置上支援 IAM 許可
更改資料表tablename新增限制條件 SELECT 和 INSERT 在 Amazon S3 位置上支援 IAM 許可
更改資料表tablename捨棄限制條件 SELECT 和 INSERT 在 Amazon S3 位置上支援 IAM 許可
INSERT INTO SELECT 和 INSERT 支援
INSERT OVERWRITE SELECT 和 INSERT 支援
DELETE SELECT 和 INSERT 支援
UPDATE SELECT 和 INSERT 支援
合併為 SELECT 和 INSERT 支援
DROP TABLE SELECT、DELETE 和 DROP 支援
DataFrame 寫入器 V1 - 不支援
DataFrame 寫入器 V2 與對應的 SQL 操作相同

支援

資料表維護和公用程式功能 - 不支援

搭配 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 \