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()
,客户端可以指定文件系统特定参数,而无需检查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)
为新块设置首选DataNodes。
FSDataOutputStreamBuilder syncBlock()
强制将已关闭的块写入磁盘设备。参见 CreateFlag#SYNC_BLOCK
FSDataOutputStreamBuilder lazyPersist()
如果可能,在临时存储上创建块。
FSDataOutputStreamBuilder newBlock()
将数据追加到新块而非最后一个不完整块的末尾。
FSDataOutputStreamBuilder noLocalWrite()
建议不要将块副本写入本地DataNode。
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 |
boolean |
create a file with maximum performance |
fs.s3a.create.header |
string |
prefix for user supplied headers |
fs.s3a.create.performance
优先考虑文件创建性能,而非文件系统一致性的安全检查。
此操作:1. 跳过LIST
调用(该调用用于确保在目录上创建文件)。风险:可能在目录上创建文件。2. 忽略覆盖标志。3. 从不发出DELETE
调用来删除父目录标记。
可以通过hasPathCapability(path, "fs.s3a.create.performance")
检查来探测S3A文件系统实例是否具备此功能。
使用此选项在现有目录上创建文件可能会导致S3A文件系统客户端行为不一致。
针对目录优化的操作(如列表调用)可能会看到目录树而非文件;针对文件优化的操作(getFileStatus()
、isFile()
)更可能看到文件。不一致性的具体表现形式,以及哪些操作/参数会触发这种情况均未明确定义,甚至可能在次要版本更新间发生变化。
使用此选项相当于在一辆后轮驱动汽车上按住“电子稳定控制”按钮五秒钟:安全检测将被关闭。如果驾驶者清楚自己在做什么,速度会更快。但如果他们不清楚,长按按钮这一事实将在调查中被用作证据,证明他们是有意识地选择了速度而非安全,因此后果自负。
注意:该选项可以针对整个文件系统进行设置。再次强调,安全检查的目的是更贴近传统文件系统的语义,并降低对象存储最终进入与经典目录+树结构差异过大而导致应用程序混淆的状态的可能性。
因此:仅当您确信满足条件时才使用。
fs.s3a.create.header
用户自定义头部支持带有前缀fs.s3a.create.header.
的选项将作为"用户自定义元数据"添加到S3对象元数据中。该元数据对所有应用程序可见。也可以通过FileSystem/FileContext的listXAttrs()
和getXAttrs()
API调用,使用前缀header.
来检索这些元数据。
当对象被重命名时,元数据会传播到创建的副本中。
可以通过hasPathCapability(path, "fs.s3a.create.header")
检查来探测S3A文件系统实例是否具备此功能。