BulkDelete
BulkDelete
接口提供了在对象存储或文件系统中执行批量删除文件/对象的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
接口由FileSystem
和FileContext
存储客户端导出,该接口通过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实现是org.apache.hadoop.fs.s3a.impl.BulkDeleteOperation
,它实现了AWS S3 APIBulk Delete的多对象删除语义。更多详情请参阅S3A性能文档。