FileSystem.openFile()
/FileContext.openFile()
这是由 FileSystem 和 FileContext 提供的一种方法,用于高级文件打开选项,并在实现时异步/延迟打开文件。
创建一个生成器来打开一个文件,支持标准和特定于文件系统的选项。build()
调用的返回值是 Future<FSDataInputStream>
,必须等待它。文件打开可能是异步的,并且实际上可能会被推迟(包括权限/存在检查),直到实际执行读取操作。
此 API 调用已添加到 Hadoop 3.3.0 中的 FileSystem
和 FileContext
;它在 Hadoop 3.3.1 中进行了如下调整。
opt(key, long)
和 must(key, long)
。withFileStatus(null)
。withFileStatus(status)
仅检查路径的文件名,而不是完整路径。这是为了支持直通/挂载文件系统。FutureDataInputStreamBuilder openFile(Path path)
创建一个 FutureDataInputStreamBuilder
来构造一个操作,用于打开 path
处的文件以进行读取。
当对返回的 FutureDataInputStreamBuilder
实例调用 build()
时,将验证生成器参数并调用 FileSystem.openFileWithOptions(Path, OpenFileParameters)
或 AbstractFileSystem.openFileWithOptions(Path, OpenFileParameters)
。
这些受保护的方法返回一个 CompletableFuture<FSDataInputStream>
,当调用其 get()
方法时,返回打开的文件内容的输入流或引发异常。
FileSystem.openFileWithOptions(PathHandle, OpenFileParameters)
的基本实现最终调用 FileSystem.open(Path, int)
。
因此,链 FileSystem.openFile(path).build().get()
具有与 FileSystem.open(Path p, int bufferSize)
相同的先决条件和后置条件
但是,有一个区别,实现可以自由利用
返回的流可能会实现延迟打开,其中文件不存在或访问权限失败可能直到实际数据的第一次 read()
时才浮出水面。
这节省了对象存储上的网络 IO。
openFile()
操作可能会在其调用期间检查文件系统的状态,但由于文件系统的状态可能在此调用和实际 build()
和 get()
操作之间发生变化,因此此文件特定的先决条件(文件存在、文件可读等)不能在此处检查。
未实现 open(Path, int)
的文件系统实现可能会推迟引发 UnsupportedOperationException
,直到 FutureDataInputStreamBuilder.build()
或后续 get()
调用,否则它们可能会在 openFile()
调用中快速失败。
查阅 FutureDataInputStreamBuilder
了解有关如何使用构建器以及可以传入的标准选项的详细信息。
FutureDataInputStreamBuilder openFile(PathHandle)
创建 FutureDataInputStreamBuilder
以构造一个操作,用于打开由给定的 PathHandle
标识的文件以进行读取。
如果由文件系统实现,则 openFile(Path)
的语义因此,链 openFile(pathhandle).build().get()
具有与 open(Pathhandle, int)
相同的先决条件和后置条件
未实现 open(PathHandle handle, int bufferSize)
的文件系统实现可能会推迟引发 UnsupportedOperationException
,直到 FutureDataInputStreamBuilder.build()
或后续 get()
调用,否则它们可能会在 openFile(PathHandle)
调用中快速失败。
基本实现会在 build()
操作中引发此异常;其他实现应该复制此异常。
openFileWithOptions()
的基本实现实际上同步执行 open(path)
操作,但仍会将结果或任何故障返回到 CompletableFuture<>
中,以便为所有文件系统提供一致的生命周期。
任何打开文件可能需要大量时间的的文件系统客户端都应通过在某些执行程序/线程池中提交操作来异步执行该操作。这对于对象存储和其他可能通过长途连接访问的文件系统尤其推荐。
可能支持任意特定于文件系统的选项;这些选项必须以文件系统架构为前缀,例如 hdfs.
或采用 fs.SCHEMA
格式作为常规配置设置 fs.hdfs
。后一种样式允许将相同的配置选项用于文件系统配置和特定于文件配置。
应始终可以打开文件而不指定任何选项,以便向用户展示一致的模型。但是,实现可能选择要求设置一个或多个强制选项。
返回的流可以对文件访问执行“惰性”评估。这与对象存储相关,其中存在探测非常昂贵,并且即使异步打开,也可能被认为是不必要的。