无法访问数据键从外部写出对象

学习解决头向操作错误和访问数据键从外部Databricks写对象

写由亚当巴夫拉卡

2022年3月8日

问题

尝试访问由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作用以使其能够写入目的地

配置亚马逊S3ACLBucketOwnerFullControlspark配置:

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

BucketOwnerFullControl递归调用PutOjectACL属性和.现在文件权限正确并可用S3命令执行备份

假想2:目的地数据平面和S3桶位于不同的AWS帐户

对象仍然归Databricks所有,因为它是一个跨账户写法

为了避免此场景,你可以扮演角色实例剖析策略.

批注使用AWSAPI或CLI跨账户迁移

使用IM函数即时写入跨帐户桶时,Databricks数据平面和S3桶分入不同的帐户中,请调用PutObjectPutOjectACL成份s3apic命令 :

s3api点对acl-bucket桶名-key密钥名-acl桶所有者全控


文章有帮助吗