問題
當您嚐試使用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桶位於不同的帳戶中,則調用propertynames和propertynames ACL作為Aws s3api cp命令:
Aws s3api放置對象-acl——bucket bucketname——key keyname——acl bucket-owner-full-control