Я пытаюсь прочитать S3-ключ на стороне клиента ( KMS-CSE ), содержащий паркет отформатированные данные через AvroParquetReader , как следует
final Path path = new Path("s3a://" + bucket + "/" + key);
List<String> segmentJSONList = new ArrayList<>();
final Configuration config = new Configuration();
config.set("fs.s3a.aws.credentials.provider", "org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider");
config.set("fs.s3a.access.key", aws_access_key_id);
config.set("fs.s3a.secret.key", aws_secret_access_key);
config.set("fs.s3a.server-side-encryption-algorithm", "SSE-C");
config.set("fs.s3a.server-side-encryption.key", "4de895bd-d298-41e1-bbe4-226df01a8d5e");
config.set("fs.s3.cse.materialsDescription.enabled", "true");
ParquetReader<GenericRecord> parquetReader = AvroParquetReader
.builder(path)
.withConf(config)
.build();
Но происходит сбой, за исключением java.io.IOException: Could not read footer: java.lang.RuntimeException: s3a://<bucket>/sample_data_single_file/part-00000-3d8b0513-0222-4fee-bd28-07f7aed14a0d-c000.snappy.parquet is not a Parquet file. expected magic number at tail [80, 65, 82, 49] but found [47, 48, 67, -8]
По-моему, ему не удалось зашифровать данные.
Когда я глубоко погрузился, я понял, что S3ClientFactory создает экземпляр AmazonS3Client, который не поддерживает зашифрованный ключ K3 S3 Key.
/ org / apache / hadoop / fs / s3a / S3ClientFactory.class
private static AmazonS3 createAmazonS3Client(Configuration conf, AWSCredentialsProvider credentials, ClientConfiguration awsConf) throws IllegalArgumentException {
AmazonS3 s3 = new AmazonS3Client(credentials, awsConf);
String endPoint = conf.getTrimmed("fs.s3a.endpoint", "");
if (!endPoint.isEmpty()) {
try {
s3.setEndpoint(endPoint);
} catch (IllegalArgumentException var7) {
String msg = "Incorrect endpoint: " + var7.getMessage();
LOG.error(msg);
throw new IllegalArgumentException(msg, var7);
}
}
enablePathStyleAccessIfRequired(s3, conf);
return s3;
}
Я также прочитал документацию hadoop-aws и, очевидно, они поддерживают клиентскую сторонуШифрование.
Просто чтобы подтвердить, что я действительно могу прочитать зашифрованные данные KMS, я попытался прочитать файл S3 и передать незашифрованные данные в AvroParquetReader, и, похоже, он работает