Как создать файл партера с большим объемом данных с использованием Java и загрузить его в AWS S3 Bucket - PullRequest
0 голосов
/ 08 ноября 2019

Я использую настройки, как описано на странице: Как сгенерировать файл паркета с использованием чистой Java (включая даты и десятичные типы) и загрузить на S3 [Windows] (без HDFS)

    public void writeToParquet(List<GenericData.Record> recordsToWrite, String fileToWrite) throws IOException {
     Configuration conf = new Configuration();
       conf.set("fs.s3.awsAccessKeyId", "<access_key>");
       conf.set("fs.s3.awsSecretAccessKey", "<secret_key>");

    Path path = new Path(filePath);//filePath = "s3://bucket/folder/data.parquet"
       try (ParquetWriter<GenericData.Record> writer = AvroParquetWriter
               .<GenericData.Record>builder(path)
               .withSchema(avroSchema)
               .withConf(conf).withRowGroupSize(16 * 1024 * 1024).withPageSize(4 * 1024 * 1024) 
               .build()) {
           for (GenericData.Record record : recordsToWrite) {
               writer.write(record);
           }

           writer.close();
       }
       catch(Exception ex) {
        ex.printStackTrace();
        LOGGER.info("ParquetWriter Exception " + ex);
       }
   }

с такой же версией библиотек, как упомянуто @Sal выше. Когда я использую небольшой файл, имеющий около 5 записей, все они преобразуются нормально, но у меня большой кусок записей около 800 КБ (размер исходного файла 5 ГБ +). Мне нужно преобразовать их в паркет.

Проблема 1: Когда я пытаюсь сохранить его на локальном диске и явно загружать его, вряд ли получится 10 записей с размером выходного файла примерно 5 МБ.

Проблема 2: когда я пытаюсь загрузить его непосредственно в S3, как упомянуто выше, я сталкиваюсь с проблемой проводной связи, я всегда получаю исключение после первого запуска

java.io.IOException: File already exists: s3://mybucket/output/folder/path/myfile.parquet

Но интересно, что файл не присутствует / не виден по этому пути, все же этоошибка.

Проблема 3: Столкновение ниже исключения

java.lang.NoSuchFieldError: workaroundNonThreadSafePasswdCalls
    at org.apache.hadoop.io.nativeio.NativeIO.initNative(Native Method)
    at org.apache.hadoop.io.nativeio.NativeIO.<clinit>(NativeIO.java:89)
    at org.apache.hadoop.fs.FileUtil.setPermission(FileUtil.java:655)
    at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:514)
    at org.apache.hadoop.fs.FilterFileSystem.setPermission(FilterFileSystem.java:290)
    at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:385)
    at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:364)
    at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:555)
    at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:536)
    at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:443)
    at org.apache.parquet.hadoop.ParquetFileWriter.<init>(ParquetFileWriter.java:244)
    at org.apache.parquet.hadoop.ParquetWriter.<init>(ParquetWriter.java:273)
    at org.apache.parquet.hadoop.ParquetWriter$Builder.build(ParquetWriter.java:494)

Пожалуйста, помогите Спасибо заранее

...