Spark凭证链排序-禁止S3异常

时间:2019-02-14 20:51:38

标签: amazon-web-services apache-spark amazon-s3

我正在EC2实例上运行Spark 2.4。我承担着IAM角色,并在sparkSession.sparkContext.hadoopConfiguration中设置密钥/秘密密钥/令牌,并将凭据提供程序设置为“ org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider”。

当我尝试从s3中读取数据集时(使用s3a,这也是在hadoop配置中设置的),我收到一条错误消息

  

com.amazonaws.services.s3.model.AmazonS3Exception:状态代码:403,AWS服务:Amazon S3,AWS请求ID:7376FE009AD36330,AWS错误代码:null,AWS错误消息:禁止

读取命令:

val myData = sparkSession.read.parquet("s3a://myBucket/myKey")

我反复检查了S3路径,它是正确的。我假设的IAM角色在S3存储桶上具有正确的特权。在这一点上,我唯一能想到的是spark具有某种隐藏的凭证链排序,即使我在hadoop配置中设置了凭证,它仍然从其他地方(我的实例配置文件?)获取凭证。但是我无法诊断出来。

感谢您的帮助。很高兴提供更多详细信息。

1 个答案:

答案 0 :(得分:1)

  1. spark-submit将获取您的环境变量,并将其设置为fs.s3a访问+秘密+会话密钥,覆盖您已经设置的任何变量。
  2. 如果只想使用IAM凭据,只需将public class StartWindowViewModel : BindableBase, IStartWindowViewModel { private readonly IRegionManager regionManager; public StartWindowViewModel(IRegionManager regionManager) { this.regionManager = regionManager; NavigationCommand = new DelegateCommand<string>(Navigate); } private void Navigate(string uri) { regionManager.RequestNavigate("ContentRegion", new Uri(uri, UriKind.Relative), r => { if (r != null) ; //MessageBox.Show("Result: "+r.Result); else MessageBox.Show("Error: " + r.Error.Message); }); } public DelegateCommand<string> NavigationCommand { get; set; } } 设置为fs.s3a.aws.credentials.provider;这将是唯一使用过的

进一步阅读:Troubleshooting S3A