问题
当试图通过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密钥。