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()
设置的参数之间的冲突的行为如下
指定的最后一个选项定义值及其可选/强制状态。
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 文件系统实例的此功能。