使用AWS re:Post即您表示您同意 AWS re:Post 使用条款

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
专家
已提问 1 年前64 查看次数
1 回答
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
专家
已回答 1 年前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则