本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 AWS Glue 搭配 AWS Lake Formation 進行完整資料表存取
完整資料表存取簡介
AWS Glue 5.0 會根據您在 中定義的政策,在 Apache Spark 中支援完整資料表存取 (FTA) AWS Lake Formation控制。當任務角色具有完整的資料表存取權時,此功能可在 AWS Lake Formation 已註冊的資料表上啟用 AWS Glue Spark 任務的讀取和寫入操作。FTA 非常適合需要符合資料表層級安全法規的使用案例,並支援 Spark 功能,包括具有 AWS Lake Formation 資料表的彈性分散式資料集 (RDDs)、自訂程式庫和使用者定義函數 (UDFs)。
當 AWS Glue Spark 任務設定為完整資料表存取 (FTA) 時, AWS Lake Formation 憑證用於讀取/寫入 AWS Lake Formation 已註冊資料表的 Amazon S3 資料,而任務的執行期角色登入資料將用於讀取/寫入未註冊的資料表 AWS Lake Formation。此功能可在 Apache Hive 和 Iceberg 資料表上啟用資料處理語言 (DML) 操作,包括 CREATE、ALTER、DELETE、UPDATE 和 MERGE INTO 陳述式。
注意
檢閱您的需求,並判斷精細存取控制 (FGAC) 或完整資料表存取 (FTA) 是否符合您的需求。指定 AWS Glue 任務只能啟用一種 AWS Lake Formation 許可方法。任務無法同時執行完整資料表存取 (FTA) 和精細存取控制 (FGAC)。
完整資料表存取 (FTA) 如何運作 AWS Glue
AWS Lake Formation 提供兩種資料存取控制方法:精細存取控制 (FGAC) 和完整資料表存取 (FTA)。FGAC 透過資料欄、資料列和儲存格層級篩選提供增強的安全性,非常適合需要精細許可的案例。FTA 非常適合您需要資料表層級許可的直接存取控制案例。它透過消除啟用精細存取模式的需求來簡化實作、透過避免系統驅動程式和系統執行器來改善效能並降低成本,並支援讀取和寫入操作 (包括 CREATE、ALTER、DELETE、UPDATE 和 MERGE INTO 命令)。
在 AWS Glue 4.0 中, AWS Lake Formation 基礎資料存取是透過 GlueContext 類別運作,即 提供的公用程式類別 AWS Glue。在 AWS Glue 5.0 中,透過原生 Spark SQL、Spark DataFrames 提供 AWS Lake Formation 以資料為基礎的存取,並繼續透過 GlueContext 類別支援。
實作完整資料表存取
步驟 1:在 中啟用完整資料表存取 AWS Lake Formation
若要使用完整資料表存取 (FTA) 模式,您需要允許第三方查詢引擎在沒有 IAM 工作階段標籤驗證的情況下存取資料 AWS Lake Formation。若要啟用,請依照應用程式整合中的步驟進行完整資料表存取。
步驟 2:設定任務執行時間角色的 IAM 許可
對於基礎資料的讀取或寫入存取權,除了 AWS Lake Formation 許可之外,任務執行期角色還需要 IAM lakeformation:GetDataAccess
許可。使用此許可, 會 AWS Lake Formation 授予暫時登入資料存取資料的請求。
以下是如何提供 IAM 許可以存取 Amazon S3 中的指令碼、將日誌上傳至 Amazon S3、 AWS Glue API 許可和存取許可的範例政策 AWS Lake Formation。
步驟 2.1 設定 AWS Lake Formation 許可
AWS Glue 從 Amazon S3 讀取資料的 Spark 任務需要 AWS Lake Formation SELECT 許可。
AWS Glue 在 Amazon S3 中寫入/刪除資料的 Spark 任務需要 AWS Lake Formation ALL 許可。
AWS Glue 與 AWS Glue 資料目錄互動的 Spark 任務需要適當的 DESCRIBE、ALTER、DROP 許可。
步驟 3:使用 初始化完整資料表存取的 Spark 工作階段 AWS Lake Formation
若要存取向 註冊的資料表 AWS Lake Formation,需要在 Spark 初始化期間設定下列組態,以將 Spark 設定為使用 AWS Lake Formation 登入資料。
若要存取向 註冊的資料表 AWS Lake Formation,您需要明確設定 Spark 工作階段以使用 AWS Lake Formation 登入資料。在初始化 Spark 工作階段時新增下列組態:
from pyspark.sql import SparkSession # Initialize Spark session with Lake Formation configurations spark = SparkSession.builder \ .appName("Lake Formation Full Table Access") \ .config("spark.sql.catalog.glue_catalog", "org.apache.spark.sql.catalog.hive.GlueCatalog") \ .config("spark.sql.catalog.glue_catalog.glue.lakeformation-enabled", "true") \ .config("spark.sql.defaultCatalog", "glue_catalog") \ .getOrCreate()
金鑰組態:
-
spark.sql.catalog.glue_catalog
:註冊名為 "glue_catalog" 的目錄,該目錄使用 GlueCatalog 實作 -
spark.sql.catalog.glue_catalog.glue.lakeformation-enabled
:明確啟用此目錄的 AWS Lake Formation 整合 -
目錄名稱 (在此範例中為「glue_catalog」) 可以自訂,但必須在兩個組態設定中保持一致
Hive
‐‐conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.AWS Glue.accesscontrol.AWSLakeFormationCredentialResolver --conf spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true --conf spark.hadoop.fs.s3.folderObject.autoAction.disabled=true --conf spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true --conf spark.sql.catalog.createDirectoryAfterTable.enabled=true --conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
Iceberg
--conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.AWS Glue.accesscontrol.AWSLakeFormationCredentialResolver --conf spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true --conf spark.hadoop.fs.s3.folderObject.autoAction.disabled=true --conf spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true --conf spark.sql.catalog.createDirectoryAfterTable.enabled=true --conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true --conf spark.sql.catalog.<catalog>.AWS Glue.lakeformation-enabled=true
-
spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.AWS Glue.accesscontrol.AWSLakeFormationCredentialResolver
:將 EMR Filesystem (EMRFS) 設定為使用已 AWS Lake Formation 註冊資料表的 AWS Lake Formation S3 登入資料。如果未註冊資料表,請使用任務的執行期角色登入資料。 -
spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true
和spark.hadoop.fs.s3.folderObject.autoAction.disabled=true
:將 EMRFS 設定為在建立 S3 資料夾時使用內容類型標頭應用程式/x 目錄,而不是 $folder$ 尾碼。這是讀取 AWS Lake Formation 資料表時的必要項目,因為 AWS Lake Formation 登入資料不允許使用 $folder$ 尾碼讀取資料表資料夾。 -
spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true
:設定 Spark 在建立之前略過驗證資料表位置的空白。這對於 AWS Lake Formation 已註冊的資料表是必要的,因為 AWS Lake Formation 驗證空位置的登入資料只有在 AWS Glue 資料目錄資料表建立後才能使用。如果沒有此組態,任務的執行期角色登入資料將驗證空的資料表位置。 -
spark.sql.catalog.createDirectoryAfterTable.enabled=true
:設定 Spark 在 Hive 中繼存放區中建立資料表之後建立 Amazon S3 資料夾。這是 AWS Lake Formation 已註冊資料表的必要項目,因為建立 Amazon S3 資料夾的 AWS Lake Formation 登入資料只能在 AWS Glue 建立 Data Catalog 資料表之後使用。 -
spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
:設定 Spark 在 Hive 中繼存放區中刪除資料表之前捨棄 Amazon S3 資料夾。這是 AWS Lake Formation 已註冊資料表的必要項目,因為從 AWS Glue Data Catalog 刪除資料表後,無法使用捨棄 S3 資料夾的 AWS Lake Formation 登入資料。 -
spark.sql.catalog.<catalog>.AWS Glue.lakeformation-enabled=true
:設定 Iceberg 目錄以使用已 AWS Lake Formation 註冊資料表的 AWS Lake Formation Amazon S3 登入資料。如果未註冊資料表,請使用預設環境登入資料。
用量模式
搭配 DataFrames 使用 FTA
對於熟悉 Spark 的使用者,DataFrames 可以與 AWS Lake Formation 完整資料表存取搭配使用。
AWS Glue 5.0 新增對 Lake Formation Full Table Access 的原生 Spark 支援,簡化您使用受保護資料表的方式。此功能可讓 AWS Glue 5.0 AWS Glue Spark 任務在授予完整資料表存取時直接讀取和寫入資料,移除先前限制特定擷取、轉換和載入 (ETL) 操作的限制。您現在可以利用進階 Spark 功能,包括彈性分散式資料集 (RDDs)、自訂程式庫,以及具有 AWS Lake Formation 資料表的使用者定義函數 (UDFs)。
AWS Glue 5.0 版的原生 Spark FTA
AWS Glue 5.0 會根據您在 中定義的政策,在 Apache Spark 中支援完整資料表存取 (FTA) AWS Lake Formation控制。此控制層級非常適合需要符合資料表層級安全法規的使用案例。
Apache Iceberg 資料表範例
from pyspark.sql import SparkSession catalog_name = "spark_catalog" aws_region = "us-east-1" aws_account_id = "123456789012" warehouse_path = "s3://amzn-s3-demo-bucket/warehouse/" spark = SparkSession.builder \ .config("spark.sql.extensions","org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \ .config(f"spark.sql.catalog.{catalog_name}", "org.apache.iceberg.spark.SparkSessionCatalog") \ .config(f"spark.sql.catalog.{catalog_name}.warehouse", f"{warehouse_path}") \ .config(f"spark.sql.catalog.{catalog_name}.client.region",f"{aws_region}") \ .config(f"spark.sql.catalog.{catalog_name}.glue.account-id",f"{aws_account_id}") \ .config(f"spark.sql.catalog.{catalog_name}.glue.lakeformation-enabled","true") \ .config(f"spark.sql.catalog.dropDirectoryBeforeTable.enabled", "true") \ .config(f"spark.sql.catalog.{catalog_name}.catalog-impl", "org.apache.iceberg.aws.glue.GlueCatalog") \ .config(f"spark.sql.catalog.{catalog_name}.io-impl", "org.apache.iceberg.aws.s3.S3FileIO") \ .config("spark.sql.defaultCatalog", catalog_name) \ # Add this line .getOrCreate() database_name = "your_database" table_name = "your_table" df = spark.sql(f"select * from {database_name}.{table_name}") df.show()
所需的 IAM 許可
您的 AWS Glue 任務執行角色必須具有:
{ "Action": "lakeformation:GetDataAccess", "Resource": "*", "Effect": "Allow" }
加上資料位置的適當 S3 存取許可。
Lake Formation 組態
使用原生 Spark FTA in AWS Glue 5.0 之前:
-
允許第三方查詢引擎在沒有 IAM 工作階段標籤驗證的情況下存取資料 AWS Lake Formation
-
透過 AWS Lake Formation 主控台將適當的資料表許可授予您的 AWS Glue 任務執行角色
-
使用上述範例所示的必要參數來設定 Spark 工作階段
搭配 DynamicFrames 使用 FTA
AWS Glue的原生 DynamicFrames 可與 AWS Lake Formation 完整資料表存取搭配使用,以最佳化 ETL 操作。完整資料表存取 (FTA) 提供在資料表層級授予許可的安全模型,相較於精細存取控制 (FGAC),可以更快速地處理資料,因為它可以繞過資料列和資料欄層級許可檢查的額外負荷。當您需要處理整個資料表和資料表層級許可以符合您的安全需求時,此方法很有用。
在 AWS Glue 4.0 中,具有 FTA 的 DynamicFrames 需要特定的 GlueContext 組態。雖然具有 FTA 的現有 AWS Glue 4.0 DynamicFrame 程式碼將繼續在 AWS Glue 5.0 中運作,但較新版本也提供具有更高彈性的原生 Spark FTA 支援。對於新開發,請考慮使用 DataFrames 一節所述的原生 Spark 方法,特別是如果您需要額外功能,例如彈性分散式資料集 (RDDs)、自訂程式庫和使用者定義函數 (UDFs) 與 AWS Lake Formation 資料表。
所需的許可
執行 Glue 任務的 IAM 角色必須具有:
-
lakeformation:GetDataAccess
許可 -
透過 Lake Formation 主控台授予的適當 Lake Formation 資料表許可
AWS Glue 5.0 中的 DynamicFrame 實作範例
from awsglue.context import GlueContext from pyspark.context import SparkContext # Initialize Glue context sc = SparkContext() glueContext = GlueContext(sc) # Configure catalog for Iceberg tables catalog_name = "glue_catalog" aws_region = "us-east-1" aws_account_id = "123456789012" warehouse_path = "s3://amzn-s3-demo-bucket/warehouse/" spark = glueContext.spark_session spark.conf.set(f"spark.sql.catalog.{catalog_name}", "org.apache.iceberg.spark.SparkCatalog") spark.conf.set(f"spark.sql.catalog.{catalog_name}.warehouse", f"{warehouse_path}") spark.conf.set(f"spark.sql.catalog.{catalog_name}.catalog-impl", "org.apache.iceberg.aws.glue.GlueCatalog") spark.conf.set(f"spark.sql.catalog.{catalog_name}.io-impl", "org.apache.iceberg.aws.s3.S3FileIO") spark.conf.set(f"spark.sql.catalog.{catalog_name}.glue.lakeformation-enabled","true") spark.conf.set(f"spark.sql.catalog.{catalog_name}.client.region",f"{aws_region}") spark.conf.set(f"spark.sql.catalog.{catalog_name}.glue.id", f"{aws_account_id}") # Read Lake Formation-protected table with DynamicFrame df = glueContext.create_data_frame.from_catalog( database="your_database", table_name="your_table" )
其他組態
在 AWS Glue Studio 筆記本中設定完整資料表存取模式
若要從 AWS Glue Studio 筆記本中的互動式 Spark 工作階段存取 AWS Lake Formation 已註冊的資料表,您必須使用相容性許可模式。啟動互動式工作階段之前,請使用%%configure
魔術命令來設定 Spark 組態。此組態必須是筆記本中的第一個命令,因為在工作階段啟動後無法套用。根據您的資料表類型選擇組態:
對於 Hive 資料表
%%configure --conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver --conf spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true --conf spark.hadoop.fs.s3.folderObject.autoAction.disabled=true --conf spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true --conf spark.sql.catalog.createDirectoryAfterTable.enabled=true --conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
對於 Iceberg 資料表
%%configure --conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver --conf spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true --conf spark.hadoop.fs.s3.folderObject.autoAction.disabled=true --conf spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true --conf spark.sql.catalog.createDirectoryAfterTable.enabled=true --conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true --conf spark.sql.catalog.glue_catalog.glue.lakeformation-enabled=true --conf spark.sql.catalog.glue_catalog.warehouse=s3://example-s3-bucket_DATA_LOCATION --conf spark.sql.catalog.glue_catalog.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog --conf spark.sql.catalog.glue_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO --conf spark.sql.catalog.glue_catalog.glue.account-id=ACCOUNT_ID --conf spark.sql.catalog.glue_catalog.glue.region=REGION
取代預留位置:
-
S3_DATA_LOCATION:
s3://amzn-s3-demo-bucket
-
REGION:
AWS 區域 (例如 us-east-1)
-
ACCOUNT_ID:
AWS 您的帳戶 ID
注意
您必須先設定這些組態,才能在筆記本中執行任何 Spark 操作。
受支援的 操作
這些操作將使用 AWS Lake Formation 登入資料來存取資料表資料。
注意
啟用時 AWS Lake Formation:
-
對於 FTA:啟用 Spark 組態
spark.sql.catalog.{catalog_name}.glue.lakeformation-enabled
-
CREATE TABLE
-
ALTER TABLE
-
INSERT INTO
-
INSERT OVERWRITE
-
SELECT
-
UPDATE
-
合併為
-
DELETE FROM
-
分析表
-
修補資料表
-
DROP TABLE
-
Spark 資料來源查詢
-
Spark 資料來源寫入
注意
上面未列出的操作將繼續使用 IAM 許可來存取資料表資料。
從 AWS Glue 4.0 遷移至 AWS Glue 5.0 FTA
從 AWS Glue 4.0 GlueContext FTA 遷移至 AWS Glue 5.0 原生 Spark FTA 時:
-
允許第三方查詢引擎在沒有 IAM 工作階段標籤驗證的情況下存取資料 AWS Lake Formation。遵循 步驟 1:在 中啟用完整資料表存取 AWS Lake Formation。
-
您不需要變更任務執行時間角色。不過,請確認 AWS Glue 任務執行角色具有 lakeformation:GetDataAccess IAM 許可。
-
修改指令碼中的 Spark 工作階段組態。確保存在下列 Spark 組態:
--conf spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog --conf spark.sql.catalog.spark_catalog.warehouse=s3://<bucket-name>/warehouse/ --conf spark.sql.catalog.spark_catalog.client.region=<REGION> --conf spark.sql.catalog.spark_catalog.glue.account-id=ACCOUNT_ID --conf spark.sql.catalog.spark_catalog.glue.lakeformation-enabled=true --conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
-
更新指令碼,以便將 GlueContext DataFrames 變更為原生 spark DataFrames。
-
更新您的 AWS Glue 任務以使用 AWS Glue 5.0
考量事項與限制
-
如果 Hive 資料表是使用未啟用完整資料表存取的任務建立,且未插入任何記錄,則具有完整資料表存取的任務後續讀取或寫入將會失敗。這是因為沒有完整資料表存取權的 AWS Glue Spark 會將 $folder$ 尾碼新增至資料表資料夾名稱。若要解決此問題,您可以:
-
從未啟用 FTA 的任務將至少一列插入資料表。
-
將未啟用 FTA 的任務設定為在 S3 的資料夾名稱中使用 $folder$ 尾碼。這可以透過設定 Spark 組態 來實現
spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true
。 -
s3://path/to/table/table_name
使用 Amazon S3 主控台或 Amazon S3 CLI 在資料表位置建立 Amazon S3 資料夾。
-
-
完整資料表存取僅適用於 EMR Filesystem (EMRFS)。S3A 檔案系統不相容。
-
Hive 和 Iceberg 資料表支援完整資料表存取。尚未新增對 Hudi 和 Delta 資料表的支援。
-
參考具有 AWS Lake Formation 精細存取控制 (FGAC) 規則或 AWS Glue 資料目錄檢視的資料表的任務將會失敗。若要查詢具有 FGAC 規則或 AWS Glue 資料目錄檢視的資料表,您需要使用 FGAC 模式。您可以依照 AWS 文件中概述的步驟來啟用 FGAC 模式:使用 AWS Glue 搭配 AWS Lake Formation 進行精細存取控制。
-
完整資料表存取不支援 Spark 串流。
-
無法與 FGAC 同時使用。