不能從Databricks外部訪問由Databricks寫入的對象

學習如何解決HeadObject操作錯誤,以及如何從Databricks外部訪問由Databricks編寫的對象。

寫的亞當Pavlacka

最後發布時間:2022年3月8日

問題

當您嚐試使用AWS CLI訪問Databricks寫入的S3位置中的對象時,出現以下錯誤:

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

導致

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

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

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

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

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

解決方案

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

如果需要從Databricks外部訪問數據,請將DBFS根桶中的數據遷移到桶所有者擁有完全控製權的其他桶中。

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

有兩種遷移場景:

場景1:目的Databricks數據平麵和S3桶在同一個AWS帳戶中

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

配置Amazon S3 ACL為BucketOwnerFullControl火花配置

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

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

場景2:目的Databricks數據平麵和S3桶在不同的AWS帳戶中

對象仍然由Databricks擁有,因為它是跨帳戶寫入。

為了避免這種情況,您可以假設一個角色使用帶有假設角色策略的實例概要

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

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

Aws s3api放置對象-acl——bucket bucketname——key keyname——acl bucket-owner-full-control