2017-01-19 4 views
0

Нашего сервера EC2 сконфигурирован для обеспечения доступа к my-bucket при использовании DefaultAWSCredentialsProviderChain, поэтому следующий код, используя простой AWS SDK работает отлично:Записи в S3 с искры без доступа и секретных ключей

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

искра из 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 использовать сеть поставщиков учетных данных по умолчанию вместо того, чтобы полагаться на доступ и секретный ключ?

+0

Да, см. Мое решение здесь ... http://stackoverflow.com/a/43910762/1879686. – rdllopes

ответ

1

технически, выходной поток Hadoop s3a. Посмотрите на трассировку стека, чтобы узнать, кому делать файлы с ошибками:

И s3a поддерживает учетные данные экземпляра от Hadoop 2.7+, proof.

Если вы не можете подключиться, вам необходимо иметь 2,7 JAR на вашем CP вместе с точной версией AWS SDK (1.7.4, я помню).

У Spark есть одна небольшая особенность: если вы отправляете работу, и у вас есть AWS_ * env vars set, то она их подбирает, копирует их в качестве ключей fs.s3a, таким образом распространяя их на ваши системы.