接口 BulkDelete

BulkDelete 接口提供了在对象存储或文件系统中执行批量删除文件/对象的API。

主要特性

  • 一个用于提交待删除路径列表的API接口。
  • 此列表的大小不得超过客户端支持的“页面大小”;该大小也作为一个方法公开。
  • 此列表不得包含任何超出基础路径的路径。
  • 触发删除指定路径文件的请求。
  • 返回存储报告为删除失败的路径列表。
  • 不将不存在的文件视为失败。
  • 不提供任何原子性保证。
  • 幂等性保证较弱:重试操作可能会删除其他客户端新创建的文件。
  • 如果路径引用的是目录,则无法保证结果。
  • 不保证调用后父目录仍然存在。

该API的设计旨在匹配AWS S3 Bulk Delete REST API调用的语义,但并不局限于该存储服务。这就是为什么"不提供保证"的限制条款未说明在其他存储服务上执行时的结果。

接口 org.apache.hadoop.fs.BulkDeleteSource

接口BulkDeleteSource由支持该API的FileSystem/FileContext类提供。默认实现在基础FileSystem类中实现,返回一个org.apache.hadoop.fs.impl.DefaultBulkDeleteOperation实例。默认实现细节将在以下部分提供。

@InterfaceAudience.Public
@InterfaceStability.Unstable
public interface BulkDeleteSource {
  BulkDelete createBulkDelete(Path path)
      throws UnsupportedOperationException, IllegalArgumentException, IOException;

}

接口 org.apache.hadoop.fs.BulkDelete

这是通过createBulkDelete()调用返回的批量删除实现。

@InterfaceAudience.Public
@InterfaceStability.Unstable
public interface BulkDelete extends IOStatisticsSource, Closeable {
  int pageSize();
  Path basePath();
  List<Map.Entry<Path, String>> bulkDelete(List<Path> paths)
      throws IOException, IllegalArgumentException;

}

bulkDelete(paths)

前提条件

if length(paths) > pageSize: throw IllegalArgumentException

后置条件

所有引用文件的路径都已从文件集中移除。

FS'Files = FS.Files - [paths]

对结果没有其他限制。

可用性

BulkDeleteSource接口由FileSystemFileContext存储客户端导出,该接口通过org.apache.hadoop.fs.impl.DefaultBulkDeleteSource对所有文件系统可用。为了在Apache Iceberg等应用中实现无缝集成,该接口的所有实现不得拒绝请求,而应返回大小>=1的BulkDelete实例。

使用PathCapabilities探测fs.capability.bulk.delete

store.hasPathCapability(path, "fs.capability.bulk.delete")

通过反射调用。

许多库需要针对非常旧版本的Hadoop进行编译,这意味着大多数云优先的文件系统API调用只能通过反射来使用——而且API及其数据类型越复杂,实现这种反射就越困难。

为了辅助这一点,类org.apache.hadoop.io.wrappedio.WrappedIO提供了一些方法,旨在简化API的访问,特别是通过反射方式。

  public static int bulkDeletePageSize(FileSystem fs, Path path) throws IOException;

  public static int bulkDeletePageSize(FileSystem fs, Path path) throws IOException;

  public static List<Map.Entry<Path, String>> bulkDelete(FileSystem fs, Path base, Collection<Path> paths);

实现

默认实现

所有实现BulkDelete接口的FileSystem将使用的默认实现是org.apache.hadoop.fs.impl.DefaultBulkDeleteOperation,该实现将页面大小固定为1,并对列表中的单个路径调用FileSystem.delete(path, false)

S3A 实现

S3A实现是org.apache.hadoop.fs.s3a.impl.BulkDeleteOperation,它实现了AWS S3 APIBulk Delete的多对象删除语义。更多详情请参阅S3A性能文档。