s3 имел oop ошибка: NoSuchMethodError: org. apache .had oop .metrics2.lib.MetricsRegistry.newCounter - PullRequest
1 голос
/ 15 апреля 2020

Я создал учетные данные, такие как:

    Configuration conf = new Configuration();
    conf.set("fs.s3a.impl", org.apache.hadoop.fs.s3a.S3AFileSystem.class.getName());
    conf.set("fs.s3a.access.key", "ACCESS_ID");
    conf.set("fs.s3a.secret.key", "SECRET VALUE");
    conf.set("fs.s3a.endpoint", "s3.us-east-1.amazonaws.com");
    conf.set("fs.s3a.aws.credentials.provider", SimpleAWSCredentialsProvider.NAME);
    conf.set("fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class.getName());

и путь

 Path path = new Path("s3a://<backet>/<directory>/my.parquet");

При попытке записать данные паркета:

   try (ParquetWriter<GenericData.Record> writer = AvroParquetWriter.<GenericData.Record>builder(path)
                .withSchema(avroSchema)
                .withConf(conf)
                .withCompressionCodec(SNAPPY)
                .withWriteMode(OVERWRITE)
                .build()) 

И произошла следующая ошибка:

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.hadoop.metrics2.lib.MetricsRegistry.newCounter(Ljava/lang/String;Ljava/lang/String;J)Lorg/apache/hadoop/metrics2/lib/MutableCounterLong;
at org.apache.hadoop.fs.s3a.S3AInstrumentation.counter(S3AInstrumentation.java:183)
at org.apache.hadoop.fs.s3a.S3AInstrumentation.counter(S3AInstrumentation.java:206)
at org.apache.hadoop.fs.s3a.S3AInstrumentation.<init>(S3AInstrumentation.java:160)
at org.apache.hadoop.fs.s3a.S3AFileSystem.initialize(S3AFileSystem.java:174)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:1446)
at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:67)
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:1464)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:263)
at org.apache.hadoop.fs.Path.getFileSystem(Path.java:187)
at org.apache.parquet.hadoop.ParquetFileWriter.<init>(ParquetFileWriter.java:209)
at org.apache.parquet.hadoop.ParquetWriter.<init>(ParquetWriter.java:266)
at org.apache.parquet.hadoop.ParquetWriter$Builder.build(ParquetWriter.java:489)
at Main.main(Main.java:64)

Там мои зависимости:

org.apache.avro-1.8.2, org.apache.hadoop-hadoop-core-1.2.1, org.apache.parquet-parquet-hadoop-1.8.1, org.apache.parquet-parquet-avro -1.8.1, org.apache.hadoop-hadoop-hdfs-3.2.1, org.apache.hadoop-hadoop-aws -2.8.2

Вы знаете, как решить эту проблему?

1 Ответ

0 голосов
/ 15 апреля 2020
Exception in thread "main" java.lang.NoSuchMethodError: org.apache.hadoop.metrics2.lib.MetricsRegistry.newCounter(Ljava/lang/String;Ljava/lang/String;J)Lorg/apache/hadoop/metrics2/lib/MutableCounterLong;

Класс MetricsRegistry является частью библиотеки hadoop-common. Вы пропустили это из списка зависимостей. Убедитесь, что версия этого jar совпадает с версией hadoop-aws jar.

Также рекомендуется иметь одинаковую версию для всех jar зависимостей oop.

Обновление:

Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z

Вы пытаетесь использовать библиотеки Had oop для записи в S3. В этом случае oop попытается использовать локальную файловую систему для создания временных файлов. Это операционная система Windows, вам понадобится winutils.

  1. Загрузите двоичные файлы winutils.exe и другие необходимые файлы в соответствии с вашей версией oop с здесь .
  2. Установите переменную среды %HADOOP_HOME%, чтобы указать каталог, в котором были установлены эти двоичные файлы.

Подробнее: Hadoop2 - Windows Проблемы

...