Как прочитать зашифрованный файл S3 KMS-CSE через AvroParquetReader - PullRequest
0 голосов
/ 27 октября 2019

Я пытаюсь прочитать 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, и, похоже, он работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...