問題
當使用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桶在不同的帳戶中,請調用propertynames和propertynames ACL作為aws s3api cp命令:
Aws s3api put-object-acl——bucket bucketname——key keyname——acl bucket-owner-full-control