無法從數據堆外部訪問數據堆寫入的對象

了解如何解決一個HeadObject操作錯誤和訪問對象寫的數據從外部數據ricks。

寫的亞當Pavlacka

最新發布日期:2022年3月8日

問題

當使用AWS CLI訪問數據ricks寫入的S3位置中的對象時,出現以下錯誤:

ubuntu@0213-174944-clean111-10-93-15-150:~$ aws s3 cp s3:////0/delta/sandbox/deileringDemo__m2/_delta_log/00000000000000000000。json。調用HeadObject操作時發生錯誤(403):禁止

導致

由於桶ACL隻允許桶的所有者訪問,導致S3訪問失敗(“DisplayName”:“bigdata_dataservices”)或您的帳戶(“DisplayName”:“下文”)

如果您試圖訪問存儲在數據垛文件係統(DBFS)根目錄中的數據垛對象,這是預期的行為。DBFS根桶被分配給Databricks,用於存儲元數據、庫等。因此,對象所有者(在Databricks AWS帳戶內)是分配給客戶的規範用戶ID。

從Databricks筆記本寫入DBFS根桶的對象將獲得以下對象權限:

{"Owner": {"DisplayName": "infra", "ID": "f65635fc2d277e71b19495a2a74d8170dd035d3e8aa6fc7187696eb42c6c276c"}}

“ID”值標識一個Databricks客戶,並擴展為Databricks帳戶中的客戶對象。

解決方案

要訪問DBFS中的對象,可以使用Databricks CLI、DBFS API、Databricks Utilities或Databricks筆記本中的Apache Spark API。

如果需要從外部Databricks訪問數據,請將DBFS根桶中的數據遷移到另一個桶的所有者可以完全控製的桶中。

事實上,Databricks不建議使用DBFS根目錄來存儲任何用戶文件或對象。創建一個不同的S3目錄並將其掛載到DBFS始終是最佳實踐。

有兩種遷移場景:

場景1:目標數據平麵和S3桶使用同一個AWS帳戶

請確保將IAM角色掛載到當前數據所在的集群中。集群需要IAM角色使其能夠向目的地寫入數據。

配置Amazon S3 ACL為BucketOwnerFullControl火花配置

spark.hadoop.fs.s3a.acl.default BucketOwnerFullControl

BucketOwnerFullControl遞歸調用putObjectACL財產。現在您對文件有了正確的權限,可以使用了S3執行備份的命令。

場景2:目的數據平麵和S3桶使用不同的AWS帳戶

對象仍然屬於Databricks,因為它是跨帳戶寫入。

為了避免這種情況,您可以扮演一個角色使用實例概要文件和一個假設角色策略

使用AWS API或CLI跨帳戶遷移的提示

如果使用IAM角色實例化,並寫入跨帳戶的桶,其中Databricks數據平麵和S3桶在不同的帳戶中,請調用propertynamespropertynames ACL作為aws s3api cp命令:

Aws s3api put-object-acl——bucket bucketname——key keyname——acl bucket-owner-full-control