【问题标题】:Write to S3 from Spark without access and secret keys从 Spark 写入 S3,无需访问权限和密钥
【发布时间】:2017-01-19 09:09:33
【问题描述】:

我们的 EC2 服务器配置为允许在使用 DefaultAWSCredentialsProviderChain 时访问 my-bucket,因此使用普通 AWS SDK 的以下代码可以正常工作:

AmazonS3 s3client = new AmazonS3Client(new DefaultAWSCredentialsProviderChain());
s3client.putObject(new PutObjectRequest("my-bucket", "my-object", "/path/to/my-file.txt"));

Spark 的 S3AOutputStream 在内部使用相同的 SDK,但是尝试在不提供访问权限和密钥的情况下上传文件是行不通的:

sc.hadoopConfiguration().set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem");
// not setting access and secret key
JavaRDD<String> rdd = sc.parallelize(Arrays.asList("hello", "stackoverflow"));
rdd.saveAsTextFile("s3a://my-bucket/my-file-txt");

给予:

Exception in thread "main" com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 403, AWS Service: Amazon S3, AWS Request ID: 25DF243A166206A0, AWS Error Code: null, AWS Error Message: Forbidden, S3 Extended Request ID: Ki5SP11xQEMKb0m0UZNXb4FhfWLMdbehbknQ+jeZuO/wjhwurjkFoEYVfrQfW1KIq435Lo9jPkw=  
    at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:798)  
    at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:421)  
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:232)
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3528)
    at com.amazonaws.services.s3.AmazonS3Client.getObjectMetadata(AmazonS3Client.java:976)  
    at com.amazonaws.services.s3.AmazonS3Client.getObjectMetadata(AmazonS3Client.java:956)  
    at org.apache.hadoop.fs.s3a.S3AFileSystem.getFileStatus(S3AFileSystem.java:892)
    at org.apache.hadoop.fs.s3a.S3AFileSystem.getFileStatus(S3AFileSystem.java:77)
    at org.apache.hadoop.fs.FileSystem.exists(FileSystem.java:1426)
    at org.apache.hadoop.mapred.FileOutputFormat.checkOutputSpecs(FileOutputFormat.java:130)
    <truncated>

有没有办法强制 Spark 使用默认凭据提供程序链,而不是依赖访问和密钥?

【问题讨论】:

标签: apache-spark amazon-s3 amazon-ec2 permissions


【解决方案1】:

从技术上讲,Hadoop 的 s3a 输出流。查看堆栈跟踪以查看向谁提交错误报告:)

而且 s3a 确实支持来自 Hadoop 2.7+ 的实例凭据,proof

如果无法连接,则需要在 CP 上安装 2.7 JAR,并使用 AWS SDK 的确切版本(我记得是 1.7.4)。

Spark 有一个小功能:如果您提交工作并且设置了 AWS_* 环境变量,那么它会拾取它们,将它们作为 fs.s3a 密钥复制,然后将它们传播到您的系统。

【讨论】:

    猜你喜欢
    • 2019-04-22
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 2015-12-09
    • 2012-03-05
    • 2023-01-25
    相关资源
    最近更新 更多