【发布时间】:2020-06-09 11:42:39
【问题描述】:
我目前正在使用下面的代码通过 Avro 编写镶木地板。此代码将其写入文件系统,但我想写入 S3。
try {
StopWatch sw = StopWatch.createStarted();
Schema avroSchema = AvroSchemaBuilder.build("pojo", message.getTransformedMessage().get(0));
final String parquetFile = "parquet/data.parquet";
final Path path = new Path(parquetFile);
ParquetWriter writer = AvroParquetWriter.<GenericData.Record>builder(path)
.withSchema(avroSchema)
.withConf(new org.apache.hadoop.conf.Configuration())
.withCompressionCodec(CompressionCodecName.SNAPPY)
.withWriteMode(Mode.OVERWRITE)//probably not good for prod. (overwrites files).
.build();
for (Map<String, Object> row : message.getTransformedMessage()) {
StopWatch stopWatch = StopWatch.createStarted();
final GenericRecord record = new GenericData.Record(avroSchema);
row.forEach((k, v) -> {
record.put(k, v);
});
writer.write(record);
}
//todo: Write to S3. We should probably write via the AWS objects. This does not show that.
//https://stackoverflow.com/questions/47355038/how-to-generate-parquet-file-using-pure-java-including-date-decimal-types-an
writer.close();
System.out.println("Total Time: " + sw);
} catch (Exception e) {
//do somethign here. retryable? non-retryable? Wrap this excetion in one of these?
transformedParquetMessage.getOriginalMessage().getMetaData().addException(e);
}
这可以很好地写入文件,但是如何让它流式传输到 AmazonS3 api 中?我在网上找到了一些使用 Hadoop-aws jar 的代码,但这需要一些 Windows exe 文件才能工作,当然,我们希望避免这种情况。目前我只使用:
<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>org.apache.parquet</groupId>
<artifactId>parquet-avro</artifactId>
<version>1.8.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>1.2.1</version>
</dependency>
所以问题是,有没有办法拦截 AvroParquetWriter 上的输出流,以便我可以将其流式传输到 S3? 我想要这样做的主要原因是重试。 S3 最多自动重试 3 次。这对我们有很大帮助。
【问题讨论】:
-
在this 方式可能吗?尽管它使用了您想要避免的库/exe :( :)
-
是的,这很接近,但它依赖于服务器上运行的 Hadoop。
-
这恐怕不太可行。如果您查看source 类,您可以看到超类是 org.apache.parquet.hadoop.ParquetWriter,所以我会说(无需深入挖掘)配置的 hadoop 的存在是对此的要求.看来 Spark 可以是 better candidate for this。
-
感谢您的回复!我真的在努力克服两件事:对 hadoop 的外部依赖和 S3 依赖。如果 parquet 只是一种文件格式,为什么写出来这么难?!
-
您可以找到类似问题的一些答案here - 查看链接的 Jira 问题。
标签: java hadoop amazon-s3 avro parquet