首页 > 解决方案 > 我收到错误 java.io.FileNotFoundException:S3 存储桶中没有此类文件或目录,正在尝试从 AWS EMR 集群访问它

问题描述

我正在开发一个使用 Hadoop Map Reduce 框架的独立 Java 应用程序。我在 AWS EMR 集群上运行此应用程序,并且输入文件存在于 S3 存储桶中。我很久没有遇到这个问题,但突然我收到了以下错误。

Error: java.io.FileNotFoundException: No such file or directory <S3_Bucket_Path>

当我检查时,这些文件存在于特定的 S3 存储桶文件夹中。如果文件已经存在,为什么这会给出 FileNotFoundException。

我正在使用下面的代码列出 S3 存储桶中存在的所有对象,并将这些 S3 对象的完整路径存储到List<String> inputFilesList

    List<S3ObjectBean> fullInputFilesS3ObjectBeanList = new ArrayList<>();
    ObjectListing objectListing = s3client.listObjects(S3_BUCKET, prefix);
List<S3ObjectSummary> objects = objectListing.getObjectSummaries();
    //To fetch more than 1000 files from AWS S3 bucket
    while(objectListing.isTruncated()) {
        objectListing = s3client.listNextBatchOfObjects(objectListing); 
        objects.addAll(objectListing.getObjectSummaries());
    }

获得 inputFiles 列表后,我将这些内容提供给 Hadoop MapReduce 应用程序中的映射器。代码如下。

private void setMapper(Job job, Class<? extends Mapper<Object, Text, Text, Text>> mapperClass, List<String> inputFilesList) {
    for (String inputFile : inputFilesList) { 
        MultipleInputs.addInputPath(job, new Path(inputFile), TextInputFormat.class, mapperClass);
    } 
}

变量 List inputFilesList 包含数据文件完整路径 S3 对象,例如“s3://bucket_name/folder/fileName1.txt”、“s3://bucket_name/folder/fileName2.txt”

标签: javaamazon-s3amazon-emrhadoop2filenotfoundexception

解决方案


推荐阅读