当前位置: 首页 > 知识库问答 >
问题:

无法保存到S3并出现错误"java.io.IOException: No FileSystem for plan: s3a"

仲孙奇
2023-03-14

我尝试使用Java将一些测试数据从本地笔记本电脑保存到S3,出现以下错误:

org.apache.parquet.hadoop.IOException:无FileSystem方案:s3auilder.buildFileSriter.java:489FileSystem(FileSystem.java:1443)org.apache.hadoop.fs.FileSystem.access200美元(FileSystem.java:67)org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:1464)org.apache.hadoop.fs.FileSystem.get(FileSystem.java:263)org.apache.hadoop.fs.Path.getFileSystem(Path.java:187)org.apache.parquet.hadoop.ParquetFileWriter。(ParquetFileWriter.java:209)在org.apache.parquet.hadoop.ParquetWriter。(ParquetWriter.java:266)在java.io.ParquetWriter$Borg.apache.hadoop.fs.(ParquetWystem.create)

下面是我的代码

private void testSaveToS3(SysS3Configuration s3Configuration) {
            try {
                Schema avroSchema = TestDTO.getClassSchema();
    
                Path path = new Path("s3a://" + s3Configuration.getBucketName()+"/test.parquet");
    
    
                Configuration config = new Configuration();
                config.set("fs.s3a.access.key", s3Configuration.getAccessKeyId());
                config.set("fs.s3a.secret.key", s3Configuration.getSecretKey());
    
                ParquetWriter writer = AvroParquetWriter.<GenericData.Record>builder(path)
                        .withSchema(avroSchema)
                        .withConf(config)
                        .withCompressionCodec(CompressionCodecName.SNAPPY)
                        .withWriteMode(ParquetFileWriter.Mode.OVERWRITE)
                        .build();
    
                List<TestDTO> list = new ArrayList<>();
                TestDTO l1 = new TestDTO();
                l1.setId(1);
                l1.setValue(11);
    
                TestDTO l2 = new TestDTO();
                l2.setId(2);
                l2.setValue(22);
    
                list.add(l1);
                list.add(l2);
    
                for (TestDTO d : list) {
                    final GenericRecord record = new GenericData.Record(avroSchema);
                    record.put("id", d.getId());
                    record.put("value", d.getValue());
                    writer.write(record);
                }
            
                writer.close();
    
            } catch (Exception e) {
            
                e.printStackTrace();
            }
        }

我在谷歌上搜索了一下,但没有找到答案。有什么想法吗?提前谢谢。

更新:

  1. 这是一个java应用程序,我的本地笔记本电脑没有安装Hadoop
compile 'com.amazonaws:aws-java-sdk:1.11.747'
compile 'org.apache.parquet:parquet-avro:1.8.1'
compile 'org.apache.hadoop:hadoop-aws:3.3.0'

更新:我按照建议将hadoop-aws版本更改为3.3.0,但仍然得到相同的错误

java.io.IOException: No FileSystem for scheme: s3a
    at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2421)
    at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2428)
......

然后我尝试将路径字符串中的“s3a://”更改为“s3n://”。现在,我得到了一个不同的错误

java.io.IOException: The s3n:// client to Amazon S3 is no longer available: please migrate to the s3a:// client
    at org.apache.hadoop.fs.s3native.NativeS3FileSystem.initialize(NativeS3FileSystem.java:82)
    at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2433)

......

有什么想法吗?伙计们。

共有2个答案

诸腾
2023-03-14

在配置中添加这个对我很有用。

conf.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem");

我在构建中的依赖项。gradle从s3读取拼花地板文件

compile 'org.slf4j:slf4j-api:1.7.5'
compile 'org.slf4j:slf4j-log4j12:1.7.5'
compile 'org.apache.parquet:parquet-avro:1.12.0'
compile 'org.apache.avro:avro:1.10.2'
compile 'com.google.guava:guava:11.0.2'
compile 'org.apache.hadoop:hadoop-client:2.4.0'
compile 'org.apache.hadoop:hadoop-aws:3.3.0'   
compile 'org.apache.hadoop:hadoop-common:3.3.0'      
compile 'com.amazonaws:aws-java-sdk-core:1.11.563'
compile 'com.amazonaws:aws-java-sdk-s3:1.11.563'

如果您有一些带有日期和字节[]的数据,您还需要将其添加到配置中

conf.setBoolean(org.apache.parquet.avro.AvroReadSupport.READ_INT96_AS_FIXED, true);
经和歌
2023-03-14

首先要检查的是依赖关系,s3文件系统实现是在一个独立于hadoop其余部分的工件中。例如,在gradle语法中:

api("org.apache.hadoop:hadoop-aws:$hadoopVersion")

更新:由于您添加了依赖项,hadoop版本1.2.1非常旧,截至2020年8月的当前版本为3.3.0。在旧版本中,您可能可以使用带有s3://s3n://前缀的s3,但您应该真正更新,因为较新的s3a实现包含很多改进。

 类似资料:
  • 我试图将一些测试数据从我的本地笔记本电脑上用Java保存到S3上,得到以下错误: 下面是我的代码 我搜索了一下,但没有得到答案。有什么想法吗?提前道谢。 更新: null

  • 我需要使用Powershell脚本将文件从PC上传到S3 bucket。我得到错误:“无法找到类型[Amazon.AWSClientFactory]”试图附加到AWS S3。我安装了AWS Powershell的东西。我在蓝色的AWS Powershell窗口中。 $Client=[Amazon.AWSClientFactory]::CreateAmazons3Client($AccessKeyI

  • 输出给我抛出了这个错误: 我已经尝试按照OWL API示例中的说明进行保存,所以我不知道我的错误在哪里。 这是我用来保存本体的代码: 和getPatient的代码

  • 问题内容: 使用在Windows 8上使用Python 2.7给我的错误: 问题: 如何解决错误?运行给出了同样的错误… 问题答案: 您可以改用ol’good 。 不是pip,而是它的一个好方面是也能够下载和安装二进制程序包,这使您无需准备VC ++。当然,这取决于二进制文件是为您的Python版本准备的。 更新: 是的,Pip现在可以安装二进制文件! 有一种新的二进制Python存档格式(whe

  • 我正在尝试将一个文件从java类上载到aws S3。 我使用的是这里给出的精确代码 我只更改了以下部分: 我不确定要在提供密钥中添加什么。但即使这样,我也会得到这样一个错误: 错误消息:存储桶在此区域中:null。请使用此区域重试请求(服务:Amazon S3;状态代码:301;错误代码:PermanentReDirect;请求ID: *******) HTTP状态代码:301 AWS错误代码:P

  • 问题内容: 我有一个熊猫DataFrame,我想上传到新的CSV文件。问题是在将文件传输到s3之前,我不想在本地保存文件。是否有像to_csv这样的方法可以将数据帧直接写入s3?我正在使用boto3。 这是我到目前为止的内容: 问题答案: 您可以使用: