问题
尝试访问由Databricks使用AWSCLI撰写的S3位置对象时发生下列错误:
Ubuntu@0213-174944-clean111-10-93-15-150:~$asss3cps3/ /0/delta/sandbox/deileringDemo__m2/_delta_log/00000000000000000000.json .致命错误:调用headObject操作时出错(403):禁止
因果
S3访问失败,因为桶ACL允许只访问桶主("DisplayName": "bigdata_dataservices")或您的账号(DisplayName:infra).
数据库文件系统根目录存储对象DBFS根桶分配Databricks存储元数据库等对象所有者(DatabricksAWS帐户内)是委托客户使用的语法用户标识
对象笔记本写入DBFS根桶接受下列对象权限:
{所有者}{DisplayName}:fra2d277eb1995a2a74d8170d035d3e8a6fc787696eb42c266c
上头识别码值识别databricks客户并扩展Databricks账号中的客户对象
求解
DBFS访问对象使用DatabricksCLI、DBFSAPI、Databricks实用程序或Apache数据bricks笔记本内API
需要从Databricks外部访问数据时,将数据从DBFS根桶迁移到另一个桶内,桶主可以完全控制
数据bricks不推荐使用DBFS根目录存储用户文件或对象创建不同的S3目录并挂载到DBFS总是最佳实践
有两种迁移场景
假想1:目的地数据平面和S3桶同存AWS帐户
确定将IM作用附加到数据当前位置的集群中集群需要IM作用以使其能够写入目的地
配置亚马逊S3ACLBucketOwnerFullControl中spark配置:
spark.hadoop.fs.s3a.acl.default BucketOwnerFullControl
BucketOwnerFullControl递归调用PutOjectACL属性和.现在文件权限正确并可用S3命令执行备份
假想2:目的地数据平面和S3桶位于不同的AWS帐户
对象仍然归Databricks所有,因为它是一个跨账户写法
为了避免此场景,你可以扮演角色实例剖析策略.
批注使用AWSAPI或CLI跨账户迁移
使用IM函数即时写入跨帐户桶时,Databricks数据平面和S3桶分入不同的帐户中,请调用PutObject并PutOjectACL成份s3apic命令 :
s3api点对acl-bucket桶名-key密钥名-acl桶所有者全控