如何为org.apache.parquet.avro.AvroParquetReader配置S3访问?

时间:2019-02-04 20:53:19

标签: java amazon-s3 parquet

我为此苦了一段时间,想分享我的解决方案。 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的类定义或文档中尚不清楚我如何实现此目的。 / p>

2 个答案:

答案 0 :(得分:1)

此代码对我有用。它允许AvroParquetReader使用ProfileCredentialsProvider访问S3。

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();

答案 1 :(得分:0)

对于其他遇到此问题的人,我发现@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");`

问题是给定的凭据提供程序及其配置的方式。有关不同证书提供者的更多信息,您可以使用签出this page。它说明了可用于不同方案的不同种类,包括如何从环境变量中获取凭据。