本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 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) 模式,您需要允許第三方查詢引擎來存取資料,而無需在 AWS Lake Formation中驗證 IAM 工作階段標籤。若要啟用,請遵循整合應用程式進行完整資料表存取中的步驟。
步驟 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 資料夾時使用內容類型標頭 application/x-directory,而非 $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
-
ANALYZE TABLE
-
REPAIR TABLE
-
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 時:
-
允許第三方查詢引擎在 AWS Lake Formation中存取資料,無需 IAM 工作階段標籤驗證。遵循步驟 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來實現。 -
使用 Amazon S3 主控台或 Amazon S3 CLI 在資料表位置
s3://path/to/table/table_name建立 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 同時使用。