org.apache.hadoop.fs.FSDataOutputStreamBuilderFSDataOutputStream 及其子类的生成器模式。用于在 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() 设置的参数之间的冲突的行为如下
指定的最后一个选项定义值及其可选/强制状态。
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 连接器支持的自定义选项。
| 名称 | 类型 | 含义 |
|---|---|---|
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 文件系统实例的此功能。