問題
當嚐試通過DBFS掛載或直接在Spark api中訪問S3數據時,命令失敗,出現如下異常:
com.amazonaws.services.s3.model。AmazonS3Exception:禁止;請求ID: XXXXXXXXXXXXX,擴展請求ID: XXXXXXXXXXXXXXXXXXX,雲提供程序:AWS,實例ID: XXXXXXXXXX(服務:Amazon S3;狀態碼:403;錯誤碼:403禁止;請求ID: XXXXXXXXXXX;S3擴展請求ID:
導致
以下是常見的原因:
- 除了IAM角色之外,還使用AWS密鑰。使用全局初始化腳本設置AWS密鑰會導致這種行為。
- IAM角色具有訪問S3數據所需的權限,但AWS密鑰在Spark配置中設置。例如,設置spark.hadoop.fs.s3a.secret.key可能與IAM角色衝突。
- 通過筆記本從交互式集群在驅動程序節點上設置環境級別的AWS密鑰。
- DBFS掛載點是用AWS密鑰創建的,現在嚐試使用IAM角色訪問。
- 文件被寫入Databricks外部,桶所有者沒有讀權限(參見步驟7:更新跨帳戶S3對象acl).
- IAM角色未綁定到集群。
- 日誌含義已添加具有讀權限的IAM角色,但正在執行寫操作。即IAM角色對所執行的操作沒有足夠的權限。
解決方案
以下是避免此問題的建議和最佳實踐:
- 使用IAM角色代替AWS密鑰。
- 如果您試圖將配置從AWS密鑰切換到IAM角色,請卸載使用AWS密鑰創建的S3桶的DBFS掛載點,並使用IAM角色重新掛載。
- 避免使用全局初始化腳本設置AWS密鑰。如果需要,總是使用集群作用域的初始化腳本。
- 避免在筆記本或集群Spark配置中設置AWS密鑰。