org.apache.hadoop.fs.FSDataOutputStreamBuilder

FSDataOutputStream 及其子类的生成器模式。用于在 FileSystem 上创建新文件或打开现有文件以进行写入。

不变量

FSDataOutputStreamBuilder 接口不会验证参数,也不会在调用 build() 之前修改 FileSystem 的状态。

与实现无关的参数。

FSDataOutputStreamBuilder create()

指定 FSDataOutputStreamBuilder 以在 FileSystem 上创建文件,等效于 CreateFlag#CREATE

FSDataOutputStreamBuilder append()

指定 FSDataOutputStreamBuilder 以追加到 FileSystem 上的现有文件,等效于 CreateFlag#APPEND

FSDataOutputStreamBuilder overwrite(boolean overwrite)

指定 FSDataOutputStreamBuilder 是否覆盖现有文件。如果给出 overwrite==true,它将截断现有文件,等效于 CreateFlag#OVERWITE

FSDataOutputStreamBuilder permission(FsPermission permission)

设置文件的权限。

FSDataOutputStreamBuilder bufferSize(int bufSize)

设置要使用的缓冲区大小。

FSDataOutputStreamBuilder replication(short replica)

设置复制因子。

FSDataOutputStreamBuilder blockSize(long size)

设置块大小(以字节为单位)。

FSDataOutputStreamBuilder recursive()

如果父目录不存在,则创建父目录。

FSDataOutputStreamBuilder progress(Progresable prog)

设置报告进度的方式。

FSDataOutputStreamBuilder checksumOpt(ChecksumOpt chksumOpt)

设置校验和选项。

设置可选或强制参数

FSDataOutputStreamBuilder opt(String key, ...)
FSDataOutputStreamBuilder must(String key, ...)

向生成器设置可选或强制参数。使用 opt()must(),客户端可以指定特定 FS 参数,而无需检查 FileSystem 的具体类型。

// Don't
if (fs instanceof FooFileSystem) {
    FooFileSystem fs = (FooFileSystem) fs;
    out = dfs.createFile(path)
        .optionA()
        .optionB("value")
        .cache()
        .build()
} else if (fs instanceof BarFileSystem) {
    ...
}

// Do
out = fs.createFile(path)
    .permission(perm)
    .bufferSize(bufSize)
    .opt("foofs:option.a", true)
    .opt("foofs:option.b", "value")
    .opt("barfs:cache", true)
    .must("foofs:cache", true)
    .must("barfs:cache-size", 256 * 1024 * 1024)
    .build();

实现说明

具体的 FileSystem 和/或 FSDataOutputStreamBuilder 实现必须验证与实现无关的参数(即,“syncable”)或与实现相关的参数(即,“foofs:cache”)是否受支持。FileSystem将尽最大努力满足可选参数(通过opt(key, …))。如果FileSystem中无法满足强制参数(通过must(key, …)),则在build()` 中必须抛出 IllegalArgumentException

解决由生成器方法(即 bufferSize())和 opt()/must() 设置的参数之间的冲突的行为如下

指定的最后一个选项定义值及其可选/强制状态。

特定于 HDFS 的参数。

HdfsDataOutputStreamBuilder extends FSDataOutputStreamBuilder 提供了其他特定于 HDFS 的参数,用于进一步自定义文件创建/追加行为。

FSDataOutpuStreamBuilder favoredNodes(InetSocketAddress[] nodes)

为新块设置首选数据节点。

FSDataOutputStreamBuilder syncBlock()

强制将已关闭的块写入磁盘设备。请参阅 CreateFlag#SYNC_BLOCK

FSDataOutputStreamBuilder lazyPersist()

如果可能,在瞬态存储上创建块。

FSDataOutputStreamBuilder newBlock()

将数据追加到新块,而不是最后一个部分块的末尾。

FSDataOutputStreamBuilder noLocalWrite()

建议不要将块副本写入本地数据节点。

FSDataOutputStreamBuilder ecPolicyName()

强制文件成为具有擦除编码策略“policyName”的条带文件,无论其父目录的复制或擦除编码策略如何。

FSDataOutputStreamBuilder replicate()

强制文件成为复制文件,无论其父目录的复制或擦除编码策略如何。

生成器接口

FSDataOutputStream build()

在底层 FileSystem 上创建新文件或追加现有文件,并返回 FSDataOutputStream 以供写入。

前提条件

不支持以下参数组合

if APPEND|OVERWRITE: raise HadoopIllegalArgumentException
if CREATE|APPEND|OVERWRITE: raise HadoopIllegalArgumentExdeption

FileSystem 可能因其他原因拒绝请求并抛出 IOException,请参阅 FileSystem#create(path, ...)FileSystem#append()

后置条件

FS' where :
   FS'.Files'[p] == []
   ancestors(p) is-subset-of FS'.Directories'

result = FSDataOutputStream

结果为 FSDataOutputStream,用于将数据写入文件系统。

S3A 特定的选项

以下是 S3A 连接器支持的自定义选项。

名称 类型 含义
fs.s3a.create.performance 布尔值 以最高性能创建文件
fs.s3a.create.header 字符串 用户提供标头的前缀

fs.s3a.create.performance

将文件创建性能优先于文件系统一致性的安全检查。

此操作:1. 跳过 LIST 调用,该调用确保在目录上创建文件。风险:在目录上创建文件。1. 忽略覆盖标志。1. 绝不会发出 DELETE 调用来删除父目录标记。

可以通过 hasPathCapability(path, "fs.s3a.create.performance") 检查来探测 S3A 文件系统实例的此功能。

在现有目录上使用此选项创建文件可能会导致 S3A 文件系统客户端行为不一致。

针对目录优化的操作(例如列出调用)可能会看到目录树而不是文件;针对文件优化的操作(getFileStatus()isFile())更有可能看到文件。不一致的确切形式以及触发此操作的操作/参数是未定义的,甚至在小版本之间也可能发生变化。

使用此选项相当于在后轮驱动汽车上按住“电子稳定控制”按钮五秒钟:安全检查已关闭。如果驾驶员知道自己在做什么,事情会更快。如果他们不知道,他们按住按钮这一事实将在调查中作为证据,证明他们做出了有意识的决定,选择速度而不是安全,并且后果是他们自己的错。

因此:仅在您确信满足条件时使用。

fs.s3a.create.header 用户提供的标头支持

前缀为 fs.s3a.create.header. 的选项将作为“用户定义元数据”添加到 S3 对象元数据中。此元数据对所有应用程序可见。还可以通过带有前缀 header. 的 FileSystem/FileContext listXAttrs()getXAttrs() API 调用来检索它。

当对象被重命名时,元数据将传播到创建的副本。

可以通过 hasPathCapability(path, "fs.s3a.create.header") 检查来探测 S3A 文件系统实例的此功能。