我为此苦了一段时间,想分享我的解决方案。 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>
答案 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。它说明了可用于不同方案的不同种类,包括如何从环境变量中获取凭据。