1

我有类似的代码

ParquetWriter<Record> writer = getParquetWriter("s3a://my_bucket/my_object_path.snappy.parquet");
for (Record r : someIterable) {
   validate(r);
   writer.write()
}
writer.close();

如果validate抛出异常,我想释放与作者关联的所有资源。但在这种情况下,我不想在 S3 中创建任何对象。这是可以实现的吗?

如果我关闭编写器,它将结束 s3 分段上传并在云中创建一个对象。如果我不关闭它,到目前为止写入的部分将保留在磁盘缓冲区中,从而阻塞工作。

4

1 回答 1

0

是的,这是一个问题。它已在HADOOP-16906中进行了讨论, 为流等添加了一些 Abortable.abort() 接口,这些接口可以被终止

这里的问题是添加到类中是不够的S3ABlockOutputStream,我们需要通过 FSDataOutputStream 等传递它,在 FS API 中指定它,如果传递不起作用,则定义语义,承诺维护它等等。很多努力。如果您确实想这样做,欢迎使用补丁...

密切关注HDFS-13934,分段上传 API。这将让您进行上传,然后提交/中止它。不太适合您的工作流程。

恐怕您将不得不进行上传。请记住为存储桶设置生命周期规则以删除旧上传,并查看hadoop s3guard uploads列出/中止它们的命令。

于 2020-06-24T11:40:15.500 回答