我有这样的代码
ParquetWriter<Record> writer = getParquetWriter("s3a://my_bucket/my_object_path.snappy.parquet");
for (Record r : someIterable) {
validate(r);
writer.write()
}
writer.close();
如果 validate
抛出异常,我要释放与编写器关联的所有资源。但在这种情况下,我不想在s3中创建任何对象。这是可以实现的吗?
如果我关闭writer,它将结束s3多部分上传并在云中创建一个对象。如果我不关闭它,到目前为止写的部分将留在磁盘缓冲区中,阻塞了工作。
1条答案
按热度按时间b0zn9rqh1#
是的,这是个问题。hadoop-16906中已经讨论过,为可以终止的流等添加一些abortable.abort()接口
问题是这还不足以增加
S3ABlockOutputStream
类,我们需要通过fsdataoutputstream等传递它,在fs api中指定它,如果传递不起作用,则定义语义,承诺维护它等等,需要付出很多努力。如果你真的想这么做,欢迎。。。关注hdfs-13934,多部分上传api。这将允许您执行上载,然后提交/中止它。不太适合你的工作流程。
恐怕你得去上传了。请记住为bucket设置一个生命周期规则来删除旧的上传,并查看
hadoop s3guard uploads
命令列出/中止它们。