Amazon AWS Hadoop- 如何在Map-Reduce程序中从S3下载文件

0

【以下的问题经过翻译处理】 我正在尝试创建一个非常简单的Map-Reduce程序,在Map任务的一部分中,它需要从S3中加载一个小文件(可以保存在本地内存中)。

在Map-Reduce中,任务是检查每行与该文件匹配,并生成一个特征向量(等等...)

我在设置方法中下载和访问此文件方面遇到了问题。 我认为问题出在传递凭证,但也可能出在我在设置函数中访问文件的方式上(我在下面放置了代码片段)。

在我的Map-Reduce日志中,我收到的错误是: “配置文件不能为空” 关于这一行:

AWSCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(new ProfileCredentialsProvider().getCredentials());

我尝试了许多其他方法,但没有进展,如果您有任何指导,那将是很棒的。 在我的主要(运行在我的本地计算机上)java文件中,我执行了以下操作:

AmazonElasticMapReduce mapReduce =AmazonElasticMapReduceClientBuilder.standard().withRegion("us-east-1").build();
HadoopJarStepConfig hadoopJarStep = new HadoopJarStepConfig()
                .withJar("MYPATH")  // 这应该是完整的Map-Reduce应用程序。
                .withMainClass("MYMAIN");
      

在MapReduce jar文件(在ec2任务上运行的那个)中,我定义了相关的任务和作业控制,并在Map类的设置函数中执行了以下操作:

AWSCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(new ProfileCredentialsProvider().getCredentials());
            AmazonS3 s3 = AmazonS3ClientBuilder.standard()
                    .withCredentials(credentialsProvider)
                    .withRegion("us-east-1")
                    .build();
            String S3Bucket = "MYBUCKET";  // the bucket where the file is located
            String S3Key = "MYKEY"; // the name of the file
            S3Object object = s3.getObject(new GetObjectRequest(S3Bucket, S3Key)); // bucket, key
            S3ObjectInputStream summaryInputStream = object.getObjectContent();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(summaryInputStream));

我还尝试在主文件中对我的凭据进行硬编码(在我的电脑上本地运行),如下所示:

String access_key = "aws_access_key_id=MYKEY";
        String secret_key = "aws_secret_access_key=MYSECRETKEY";

        BasicAWSCredentials creds = new BasicAWSCredentials(access_key, secret_key);
        AWSStaticCredentialsProvider awsCred = new AWSStaticCredentialsProvider(creds);
        AmazonElasticMapReduce mapReduce =               AmazonElasticMapReduceClientBuilder.standard().withRegion("us-east-1").withCredentials(awsCred).build();

也没有成功(我尝试从字符串中排除 “aws_access_key_id=” 和 “aws_secret_access_key=”)

谢谢!

profile picture
EXPERTE
gefragt vor 5 Monaten44 Aufrufe
1 Antwort
0

【以下的回答经过翻译处理】 你第一个问题似乎是与Java SDK V1的凭据问题有关。

此外-我建议您转移到V2:https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javav2

对于V1-只需尝试按照此代码示例创建存储桶,以便我们可以专注于您的凭据问题。

https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/java/example_code/s3/src/main/java/aws/example/s3/CreateBucket.java

我建议将您的凭据放在这里-正如文档中所讨论的那样:

默认凭据配置文件-通常位于~/.aws/credentials(位置因平台而异),许多AWS SDK和AWS CLI共享。 AWS Java SDK使用ProfileCredentialsProvider加载这些凭证。

然后,您可以像这样创建您的S3 Service客户端:

AmazonS3 s3 = AmazonS3ClientBuilder.standard() .withRegion(Regions.DEFAULT_REGION) .build();

我刚刚运行了此Java V1示例,并完美创建了一个桶。 请尝试此操作并回复发生了什么。

profile picture
EXPERTE
beantwortet vor 5 Monaten

Du bist nicht angemeldet. Anmelden um eine Antwort zu veröffentlichen.

Eine gute Antwort beantwortet die Frage klar, gibt konstruktives Feedback und fördert die berufliche Weiterentwicklung des Fragenstellers.

Richtlinien für die Beantwortung von Fragen