Как настроить доступ S3 для org.apache.parquet.avro.AvroParquetReader? - PullRequest
0 голосов
/ 04 февраля 2019

Я некоторое время боролся с этим и хотел поделиться своим решением.AvroParquetReader - прекрасный инструмент для чтения Parquet, но его настройки по умолчанию для доступа S3 слабые:

java.io.InterruptedIOException: doesBucketExist on MY_BUCKET: com.amazonaws.AmazonClientException: No AWS Credentials provided by BasicAWSCredentialsProvider EnvironmentVariableCredentialsProvider SharedInstanceProfileCredentialsProvider : com.amazonaws.AmazonClientException: Unable to load credentials from service endpoint

Я хочу использовать провайдеры учетных данных, схожие с теми, которые используются com.amazonaws.auth.profile.ProfileCredentialsProvider, который работаетдля доступа к моей корзине S3, но из определения или документации класса AvroParquetReader не ясно, как мне этого добиться.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Для всех, кто испытывал проблемы с этим, я обнаружил, что ответ @jd_free не работает для меня.Единственное, что мне нужно было изменить, чтобы это работало, - это параметры конфигурации, переданные в AvroParquetReader относительно типа AWSCredentialsProvider, используемого:

Configuration configuration = new Configuration();
        configuration.set("fs.s3a.aws.credentials.provider", "org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider");
        configuration.set("fs.s3a.access.key", "KEY");
        configuration.set("fs.s3a.secret.key", "KEY");`

Проблема заключалась в том, что предоставлен поставщик учетных данных и как онбыла дана конфигурация.Для получения дополнительной информации о различных поставщиках учетных данных вы можете проверить на этой странице .В нем объясняются различные виды, которые вы можете использовать для различных сценариев, включая способы получения учетных данных из переменных среды.

0 голосов
/ 04 февраля 2019

Этот код работал для меня.Это позволило AvroParquetReader получить доступ к S3 с помощью ProfileCredentialsProvider.

import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import org.apache.parquet.avro.AvroParquetReader;
import org.apache.parquet.hadoop.ParquetReader;
import org.apache.hadoop.fs.Path;
import org.apache.avro.generic.GenericRecord;
import org.apache.hadoop.conf.Configuration;

...

final String path = "s3a://"+bucketName+"/"+pathName;
final Configuration configuration = new Configuration();
configuration.setClass("fs.s3a.aws.credentials.provider", ProfileCredentialsProvider.class,
        AWSCredentialsProvider.class);
ParquetReader<GenericRecord> parquetReader =
        AvroParquetReader.<GenericRecord>builder(new Path(path)).withConf(configuration).build();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...